Сравнение двух чертежей в android

Как сравнить две возможности, я делаю это, но не добившись успеха

public void MyClick(View view) { Drawable fDraw = view.getBackground(); Drawable sDraw = getResources().getDrawable(R.drawable.twt_hover); if(fDraw.equals(sDraw)) { //Not coming } } 

Solutions Collecting From Web of "Сравнение двух чертежей в android"

Есть и другой способ сравнения:

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

mRemeberPwd – это ImageView в этом примере. Если вы используете TextView , используйте getBackground().getConstantState вместо 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 - eg 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; } 

Мой вопрос состоял в том, что мы просто сравнивали две чертежи, я пытался, но не мог получить какой-либо метод, который напрямую сравнивал бы два чертежа, однако для моего решения я изменил drawable на bitmap, а затем сравнил два растровых изображения и это работает.

 Bitmap bitmap = ((BitmapDrawable)fDraw).getBitmap(); Bitmap bitmap2 = ((BitmapDrawable)sDraw).getBitmap(); if(bitmap == bitmap2) { //Code blcok } 

Возможно, попробуйте это так:

 public void MyClick(View view) { Drawable fDraw = view.getBackground(); Drawable sDraw = getResources().getDrawable(R.drawable.twt_hover); if(fDraw.hashCode() == sDraw.hashCode()) { //Not coming } } 

Или подготовьте метод, который принимает два допустимых аргумента и возвращает boolean. В этом методе вы можете преобразовать drawable в байты и сравнить,

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

Решение для Android 5:

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

Для SDK 21+

Это работает в SDK -21

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

Для SDK +21 android 5. установите обратный идентификатор в изображение с тегом

 img.setTag(R.drawable.xxx); 

И сравнить это

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

Это решение предназначено для тех, кто хочет сравнить drawable идентификатор imageview с идентификатором drawable.xxx .

Хорошо, я думаю, что нашел окончательное решение для этого. Из-за AppCompat и друзей предоставляемый ресурс иногда раздувается в разных формах, поэтому недостаточно делать getResources().getBitmap(R.drawable.my_awesome_drawable) .

Итак, чтобы получить примерный экземпляр того же типа и формы, что и представление, можно сделать следующее:

 public static Drawable drawableFrom(View view, @DrawableRes int drawableId) { Context context = view.getContext(); try { View dummyView = view.getClass().getConstructor(Context.class).newInstance(context); dummyView.setBackgroundResource(drawableId); return dummyView.getBackground(); } catch (Exception e) { return ResourcesCompat.getDrawable(context.getResources(), drawableId, null); } } 

Это полезно при выполнении тестов. Однако я бы не рекомендовал делать это на производстве. Если вам нужно, потребуется дополнительное кэширование, чтобы избежать слишком большого отражения.

Для экспресс-тестов вы можете использовать это довольно хорошо:

 onView(withDrawable(R.drawable.awesome_drawable)) .check(matches(isDisplayed())); 

или

 onView(withId(R.id.view_id)) .check(matches(withDrawable(R.drawable.awesome_drawable))); 

Прежде чем вам придется объявить этот вспомогательный класс:

 public class CustomMatchers { public static Matcher<View> withDrawable(@DrawableRes final int drawableId) { return new DrawableViewMatcher(drawableId); } private static class DrawableViewMatcher extends TypeSafeMatcher<View> { private final int expectedId; private String resourceName; private enum DrawableExtractionPolicy { IMAGE_VIEW { @Override Drawable findDrawable(View view) { return view instanceof ImageView ? ((ImageView) view).getDrawable() : null; } }, TEXT_VIEW_COMPOUND { @Override Drawable findDrawable(View view) { return view instanceof TextView ? findFirstCompoundDrawable((TextView) view) : null; } }, BACKGROUND { @Override Drawable findDrawable(View view) { return view.getBackground(); } }; @Nullable private static Drawable findFirstCompoundDrawable(TextView view) { for (Drawable drawable : view.getCompoundDrawables()) { if (drawable != null) { return drawable; } } return null; } abstract Drawable findDrawable(View view); } private DrawableViewMatcher(@DrawableRes int expectedId) { this.expectedId = expectedId; } @Override protected boolean matchesSafely(View view) { resourceName = resources(view).getResourceName(expectedId); return haveSameState(actualDrawable(view), expectedDrawable(view)); } private boolean haveSameState(Drawable actual, Drawable expected) { return actual != null && expected != null && areEqual(expected.getConstantState(), actual.getConstantState()); } private Drawable actualDrawable(View view) { for (DrawableExtractionPolicy policy : DrawableExtractionPolicy.values()) { Drawable drawable = policy.findDrawable(view); if (drawable != null) { return drawable; } } return null; } private boolean areEqual(Object first, Object second) { return first == null ? second == null : first.equals(second); } private Drawable expectedDrawable(View view) { return drawableFrom(view, expectedId); } private static Drawable drawableFrom(View view, @DrawableRes int drawableId) { Context context = view.getContext(); try { View dummyView = view.getClass().getConstructor(Context.class).newInstance(context); dummyView.setBackgroundResource(drawableId); return dummyView.getBackground(); } catch (Exception e) { return ResourcesCompat.getDrawable(context.getResources(), drawableId, null); } } @NonNull private Resources resources(View view) { return view.getContext().getResources(); } @Override public void describeTo(Description description) { description.appendText("with drawable from resource id: "); description.appendValue(expectedId); if (resourceName != null) { description.appendValueList("[", "", "]", resourceName); } } } } 

Используйте методы getTag () и setTag () для сравнения

GetDrawable (int) теперь устарел. Использовать getDrawable (контекст, R.drawable.yourimageid)

Сравнить два фонов

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

Если вы хотите напрямую сравнить два варианта, используйте следующий код

Drawable fDraw = getResources (). GetDrawable (R.drawable.twt_hover);

Drawable sDraw = getResources (). GetDrawable (R.drawable.twt_hover);

 if (fDraw.getConstantState().equals(sDraw.getConstantState())) { //write your code. } else { //write your code. } 

Когда вы используете метод equals() он используется для сравнения содержимого. Вы должны попробовать == для сравнения двух объектов.

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