将图像从活动传递到类android(动态壁纸)

问题描述 投票:1回答:1

我正在研究如何应用动态壁纸(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());

                }
            });

        }

    }

}

java android live-wallpaper
1个回答
0
投票

尝试使用DomainEventBus,它有助于在所有应用程序中传递对象,图像以及实际上任何数据类型。https://greenrobot.org/eventbus/

因此,您需要在创建服务时注册“事件总线”,它将能够从应用程序的任何组件接收图像。

© www.soinside.com 2019 - 2024. All rights reserved.