我制作了一个自定义视图,该视图应根据某些外部数据为背景上的点设置动画。 (就像带有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);
}
}
答案 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()之后;控制重播率。