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);

}

这是我归档的结果

在此处输入图像描述

这里的问题是因为动画需要调用 invalidate 所以它调用了我不想要的层次结构中的所有 onDraw() ,我认为因为它ListView在动画期间滚动时让我很迟钝。当这个 GaugeView 上没有动画时 ListView 运行流畅。

无论如何要优化它以便我可以流畅地滚动?

并且无论如何都可以防止在所有视图层次结构上调用 invalidate() 调用 onDraw() ?因为一切都是一样的,除了GaugeView它会动画而且它是唯一改变的。一次又一次地拜访onDraw()我而不改变似乎是一种浪费。TalkingFrameLayout

谢谢

4

0 回答 0