Android自定义视图只调用一次onDraw方法

3

我创建了一个自定义视图,根据外部数据应该在背景上动画显示一个点。(对TextView的工作效果很好)

然后在xml中添加视图并设置android:background属性。

视图被正确地渲染,但是不更新。一些调试揭示出onDraw只被调用一次。缺少什么?

我的自定义视图代码:

 public class Gmeter extends ImageView {
    private Bitmap dot;
    private float dotHeight, dotWidth;

    public Gmeter(Context context, AttributeSet attrs) {
        super(context, attrs);

        dot = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.g_dot);
        dotWidth = dot.getWidth();
        dotHeight = dot.getHeight();
    }

    @Override
    protected void onDraw(Canvas canvas){
        super.onDraw(canvas);

        float dataX =(float) Data.getX();

        float x = (getWidth()-dotWidth)/2f;
        float y = (getHeight()-dotHeight)/2f;

        x+= dataX * getWidth() /2f;

        canvas.drawBitmap(dot, x, y, null);
    }

}
3个回答

5
无论是什么在设置Data中的x,都需要调用invalidate()来告诉View它需要基于新数据进行重绘。View不能读取您的思想以知道何时有新数据可用 :)。
并且务必与数据更新相关联...如果您在onDraw()中调用invalidate(),那么您将浪费CPU周期的好方法。

1

可能不是最好的实现方式,因为它会不断更新,但你可以调用:

invalidate();

在onDraw()方法中,它将重新绘制。

1

创建一个Runnable(带有Handler)以调用invalidate()大约16次/秒将非常容易。只需在调用invalidate()后放置handler.postDelay(this,delay)即可控制重放速率。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接