Как загрузить цветовую палитру в качестве фона карты, когда изображения загружаются в Android?

Я пытаюсь отобразить цвета на фоне карты перед загрузкой изображений, как в Pinterest. Цветовая палитра внедряется, но фон остается белым, а цвета отображаются только на долю секунды перед загрузкой изображения.

Я использую библиотеку Glide для загрузки изображений в cardView. Пожалуйста, помогите мне показать цвета, как только откроется какое-либо действие.

Я использую Android Palette Library для получения цветов из ImageView.

Here is my RecyclerView Adapter


public class CoffeeAdapter extends RecyclerView.Adapter<CoffeeAdapter.ViewHolder> implements Filterable{

    private static final String TAG = "RecyclerAdapter";

    private ArrayList<CoffeeItem> coffeeItems;
    ArrayList<CoffeeItem> coffeeItemsAll;
    private Context mContext;
    private FavDB favDB;
    private DownloadDB downloadDB;

    public CoffeeAdapter(ArrayList<CoffeeItem> coffeeItems, Context mContext) {
        this.coffeeItems = coffeeItems;
        this.coffeeItemsAll = new ArrayList<CoffeeItem>(coffeeItems);
        this.mContext = mContext;
        notifyDataSetChanged();

    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        favDB = new FavDB(mContext);
        downloadDB = new DownloadDB(mContext);
        //create table on first
        SharedPreferences prefs = mContext.getSharedPreferences("prefs", mContext.MODE_PRIVATE);
        boolean firstStart = prefs.getBoolean("firstStart", true);
        if (firstStart) {
            createTableOnFirstStart();
            createTableOnFirstStart1();
        }

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item,
                parent,false);
        return new ViewHolder(view);
    }


    @Override
    public void onBindViewHolder(@NonNull final CoffeeAdapter.ViewHolder holder, int position) {
        final CoffeeItem coffeeItem = coffeeItems.get(position);
        readCursorData(coffeeItem, holder);
        readCursorData1(coffeeItem, holder);

       // Glide.with(mContext).load(coffeeItems.get(position).getUrl()).into(holder.imageView);

        Glide.with(mContext)
                .asBitmap()
                .load(coffeeItems.get(position).getUrl())
                .thumbnail(0.05f)
                .apply(new RequestOptions().override(600,1200))
                .apply(new RequestOptions().diskCacheStrategy(DiskCacheStrategy.ALL))
                .listener(new RequestListener<Bitmap>() {
                    @Override
                    public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Bitmap> target, boolean isFirstResource) {
                        return false;
                    }

                    @Override
                    public boolean onResourceReady(Bitmap resource, Object model, Target<Bitmap> target, DataSource dataSource, boolean isFirstResource) {

                        Palette.from(resource)
                                .generate(new Palette.PaletteAsyncListener() {
                                    @Override
                                    public void onGenerated(@Nullable Palette palette) {
                                        Palette.Swatch darkVibrantSwatch = palette.getDarkVibrantSwatch();
                                        Palette.Swatch dominantSwatch = palette.getDominantSwatch();
                                        Palette.Swatch lightVibrantSwatch = palette.getLightVibrantSwatch();
                                        if (darkVibrantSwatch != null) {

                                            holder.cardView.setCardBackgroundColor(darkVibrantSwatch.getRgb());

                                        }else if (dominantSwatch != null) {

                                            holder.cardView.setCardBackgroundColor(dominantSwatch.getRgb());

                                        }else {

                                            holder.cardView.setCardBackgroundColor(lightVibrantSwatch.getRgb());

                                        }

                                    }
                                });

                        return false;
                    }
                })
                .into(holder.imageView);



        //Picasso.get().load(coffeeItems.get(position).getUrl()).resize(1080,1920).onlyScaleDown().into(holder.imageView);
        //holder.imageView.setImageResource(coffeeItem.getImageResourse());
        holder.titleTextView.setText(coffeeItem.getTitle());

        holder.cardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(mContext,ViewActivity.class);
                intent.putExtra("image",coffeeItem.getUrl());
                intent.putExtra("title",coffeeItem.getTitle());
                intent.putExtra("tag",coffeeItem.getTag());
                intent.putExtra("resolution", coffeeItem.getResolution());
                intent.putExtra("size",coffeeItem.getSize());
                intent.putExtra("desc",coffeeItem.getDescription());
                intent.putExtra("keyId",coffeeItem.getKey_id());
                intent.putExtra("favStatus",coffeeItem.getFavStatus());
                intent.putExtra("downloadStatus",coffeeItem.getDownloadStatus());

                mContext.startActivity(intent);
            }
        });
    }

Screenshots

Вот мой экран приложения

Вот чего я хочу добиться (скриншот приложения Pinterest)


person BhavitBJ    schedule 27.06.2020    source источник


Ответы (1)


Переместите код, связанный с цветом поддона, за пределы onResourceReady() и оставьте все остальное как есть.

public class CoffeeAdapter extends RecyclerView.Adapter<CoffeeAdapter.ViewHolder> implements Filterable{

    private static final String TAG = "RecyclerAdapter";

    private ArrayList<CoffeeItem> coffeeItems;
    ArrayList<CoffeeItem> coffeeItemsAll;
    private Context mContext;
    private FavDB favDB;
    private DownloadDB downloadDB;

    public CoffeeAdapter(ArrayList<CoffeeItem> coffeeItems, Context mContext) {
        this.coffeeItems = coffeeItems;
        this.coffeeItemsAll = new ArrayList<CoffeeItem>(coffeeItems);
        this.mContext = mContext;
        notifyDataSetChanged();

    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        favDB = new FavDB(mContext);
        downloadDB = new DownloadDB(mContext);
        //create table on first
        SharedPreferences prefs = mContext.getSharedPreferences("prefs", mContext.MODE_PRIVATE);
        boolean firstStart = prefs.getBoolean("firstStart", true);
        if (firstStart) {
            createTableOnFirstStart();
            createTableOnFirstStart1();
        }

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item,
                parent,false);
        return new ViewHolder(view);
    }


    @Override
    public void onBindViewHolder(@NonNull final CoffeeAdapter.ViewHolder holder, int position) {
        final CoffeeItem coffeeItem = coffeeItems.get(position);
        readCursorData(coffeeItem, holder);
        readCursorData1(coffeeItem, holder);


       Palette.from(resource)
       .generate(new Palette.PaletteAsyncListener() {
         @Override
         public void onGenerated(@Nullable Palette palette) {
         Palette.Swatch darkVibrantSwatch = palette.getDarkVibrantSwatch();
         Palette.Swatch dominantSwatch = palette.getDominantSwatch();
         Palette.Swatch lightVibrantSwatch = palette.getLightVibrantSwatch();
         if (darkVibrantSwatch != null) {
             holder.cardView.setCardBackgroundColor(darkVibrantSwatch.getRgb());
         } else if (dominantSwatch != null) {

             holder.cardView.setCardBackgroundColor(dominantSwatch.getRgb());

         } else {

             holder.cardView.setCardBackgroundColor(lightVibrantSwatch.getRgb());

            }

          }
       });

       // Glide.with(mContext).load(coffeeItems.get(position).getUrl()).into(holder.imageView);

        Glide.with(mContext)
                .asBitmap()
                .load(coffeeItems.get(position).getUrl())
                .thumbnail(0.05f)
                .apply(new RequestOptions().override(600,1200))
                .apply(new RequestOptions().diskCacheStrategy(DiskCacheStrategy.ALL))
                .listener(new RequestListener<Bitmap>() {
                    @Override
                    public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Bitmap> target, boolean isFirstResource) {
                        return false;
                    }

                    @Override
                    public boolean onResourceReady(Bitmap resource, Object model, Target<Bitmap> target, DataSource dataSource, boolean isFirstResource) {
                        return false;
                    }
                })
                .into(holder.imageView);



        //Picasso.get().load(coffeeItems.get(position).getUrl()).resize(1080,1920).onlyScaleDown().into(holder.imageView);
        //holder.imageView.setImageResource(coffeeItem.getImageResourse());
        holder.titleTextView.setText(coffeeItem.getTitle());

        holder.cardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(mContext,ViewActivity.class);
                intent.putExtra("image",coffeeItem.getUrl());
                intent.putExtra("title",coffeeItem.getTitle());
                intent.putExtra("tag",coffeeItem.getTag());
                intent.putExtra("resolution", coffeeItem.getResolution());
                intent.putExtra("size",coffeeItem.getSize());
                intent.putExtra("desc",coffeeItem.getDescription());
                intent.putExtra("keyId",coffeeItem.getKey_id());
                intent.putExtra("favStatus",coffeeItem.getFavStatus());
                intent.putExtra("downloadStatus",coffeeItem.getDownloadStatus());

                mContext.startActivity(intent);
            }
        });
    }
person AgentP    schedule 27.06.2020
comment
Я получаю сообщение об ошибке Palette.from(resource), потому что переменная resource генерируется в Glide onResourceReady() - person BhavitBJ; 27.06.2020
comment
Да, я понял ... Мой ответ не сработает, я обновлю свой ответ, если что-нибудь найду. - person AgentP; 27.06.2020
comment
Хорошо, спасибо! Пожалуйста, дайте мне знать, потому что я застрял - person BhavitBJ; 27.06.2020