1
我正在使用android Espresso
。我想知道如何檢查在視圖中使用的drawable
是否與規格中所述應該使用的相同。我試圖比較view
上使用drawable
的ConstantStates
和資源中的ConstantStates
,但我沒有得到任何地方。如何比較兩個RippleDrawables?
有沒有辦法做到這一點?或者當它涉及到自動化測試時,這種檢查完全不需要嗎?
我正在使用android Espresso
。我想知道如何檢查在視圖中使用的drawable
是否與規格中所述應該使用的相同。我試圖比較view
上使用drawable
的ConstantStates
和資源中的ConstantStates
,但我沒有得到任何地方。如何比較兩個RippleDrawables?
有沒有辦法做到這一點?或者當它涉及到自動化測試時,這種檢查完全不需要嗎?
用於比較兩個圖像,我已經使用這個代碼:
public class ImageComparator {
public static Matcher<View> withImageResource(final int imageResourceId) {
return new TypeSafeMatcher<View>() {
@Override
public void describeTo(Description description) {
description.appendText("with drawable from resource id: " + imageResourceId);
}
@Override
public boolean matchesSafely(View view) {
Drawable actualDrawable = ((ImageView) view).getDrawable();
final Drawable correctDrawable = view.getResources().getDrawable(imageResourceId);
if (actualDrawable == null) {
return correctDrawable == null;
}
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
return areImagesTheSameAfterSdk21(actualDrawable, correctDrawable);
} else {
return areImagesTheSameBeforeSdk21(actualDrawable, correctDrawable);
}
}
};
}
protected static boolean areImagesTheSameBeforeSdk21(Drawable actualDrawable,
Drawable correctDrawable) {
Drawable.ConstantState actualDrawableConstantState = actualDrawable.getConstantState();
Drawable.ConstantState correctDrawableConstantState = correctDrawable.getConstantState();
return actualDrawableConstantState.equals(correctDrawableConstantState);
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR1)
protected static boolean areImagesTheSameAfterSdk21(Drawable actualDrawable,
Drawable correctDrawable) {
Bitmap correctBitmap = drawableToBitmap(correctDrawable);
Bitmap actualBitmap = drawableToBitmap(actualDrawable);
return correctBitmap.sameAs(actualBitmap);
}
private static Bitmap drawableToBitmap(Drawable drawable) {
if (drawable instanceof BitmapDrawable) {
return ((BitmapDrawable) drawable).getBitmap();
}
Bitmap bitmap = Bitmap
.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(),
Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
return bitmap;
}
}
希望這將有助於