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

时间:2018-10-12 17:55:44

标签: android equals paint

我想知道Paint比较是否有一个好的方法。

例如,考虑以下代码:

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

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

  • paint1paint2
  • paint1paint2paint3不同。

当然,您不能使用paint1 == paint2,因为它们是两个不同的对象。另外,看来paint1.equals(paint2)无效。

有办法吗?还是应该单独比较我认为重要的属性(例如颜色,alpha,strokeCap)?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您可能必须使用自定义Comparator来实现自己的检查,因为Paint不会覆盖equalshashcode

Paint类中有一个隐藏方法,称为: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的不同之间进行更改