1

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

ありがとう

4

0 に答える 0