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

时间:2012-02-11 19:02:43

标签: java android user-interface view rendering

我制作了一个自定义视图,该视图应根据某些外部数据为背景上的点设置动画。 (就像带有textviews的魅力一样)

然后在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 个答案:

答案 0 :(得分:5)

无论设置是什么x Data都需要调用invalidate()告诉View它需要根据新数据重绘。 View无法让您知道新数据何时可用:)。

并且肯定会将其与数据更新联系起来......如果您从invalidate()中调用onDraw(),那么您将有一个浪费CPU周期的好方法。

答案 1 :(得分:1)

可能不是最佳实施,因为它会不断更新,但您可以致电:

invalidate();

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

答案 2 :(得分:1)

创建一个调用invalidate()的Runnable(带有Handler)会非常容易;每秒16次左右。只需放置handler.postDelay(this,delay);在调用invalidate()之后;控制重播率。