Android Espresso match BitmapDrawables with different tint

耗尽温柔 提交于 2020-05-14 18:36:06

问题


Is there some way to compare two Bitmaps which are wrapped by the BitmapDrawable.

The comparison should not fail if the sizes doesn't match, but it should match pixels and the color of the Bitmap

I am not sure how the native part of Android draws the Bitmap, because sameAs returns true even though the tint color is different.

If the size is different, I can create scaled Bitmap from the other and the compare these to.

In my source code I use DrawableCompat.setTint with the ImageViews Drawable and in the test code I load Drawable from resources and tint it same way.

Any ideas? I would like to have test which validates the source Drawable of ImageView and the color as well based on if it's pressed or not.

NOTE 1: My drawables are white, and I use tint to set color. Looping pixels for Bitmapsdoesn't work because they are white at that point, most likely Android native side uses tint color when drawing.

NOTE 2: Using compile 'com.android.support:palette-v7:21.0.0' and Palette.from(bitmap).generate(); doesn't help either because the returned palette has 0 swatches so can't get any color information there.

This is my current matcher:

public static Matcher<View> withDrawable(final Drawable d) {
    return new BoundedMatcher<View, ImageView>(ImageView.class) {

        @Override
        public boolean matchesSafely(ImageView iv) {
            if (d == null) {
                return iv.getDrawable() == null;
            } else if (iv.getDrawable() == null) {
                return false;
            }

            if (d instanceof BitmapDrawable && iv.getDrawable() instanceof BitmapDrawable) {
                BitmapDrawable d1 = (BitmapDrawable) d;
                BitmapDrawable d2 = (BitmapDrawable) iv.getDrawable();

                Bitmap b1 = d1.getBitmap();
                Bitmap b2 = d2.getBitmap();

                return b1.sameAs(b2);
            }

            return iv.getDrawable().getConstantState().equals(d.getConstantState());
        }

        @Override
        public void describeTo(Description description) {
            description.appendText("with drawable: ");
        }
    };
}

Thanks.


回答1:


I use matchers written by Frankie Sardo for this purpose - https://gist.github.com/frankiesardo/7490059. There are a couple of matchers which must solve your issue. All credits to him.




回答2:


I've had the opposite issue: matching a drawable when it's size and/or tint can change.

When I convert drawable to bitmap, I use it's default size and apply a black tint:

private fun getBitmapFromDrawable(drawable: Drawable): Bitmap {
    val bitmap: Bitmap = Bitmap.createBitmap(
        drawable.intrinsicWidth,
        drawable.intrinsicHeight,
        Bitmap.Config.ARGB_8888
    )

    val canvas = Canvas(bitmap)
    drawable.apply {
        setBounds(0, 0, canvas.width, canvas.height)
        setTint(Color.BLACK)
        draw(canvas)
    }

    return bitmap
}

Usage:

val bitmap = getBitmapFromDrawable(currentDrawable)
val otherBitmap = getBitmapFromDrawable(otherDrawable)

return bitmap.sameAs(otherBitmap)

You could use a new parameter for matching the drawable color...

private fun getBitmapFromDrawable(drawable: Drawable, color:Int): Bitmap {
    val bitmap: Bitmap = Bitmap.createBitmap(
        drawable.intrinsicWidth,
        drawable.intrinsicHeight,
        Bitmap.Config.ARGB_8888
    )

    val canvas = Canvas(bitmap)
    drawable.apply {
        setBounds(0, 0, canvas.width, canvas.height)
        setTint(color)
        draw(canvas)
    }

    return bitmap
}

Usage:

val bitmap = getBitmapFromDrawable(currentDrawable, color)
val otherBitmap = getBitmapFromDrawable(otherDrawable, color)

return bitmap.sameAs(otherBitmap)


来源:https://stackoverflow.com/questions/32902594/android-espresso-match-bitmapdrawables-with-different-tint

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!