Проверьте, являются ли объекты Paint визуально одинаковыми - PullRequest
0 голосов
/ 12 октября 2018

Мне было интересно, есть ли хороший способ для сравнения 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 и paint2 не совпадают с paint3.

Конечно, вы не можете использовать, например, paint1 == paint2, так как это два разных объекта.Также кажется, что paint1.equals(paint2) не работает.

Есть ли способ?Или я должен индивидуально сравнить атрибуты (такие как color, alpha, strokeCap), которые я считаю важными?

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Посмотрите на реализацию класса Paint здесь .Проверьте, что делает конструктор Paint (Paint p), какой атрибут он устанавливает.Существует скрытый метод API hasEqualAttributes (Paint p).Может быть, вы можете использовать этот код метода в своем приложении.

0 голосов
/ 12 октября 2018

Вы должны будете выполнить свою собственную проверку, возможно, с пользовательской Comparator, поскольку Paint не переопределяет equals и hashcode.

. В 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

...