检查 Paint 对象在视觉上是否相同

Check whether or not Paint objects are visually the same

想知道有没有好的方法可以Paint比较

例如,考虑以下代码:

Paint paint1 = new Paint();
paint1.setColor(Color.BLUE);
Paint paint2 = new Paint(paint1);
Paint paint3 = new Paint(paint1);
paint3.setColor(Color.YELLOW);

在这种情况下,我想写一些这样的代码:

当然,您不能使用例如 paint1 == paint2,因为这是两个不同的对象。另外,paint1.equals(paint2) 似乎不起作用。

有办法吗?或者我应该单独比较我认为重要的属性(如颜色、alpha、strokeCap)?

您必须实施自己的检查,也许使用自定义 Comparator 因为 Paint 不会覆盖 equalshashcode.

Paint class 上有一个隐藏方法叫做:hasEqualAttributes(@NonNull Paint other)

这可以通过反射使用:

    Paint paint1 = new Paint();
    paint1.setColor(Color.BLUE);
    Paint paint2 = new Paint(paint1);
    Paint paint3 = new Paint(paint1);
    paint3.setColor(Color.YELLOW);

    try {
        final Method method = paint1.getClass().getDeclaredMethod("hasEqualAttributes", Paint.class);
        final boolean equal = (boolean) method.invoke(paint1, paint2);
        final boolean equal2 = (boolean) method.invoke(paint2, paint3);
        Log.i("TAG", "Has equal attributes : " + equal);
        Log.i("TAG", "Has equal attributes : " + equal2);
    } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
        e.printStackTrace();
    }

输出:

Has equal attributes : true
Has equal attributes : false

然而,这是非常不鼓励的,因为实现可以在 API 和

之间改变

查看 Paint class 实现 here。检查构造函数 Paint(Paint p) 的作用,它设置的属性。有一个隐藏的 API 方法 hasEqualAttributes(Paint p)。也许您可以在您的应用中使用此方法代码。