如何在ListView项目中优化Animated CustomView

时间:2013-10-19 03:17:18

标签: android animation optimization android-listview android-custom-view

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

}

这是我的结果

enter image description here

这里的问题是因为动画需要调用invalidate所以它调用我不想要的层次结构中的所有onDraw()并且我认为因为它使我的ListView如此滞后在滚动期间动画。当此GaugeView ListView上的动画没有顺利运行时。

无论如何要优化这个以便我可以顺利滚动?

并且无论如何还要阻止invalidate()调用在所有视图层次结构上调用onDraw()?因为除了GaugeView之外的一切都是相同的,它会动画,它是唯一一个改变的。 onDraw()上拨打TalkingFrameLayout似乎是一种浪费,而不会改变。

谢谢

0 个答案:

没有答案