如何判断ImageView显示的是XML预设drawable还是动态设置的Bitmap?
解决方案
方案1:使用View Tag标记(推荐,稳定性最高)
通过给ImageView附加自定义标记区分显示状态,逻辑完全可控,不受Drawable类型、系统缓存等因素影响,适配所有场景。
实现步骤
- 初始化时标记初始状态
private static final int TAG_DYNAMIC_BITMAP = -1; // 自定义常量表示已设置动态Bitmap @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_layout); ImageView ppImageView = findViewById(R.id.ppImageView); // 初始状态标记为原始drawable的资源ID,使用带key的重载避免Tag冲突 ppImageView.setTag(R.id.ppImageView, R.drawable.globe1); }
- 动态设置Bitmap时同步修改标记
ppImageView.setImageBitmap(ppBitmap); ppImageView.setTag(R.id.ppImageView, TAG_DYNAMIC_BITMAP);
- 状态判断逻辑
int currentTag = (int) ppImageView.getTag(R.id.ppImageView); if (currentTag == R.drawable.globe1) { // 当前显示的是初始的globe1 drawable资源 } else { // 当前显示的是动态设置的ppBitmap }
方案2:直接对比Drawable内容
setImageBitmap方法会自动将传入的Bitmap封装为BitmapDrawable,通过对比当前Drawable和原始globe1的ConstantState即可区分,适合简单场景使用。
// 获取原始globe1的Drawable实例 Drawable originalDrawable = AppCompatResources.getDrawable(this, R.drawable.globe1); // 获取ImageView当前显示的Drawable Drawable currentDrawable = ppImageView.getDrawable(); if (originalDrawable != null && currentDrawable != null && originalDrawable.getConstantState().equals(currentDrawable.getConstantState())) { // 当前显示的是初始的globe1 drawable资源 } else { // 当前显示的是动态设置的ppBitmap }
注意:如果globe1是矢量图、或者系统开启了Drawable缓存复用,该方案可能出现对比误差,优先选择方案1。
内容的提问来源于stack exchange,提问作者Noor Hossain
相关产品推荐
相关产品推荐

