Несколько вызовов для аннулирования с разными Rect

Я расширяю свой корневой макет, чтобы разместить на нем drawBitmap 4 стрелки, по одной в каждом углу экрана. Эти стрелки будут иногда мигать одновременно. введите здесь описание изображения

Я делаю это как оптимизацию, чтобы избежать создания 4 дополнительных представлений, поэтому я думаю, что это имеет смысл только в том случае, если области аннулируются независимо друг от друга, потому что, если весь макет будет аннулирован и перерисован, потеря производительности, вероятно, будет быть больше, чем сбережения, так как корневой макет содержит тяжелые вещи. Я полагаю, это хорошая идея, но если кто-то думает, что это не так, пожалуйста, скажите мне, почему.

Я попытался вызвать invalidate(Rect) в одной и той же функции с каждым прямоугольником:

 public MyRootViewGroup extends FrameLayout {

     @Override
     public void draw (Canvas c) {
          super.draw(c); // Draw Viewgroup Children
          draw_arrows(); // Paint Arrows over children
          invalidate(rect_arrow_left);
          invalidate(rect_arrow_right);
          invalidate(rect_arrow_bottom);
          invalidate(rect_arrow_top);
     }

... но, к сожалению, кажется, что только один регион становится недействительным при таком подходе. Мне нужно аннулировать весь макет, чтобы он работал.

Вопрос Если этот FrameLayout содержит другие дочерние элементы (которые рисуются в super.draw() ), но они не изменяются, вызовет ли мой вызов invalidate() их перерисовку? Или Android каким-то образом умен, чтобы обнаружить, что изменилась только область стрелки, несмотря на запуск полного invalidate? Я оптимизирую и сохраняю 4 представления, или я нарушаю конвейер оптимизации Android?

С Уважением!


person rupps    schedule 29.03.2014    source источник


Ответы (1)


используйте этот код в своем следующем методе Activity onCreate()

ImageView imageView1 = (ImageView)findViewById(R.id.imageView1);
ImageView imageView2 = (ImageView)findViewById(R.id.imageView2);
ImageView imageView3 = (ImageView)findViewById(R.id.imageView3);
ImageView imageView4 = (ImageView)findViewById(R.id.imageView4);

Animation animBlank = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.blank);

imageView1.startAnimation(animBlank);
imageView2.startAnimation(animBlank);
imageView3.startAnimation(animBlank);
imageView4.startAnimation(animBlank);

Создайте xml-файл, определяющий тип выполняемой анимации. Этот файл должен находиться в папке anim в каталоге res (res ⇒ anim ⇒ blink.xml). Если у вас нет папки anim в вашем каталоге res, создайте ее.

поместите следующий код в файл blink.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha android:fromAlpha="0.0"
        android:toAlpha="1.0"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:duration="600"
        android:repeatMode="reverse"
        android:repeatCount="infinite"/>
</set>
person Community    schedule 29.03.2014
comment
спасибо за ответ @Kush, но на самом деле это то, чего я пытаюсь избежать. Я вручную рисую стрелки, чтобы сохранить 4 представления для производительности :) - person rupps; 29.03.2014