自定义视图与很多的canvas.drawCircle调用。缓慢的用户界面

时间:2015-06-12 11:18:31

标签: android

我有一个自定义视图,在其draw calls中执行了很多onDraw method

@Override
public void onDraw(Canvas canvas) {
    System.out.println("start drawing");
    for(Wall w : wallManager.walls) {
        drawWall(w, canvas);
    }
    for(int[] particle : particleManager.getParticles())    {
        drawParticle(particle[0],particle[1], canvas);
    }


    int x = (int) (Math.sin(angle) * 1000);
    int y = (int) (Math.cos(angle) * 1000);
    canvas.drawLine(getWidth()/2, getHeight()/2, getWidth()/2+x, getHeight()/2+y, anglePaint);
    System.out.println("stop drawing");
}

drawParticle被召唤至少5000次。

现在,当我按下一个随机按钮时,GUI感觉真的很迟钝,并且onclick处理程序被调用了很长的延迟。我也收到以下警告:

Skipped 40 frames!  The application may be doing too much work on its main thread.

我的第一个想法是自定义视图的onDraw方法太慢,但后来我发现在点击按钮的整个过程中从未调用过onDraw方法。

我的 layout.xml 文件非常简单,如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout"
android:layout_width="match_parent" android:layout_height="match_parent"
tools:context=".HomeActivity"
android:orientation="vertical">


<TextView android:id="@+id/section_label"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="nothing"/>
<TextView android:id="@+id/step_count"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="nog geen stappen"/>

<Button
    android:layout_width="match_parent"
    android:id="@+id/start_queueingButton"
    android:layout_height="wrap_content"
    android:text="Start queueing"/>

<smartps.tudelft.views.MapView
    android:id="@+id/map_view"

    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:layout_gravity="center_horizontal"
    />

    </LinearLayout>

但奇怪的是:when I remove the drawParticle calls from the onDraw method, the issue disappears

当我在没有调用onDraw的情况下触摸按钮时,Android会重新绘制我的自定义视图吗?

1 个答案:

答案 0 :(得分:0)

将除MapView之外的所有视图放在一个单独的容器中解决了问题。我认为涟漪效应(适用于按钮父视图的背景)会导致MapView重绘而不调用onDraw。