我正在研究如何应用动态壁纸(GIF图片)。当我单击“应用”按钮时,默认的gif图像设置为墙纸。我正在从Firebase获取所有图像。所以我想将该图像设置为墙纸。我不知道如何将gif图像从recyclerview传递到gif壁纸服务,以设置该gif图像而不是默认图像。 (对不起,我英语不好,希望您能理解)
这里是活动代码
public class LiveWallpaperActivity extends AppCompatActivity {
RecyclerView recyclerView;
private LiveAdapter adapter;
public static List<FeaturedModel> list = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_live_wallpaper);
DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference().child("Live Wallpapers");
recyclerView = findViewById(R.id.recycler_view);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new GridLayoutManager(this, 3));
adapter = new LiveAdapter(list);
recyclerView.setAdapter(adapter);
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
list.clear();
for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
List<String> sets = new ArrayList<>();
list.add(new FeaturedModel(dataSnapshot1.child("imageLink").getValue().toString()));
}
adapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d("LiveWallActivity", databaseError.getMessage());
finish();
}
});
}
}
实时取景活动和我用来应用gif图像的代码
public class LiveViewActivity extends AppCompatActivity {
ImageView imageView;
Button setLiveWallpaper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_live_view);
imageView = findViewById(R.id.viewImage);
Glide.with(this).load(getIntent().getStringExtra("images")).into(imageView);
setLiveWallpaper.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
applyLiveWallpaper();
}
});
}
private void applyLiveWallpaper() {
Intent intent = new Intent(
WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER);
intent.putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT,
new ComponentName(this, GIFWallpaperService.class));
startActivity(intent);
}
}
墙纸服务代码
我想将图像从recyclerview(在活动中)传递到此GIFWallpaperService类,以将该GIF图像用作墙纸
public class GIFWallpaperService extends WallpaperService {
@Override
public WallpaperService.Engine onCreateEngine() {
try {
Movie movie = Movie.decodeStream(getResources().getAssets().open("sea_gif.gif")); //Here is the default gif image
return new GIFWallpaperEngine(movie);
} catch (IOException e) {
Log.d("GIFWallpaperService", "Could not loaded live wallpaper");
return null;
}
}
private class GIFWallpaperEngine extends WallpaperService.Engine {
private final int frameDuration = 20;
private SurfaceHolder holder;
private Movie movie;
private boolean visible;
private Handler handler;
public GIFWallpaperEngine(Movie movie) {
this.movie = movie;
handler = new Handler();
}
@Override
public void onCreate(SurfaceHolder surfaceHolder) {
super.onCreate(surfaceHolder);
this.holder = surfaceHolder;
}
private Runnable drawGIF = new Runnable() {
@Override
public void run() {
draw();
}
};
private void draw() {
if (visible) {
Canvas canvas = holder.lockCanvas();
canvas.save();
canvas.scale(4f, 4f);
movie.draw(canvas, -100, 0);
canvas.restore();
holder.unlockCanvasAndPost(canvas);
movie.setTime((int) (System.currentTimeMillis() % movie.duration()));
handler.removeCallbacks(drawGIF);
handler.postDelayed(drawGIF, frameDuration);
}
}
@Override
public void onVisibilityChanged(boolean visible) {
//super.onVisibilityChanged(visible);
this.visible = visible;
if (visible) {
handler.post(drawGIF);
} else {
handler.removeCallbacks(drawGIF);
}
}
@Override
public void onDestroy() {
super.onDestroy();
handler.removeCallbacks(drawGIF);
}
}
}
LiveAdapter代码
public class LiveAdapter extends RecyclerView.Adapter<LiveAdapter.ViewHolder> {
private List<FeaturedModel> featuredModels;
public LiveAdapter(List<FeaturedModel> featuredModels) {
this.featuredModels = featuredModels;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.custom_image, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.setData(featuredModels.get(position).getImageLink(),position);
}
@Override
public int getItemCount() {
return featuredModels.size();
}
class ViewHolder extends RecyclerView.ViewHolder {
private ImageView imageView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.imageview);
}
private void setData(final String url, final int position){
Glide.with(itemView.getContext()).load(url).into(imageView);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent setIntent = new Intent(itemView.getContext(), LiveViewActivity.class);
//setIntent.putExtra("title", url);
setIntent.putExtra("images", featuredModels.get(getAdapterPosition()).getImageLink());
itemView.getContext().startActivity(setIntent);
Singleton a = Singleton.getInstance();
a.setPosition(getAdapterPosition());
}
});
}
}
}
尝试使用DomainEventBus,它有助于在所有应用程序中传递对象,图像以及实际上任何数据类型。https://greenrobot.org/eventbus/
因此,您需要在创建服务时注册“事件总线”,它将能够从应用程序的任何组件接收图像。