调色板 API 不工作(仅在调试时工作)
Palette API not working (Works only when I'm debugging)
我在其中创建了一个简单的 RecyclerView
和一个 CardView
。在CardView
中有ImageView
和TextView
。所以我得到图像的 url 并使用 Picasso
加载它。使用 Palette API
之前一切正常。所以我想从图像中获取颜色并将其设置为 CardView
和 TextView
.
这是我的 RecyclerView.Adapter
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.MyViewHolder> {
private List<String> imagesUrl;
private List<String> imageDescription;
RecyclerAdapter(List<String> imagesUrl, List<String> imageDescription) {
this.imagesUrl = imagesUrl;
this.imageDescription = imageDescription;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int position) {
View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull final MyViewHolder myViewHolder, int position) {
myViewHolder.textView.setText(imageDescription.get(position));
Picasso.get()
.load(imagesUrl.get(position))
.into(new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
myViewHolder.imageView.setImageBitmap(bitmap);
myViewHolder.getPalette();
}
@Override
public void onBitmapFailed(Exception e, Drawable errorDrawable) {
myViewHolder.imageView.setImageResource(R.drawable.error);
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
myViewHolder.imageView.setImageResource(R.drawable.placeholder);
}
});
}
@Override
public int getItemCount() {
return imagesUrl.size();
}
class MyViewHolder extends RecyclerView.ViewHolder {
private ImageView imageView;
private TextView textView;
private CardView cardView;
MyViewHolder(@NonNull View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.imageView);
textView = itemView.findViewById(R.id.textView);
cardView = itemView.findViewById(R.id.cardView);
}
private void getPalette() {
Bitmap bitmap = ((BitmapDrawable)imageView.getDrawable()).getBitmap();
Palette.from(bitmap).generate(new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(@Nullable Palette palette) {
//assert palette != null;
Palette.Swatch swatch = palette.getVibrantSwatch();
//assert swatch != null;
textView.setTextColor(swatch.getBodyTextColor());
cardView.setCardBackgroundColor(swatch.getRgb());
}
});
}
}
}
每次显示占位符图像。当我进行调试时,它可以工作。所以有什么问题?
所以问题不在 Palette API
。问题是目标是垃圾 collected.So 解决方案是在对象上实现它或将其存储在字段中并将其设置为我们 ImageView
.
的标签
这里。现在可以使用了。
@Override
public void onBindViewHolder(@NonNull final MyViewHolder myViewHolder, int position) {
myViewHolder.textView.setText(imageDescription.get(position));
Target target = new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
myViewHolder.imageView.setImageBitmap(bitmap);
myViewHolder.getPalette();
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
myViewHolder.imageView.setImageResource(R.drawable.error);
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
myViewHolder.imageView.setImageResource(R.drawable.placeholder);
}
};
Picasso.with(context)
.load(imagesUrl.get(position))
.into(target);
myViewHolder.imageView.setTag(target);
}
我想有一天这会对任何人有所帮助)))谢谢
我在其中创建了一个简单的 RecyclerView
和一个 CardView
。在CardView
中有ImageView
和TextView
。所以我得到图像的 url 并使用 Picasso
加载它。使用 Palette API
之前一切正常。所以我想从图像中获取颜色并将其设置为 CardView
和 TextView
.
这是我的 RecyclerView.Adapter
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.MyViewHolder> {
private List<String> imagesUrl;
private List<String> imageDescription;
RecyclerAdapter(List<String> imagesUrl, List<String> imageDescription) {
this.imagesUrl = imagesUrl;
this.imageDescription = imageDescription;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int position) {
View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull final MyViewHolder myViewHolder, int position) {
myViewHolder.textView.setText(imageDescription.get(position));
Picasso.get()
.load(imagesUrl.get(position))
.into(new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
myViewHolder.imageView.setImageBitmap(bitmap);
myViewHolder.getPalette();
}
@Override
public void onBitmapFailed(Exception e, Drawable errorDrawable) {
myViewHolder.imageView.setImageResource(R.drawable.error);
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
myViewHolder.imageView.setImageResource(R.drawable.placeholder);
}
});
}
@Override
public int getItemCount() {
return imagesUrl.size();
}
class MyViewHolder extends RecyclerView.ViewHolder {
private ImageView imageView;
private TextView textView;
private CardView cardView;
MyViewHolder(@NonNull View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.imageView);
textView = itemView.findViewById(R.id.textView);
cardView = itemView.findViewById(R.id.cardView);
}
private void getPalette() {
Bitmap bitmap = ((BitmapDrawable)imageView.getDrawable()).getBitmap();
Palette.from(bitmap).generate(new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(@Nullable Palette palette) {
//assert palette != null;
Palette.Swatch swatch = palette.getVibrantSwatch();
//assert swatch != null;
textView.setTextColor(swatch.getBodyTextColor());
cardView.setCardBackgroundColor(swatch.getRgb());
}
});
}
}
}
每次显示占位符图像。当我进行调试时,它可以工作。所以有什么问题?
所以问题不在 Palette API
。问题是目标是垃圾 collected.So 解决方案是在对象上实现它或将其存储在字段中并将其设置为我们 ImageView
.
这里。现在可以使用了。
@Override
public void onBindViewHolder(@NonNull final MyViewHolder myViewHolder, int position) {
myViewHolder.textView.setText(imageDescription.get(position));
Target target = new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
myViewHolder.imageView.setImageBitmap(bitmap);
myViewHolder.getPalette();
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
myViewHolder.imageView.setImageResource(R.drawable.error);
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
myViewHolder.imageView.setImageResource(R.drawable.placeholder);
}
};
Picasso.with(context)
.load(imagesUrl.get(position))
.into(target);
myViewHolder.imageView.setTag(target);
}
我想有一天这会对任何人有所帮助)))谢谢