Свойство ShapeDrawable animate alpha в пользовательском представлении

У меня проблемы с простой альфа-анимацией рисования. Ниже у вас есть тестовый проект, который иллюстрирует проблему.

Класс, который содержит ShapeDrawable

public class CustomDrawable {

public ShapeDrawable shapeDrawable;

public CustomDrawable(int left, int top, int right, int bottom, int color) {
    shapeDrawable = new ShapeDrawable(new RectShape());
    shapeDrawable.setBounds(new Rect(left, top, right, bottom));
    shapeDrawable.getPaint().setStyle(Paint.Style.FILL_AND_STROKE);
    shapeDrawable.getPaint().setColor(Color.BLUE);
}

public ShapeDrawable getShapeDrawable() {
    return shapeDrawable;
}

}

Пользовательский вид

public class CustomView extends View {

private CustomDrawable drawable;

public CustomView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    drawable.getShapeDrawable().draw(canvas);
}

public void animateDrawable() {
    ValueAnimator va = ValueAnimator.ofInt(255, 0);
    va.setDuration(1000);
    va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        int alpha;
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            alpha = (int) animation.getAnimatedValue();
            drawable.getShapeDrawable().setAlpha(alpha);
            drawable.getShapeDrawable().getPaint().setAlpha(alpha);

            // This works but invalidates the whole view...
            //postInvalidate();
        }
    });
    va.start();
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    drawable = new CustomDrawable(0, 0, h/2, w/2, Color.MAGENTA);
}
}

Деятельность

public class MainActivity extends AppCompatActivity {
private final static String TAG = "MainActivity";
private CustomView customView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    customView = (CustomView) findViewById(R.id.customView);
    Button fadeOutBtn = (Button) findViewById(R.id.fadeOut);
    fadeOutBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            customView.animateDrawable();
        }
    });

}

}

Если я не вызываю postnvalidate() в animateDrawable, тогда анимация отсутствует. Что касается других примеров (не полных), то кажется, что нарисованную фигуру следует анимировать только с помощью аниматора, не нужно вручную вызывать postInvalidate() в представлении...

Итак, правильно ли мое понимание, нужно ли мне самим сводить на нет весь взгляд? И если это так, будет ли весь вид "перекрашен" или только грязный регион?

Спасибо

0 ответов

Другие вопросы по тегам