比较android中的两个drawables

Ros*_*Jha 87 android

如何比较两个drawables,我这样做但没有取得任何成功

public void MyClick(View view)
{
 Drawable fDraw = view.getBackground();
 Drawable sDraw = getResources().getDrawable(R.drawable.twt_hover);

  if(fDraw.equals(sDraw))
  {
   //Not coming
  }
}
Run Code Online (Sandbox Code Playgroud)

小智 149

更新 /sf/answers/2546149861/

getConstantState()工作得不好

还有另一种比较方式:

mRememberPwd.getDrawable().getConstantState().equals
            (getResources().getDrawable(R.drawable.login_checked).getConstantState());
Run Code Online (Sandbox Code Playgroud)

mRemeberPwdImageView在这个例子中是一个.如果您使用的是TextView,请getBackground().getConstantState改用.

  • 这个代码在低于5.0的设备上工作得很好,但是我在5.0设备上使用它时会出现错误,任何人都可以在Android 5.0或更高版本上确认此方法是否有效 (8认同)
  • 这个解决方案有效,因为它避免了将Drawable转换为Bitmap并进行比较. (3认同)
  • 并非总是如此:WallpaperManager.getInstance(this).getFastDrawable()。getConstantState()为null。 (2认同)

vau*_*oid 38

getConstantState()单独依靠可能导致漏报.

我采用的方法是尝试比较第一个实例中的ConstantState,但如果检查失败则返回Bitmap比较.

这应该适用于所有情况(包括非资源的图像),但请注意它是内存饥饿.

public static boolean areDrawablesIdentical(Drawable drawableA, Drawable drawableB) {
    Drawable.ConstantState stateA = drawableA.getConstantState();
    Drawable.ConstantState stateB = drawableB.getConstantState();
    // If the constant state is identical, they are using the same drawable resource.
    // However, the opposite is not necessarily true.
    return (stateA != null && stateB != null && stateA.equals(stateB))
            || getBitmap(drawableA).sameAs(getBitmap(drawableB));
}

public static Bitmap getBitmap(Drawable drawable) {
    Bitmap result;
    if (drawable instanceof BitmapDrawable) {
        result = ((BitmapDrawable) drawable).getBitmap();
    } else {
        int width = drawable.getIntrinsicWidth();
        int height = drawable.getIntrinsicHeight();
        // Some drawables have no intrinsic width - e.g. solid colours.
        if (width <= 0) {
            width = 1;
        }
        if (height <= 0) {
            height = 1;
        }

        result = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(result);
        drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
        drawable.draw(canvas);
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)


Ros*_*Jha 12

我的问题是只是比较两个drawable,我尝试但无法得到任何直接比较两个drawables的方法,但是对于我的解决方案我改变drawable到位图然后比较两个位图,这是有效的.

Bitmap bitmap = ((BitmapDrawable)fDraw).getBitmap();
Bitmap bitmap2 = ((BitmapDrawable)sDraw).getBitmap();

if(bitmap == bitmap2)
    {
        //Code blcok
    }
Run Code Online (Sandbox Code Playgroud)

  • 这是非常沉重的,所以考虑回收位图,否则你最终会出现 OutOfMemoryError! (2认同)
  • 为什么可以将位图与指针相等(==)进行比较?我希望需要Bitmap.equals(). (2认同)

toh*_*hid 7

适用于SDK 21+

这适用于SDK -21

mRememberPwd.getDrawable().getConstantState().equals
        (getResources().getDrawable(R.drawable.login_checked).getConstantState())
Run Code Online (Sandbox Code Playgroud)

for SDK +21 android 5.将drawable id设置为带有标记的imageview

img.setTag(R.drawable.xxx);
Run Code Online (Sandbox Code Playgroud)

和这样比较

if ((Integer) img.getTag() == R.drawable.xxx)
{
....your code
}
Run Code Online (Sandbox Code Playgroud)

这个解决方案适合谁想要比较drawableid的imageviewid drawable.xxx.