我正在使用 Palette,在使用 BitmapFactory.deodeResource() 生成位图时遇到了一些奇怪的事情 当我这样做时:
BitmapFactory.decodeResource(context.getResources(),R.drawable.somename);
一切都很好,所有色板都在生成
但我想在一个函数中使用它,这样我就可以为不同的图像生成它。
我有获取可绘制 ID 的 int id 参数,当我将代码更改为此时:
BitmapFactory.decodeResource(context.getResources(),id)
应用程序因错误而崩溃
IllegalArgumentException bitmap is not valid
更多细节这里是我的功能
private void addUserView(Context context, String name, int id){
Drawable drawable = AppCompatResources.getDrawable(context,id);
int cardWidth = (int)((this.getResources().getConfiguration().screenWidthDp-10)*this.getResources().getDisplayMetrics().density)-6*(flexColumns);
int col = (int)Math.sqrt(flexboxUsers.getFlexItemCount()+1);
UserCardLayoutBinding userCard = UserCardLayoutBinding.inflate(getLayoutInflater());
userCard.userCardImg.setImageDrawable(drawable);
userCard.userCardImg.setScaleType(ImageView.ScaleType.CENTER_CROP);
userCard.userCardImg.getLayoutParams().height = cardWidth/flexColumns/4;
userCard.userCardImg.getLayoutParams().width = cardWidth/flexColumns/4;
userCard.userCardName.setText(name);
createPaletteAsync(BitmapFactory.decodeResource(context.getResources(),id),userCard.getRoot());
CardView.LayoutParams card_params = new FrameLayout.LayoutParams(cardWidth/flexColumns, ViewGroup.LayoutParams.WRAP_CONTENT);
card_params.setMargins(3,3,3,3);
userCard.getRoot().setLayoutParams(card_params);
flexboxUsers.addView(userCard.getRoot());
if(flexColumns < col){
flexColumns = col;
cardWidth = (int)((this.getResources().getConfiguration().screenWidthDp-10)*this.getResources().getDisplayMetrics().density)-6*(flexColumns);
resizeAllUserViews(cardWidth/flexColumns);
}
}
private void resizeAllUserViews(int width){
for (int i = 0; i < flexboxUsers.getFlexItemCount(); i++) {
ViewGroup user = (ViewGroup) flexboxUsers.getChildAt(i);
user.getLayoutParams().width=width;
user.getChildAt(0).getLayoutParams().height = width/4;
user.getChildAt(0).getLayoutParams().width = width/4;
}
}
public void createPaletteAsync(Bitmap bitmap, View view) {
Palette.from(bitmap).generate(new Palette.PaletteAsyncListener() {
public void onGenerated(Palette p) {
List<Palette.Swatch> sws = p.getSwatches();
Log.i("gg",String.valueOf(sws.isEmpty()));
Palette.Swatch lightVibrant = p.getLightVibrantSwatch();
Palette.Swatch vibrant = p.getVibrantSwatch();
Palette.Swatch darkVibrant = p.getDarkVibrantSwatch();
Palette.Swatch lightMuted = p.getLightMutedSwatch();
Palette.Swatch muted = p.getMutedSwatch();
Palette.Swatch darkMuted = p.getDarkMutedSwatch();
Log.i("gg","palette");
if(lightVibrant!=null){
Log.i("gg","lightVibrant");
}
if(vibrant!=null){
Log.i("gg","vibrant");
}
if(darkVibrant!=null){
Log.i("gg","darkVibrant");
}
if(lightMuted!=null){
Log.i("gg","lightMuted");
}
if(muted!=null){
Log.i("gg","muted");
}
if(darkMuted!=null){
Log.i("gg","darkMuted");
}
}
});
}
同样,当 .decodeResource 使用 int id 时它不起作用,使用 R.drawable.imgname 一切都很好
我不知道为什么将 R.drawable.imgname 更改为对应的 int 变量不起作用,我认为它应该相等