设置drawable.invalidate以在画布上连续绘制

Mah*_*esh 2 android callback invalidation drawable

我试图逐步改变OvalShape()的alpha值.为此我需要调用invalidate,以便它不断调用自身并使用增加的alpha值渲染自身.

但设置是错误的,因为我对此没有太多的了解..

public class xml_anim_testing_sub_class extends View {
    private ShapeDrawable mDrawable;
    int x = 10;
    int y = 10;
    int width = 300;
    int height = 50;
    int my_alpha = 255,add_to_my_alpha = 0;

    public xml_anim_testing_sub_class(Context context) {
        super(context);
    }

    protected void onDraw(Canvas canvas) {
        x++;
        mDrawable = new ShapeDrawable(new OvalShape());
        mDrawable.getPaint().setColor(0xff74AC23);
        mDrawable.setAlpha(my_alpha += add_to_my_alpha );
        mDrawable.setBounds(x, y, x + width, y + height);
        if (my_alpha == 0)
            add_to_my_alpha  = 1;
        if (my_alpha == 255)
            add_to_my_alpha  = -1;
        mDrawable.draw(canvas);
        mDrawable.invalidateSelf();
    }
}
Run Code Online (Sandbox Code Playgroud)

好的,我找到了解决方案,invalidate()但那么invalidate和之间的区别是postInvalidate什么?cos都在工作..

还有,有什么用?

mDrawable.invalidateSelf()(cb);
Run Code Online (Sandbox Code Playgroud)

Ted*_*opp 6

而不是调用mDrawable.invalidateSelf(),调用postInvalidate()(对于视图本身).这将在当前完成之后安排另一个绘图过程.

此外,每次通过onDraw都不需要分配新的ShapeDrawable.只需在构造函数中分配一次.这将减少垃圾的产生.

  • @Mahesh - `postInvalidate()`将使框架有机会处理在绘图期间排队的任何其他事件.我建议不要使用`invalidate()`,因为这是一些示例代码所使用的.`Drawable.invalidateSelf()`将调用视图的`invalidateDrawable()`方法,该方法只会使drawable的当前边界无效.如果你没有移动drawable,这将与调用`invalidate(mDrawable.getBounds())`具有相同的效果.如果你正在移动`mDrawable`,这可能会错过一些需要绘图的区域. (4认同)