[android] Android에서 두 드로어 블 비교

두 드로어 블을 비교하는 방법, 이렇게하고 있지만 성공하지 못했습니다

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

  if(fDraw.equals(sDraw))
  {
   //Not coming
  }
}



답변


https://stackoverflow.com/a/36373569/1835650 업데이트

getConstantState ()가 잘 작동하지 않습니다.

비교하는 또 다른 방법이 있습니다.

mRememberPwd.getDrawable().getConstantState().equals
            (getResources().getDrawable(R.drawable.login_checked).getConstantState());

mRemeberPwdImageView본 실시 예에서. 를 사용하는 TextView경우 getBackground().getConstantState대신 사용하십시오.


답변

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;
}


답변

내 질문은 두 개의 드로어 블을 비교하는 것이었지만 두 드로어 블을 직접 비교하는 방법을 시도했지만 내 솔루션의 경우 드로어 블을 비트 맵으로 변경 한 다음 두 개의 비트 맵을 비교하면 작동합니다.

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

if(bitmap == bitmap2)
    {
        //Code blcok
    }


답변

SDK 21 이상용

이것은 SDK -21에서 작동합니다.

mRememberPwd.getDrawable().getConstantState().equals
        (getResources().getDrawable(R.drawable.login_checked).getConstantState())

SDK +21 android 5. 드로어 블 ID를 태그가있는 imageview로 설정

img.setTag(R.drawable.xxx);

이렇게 비교

if ((Integer) img.getTag() == R.drawable.xxx)
{
....your code
}

이 솔루션은의 drawableID를의 imageviewID와 비교하려는 사람을위한 것 입니다 drawable.xxx.


답변

Android 5 용 솔루션 :

 if(image.getDrawable().getConstantState().equals(image.getContext().getDrawable(R.drawable.something).getConstantState()))


답변

getDrawable (int) 은 이제 사용되지 않습니다. 사용 getDrawable (문맥, R.drawable.yourimageid)

두 배경을 비교하려면

Boolean Condition1=v.getBackground().getConstantState().equals(
ContextCompat.getDrawable(getApplicationContext(),R.drawable.***).getConstantState());


답변

아마도 다음과 같이 시도하십시오.

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

  if(fDraw.hashCode() == sDraw.hashCode())
  {
   //Not coming
  }
}

또는 두 개의 드로어 블 인수를 취하고 부울을 반환하는 메서드를 준비합니다. 이 방법에서 드로어 블을 바이트로 변환하고 비교할 수 있습니다.

public boolean compareDrawable(Drawable d1, Drawable d2){
    try{
        Bitmap bitmap1 = ((BitmapDrawable)d1).getBitmap();
        ByteArrayOutputStream stream1 = new ByteArrayOutputStream();
        bitmap1.compress(Bitmap.CompressFormat.JPEG, 100, stream1);
        stream1.flush();
        byte[] bitmapdata1 = stream1.toByteArray();
        stream1.close();

        Bitmap bitmap2 = ((BitmapDrawable)d2).getBitmap();
        ByteArrayOutputStream stream2 = new ByteArrayOutputStream();
        bitmap2.compress(Bitmap.CompressFormat.JPEG, 100, stream2);
        stream2.flush();
        byte[] bitmapdata2 = stream2.toByteArray();
        stream2.close();

        return bitmapdata1.equals(bitmapdata2);
    }
    catch (Exception e) {
        // TODO: handle exception
    }
    return false;
}