我有这个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
谢谢