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);
}
これは私が達成した結果です
ListView
ここでの問題は、アニメーションが無効化を呼び出す必要があるため、階層内のすべての onDraw() を呼び出す必要がないためです。そのため、アニメーション中にスクロールするとラグが発生したと思います。この GaugeView にアニメーションがない場合、ListView はスムーズに実行されます。
とにかくこれを最適化して、スムーズにスクロールできるようにするには?
また、すべてのビュー階層で onDraw() を呼び出すための invalidate() 呼び出しを防ぐ方法はありますか? アニメーション化するものを除いてすべてが同じGaugeView
であり、変化するのはそれだけだからです。変わらずに何度も訪ねonDraw()
てくるのはもったいない。TalkingFrameLayout
ありがとう