我有ListView
项
<com.example.donutgraph.TalkingFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:padding="10dp" >
<TextView
android:id="@+id/position"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="TextView" />
<FrameLayout
android:layout_width="150dp"
android:layout_height="150dp" >
<com.example.donutgraph.GaugeView
android:id="@+id/gauge"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_gravity="center" />
<ImageView
android:id="@+id/img"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_gravity="right"
android:layout_marginRight="10dp"
android:layout_marginTop="20dp" />
</FrameLayout>
</com.example.donutgraph.TalkingFrameLayout>
动画为GaugeView
的动画。我创建了一个简单的基于时间的动画,这将使像这样的视图无效
private Runnable animator = new Runnable() {
@Override
public void run() {
....
update(now);
if (!isFinish()) {
needNewFrame = true;
} else {
Log.e(tag, "millisecond : " + (now - startTime));
}
if (needNewFrame) {
postDelayed(this, timeBetweenFrame);
}
invalidate();
}
};
private void update(long now) {
float dt = Math.min(now - lastTime, timeBetweenFrame);
currentTime += dt;
if (currentTime > duration) {
currentTime = duration;
}
}
protected void onDraw(Canvas canvas){
....
float percent = getPercentForTime(currentTime);
canvas.drawArc(rectF, 270, percent * -360.0f, false, paint);
....
canvas.drawText(String.valueOf(percentInt), xPos, yPos, paint);
}
这是我的结果
这里的问题是因为动画需要调用invalidate所以它调用我不想要的层次结构中的所有onDraw()并且我认为因为它使我的ListView
如此滞后在滚动期间动画。当此GaugeView ListView上的动画没有顺利运行时。
无论如何要优化这个以便我可以顺利滚动?
并且无论如何还要阻止invalidate()调用在所有视图层次结构上调用onDraw()?因为除了GaugeView
之外的一切都是相同的,它会动画,它是唯一一个改变的。 onDraw()上拨打TalkingFrameLayout
似乎是一种浪费,而不会改变。
谢谢