Android MotionEvent ACTION_MOVE效率。如何提高性能?

时间:2011-12-13 04:59:45

标签: android performance ontouchevent

我目前正在开发一款允许免费绘图的应用。

我目前使用的方法如下:

currentLine是一个列表,用于保存ACTION_MOVE返回的所有点的历史记录。

public boolean onTouchEvent (MotionEvent event) {

        switch (event.getAction()) {
            case MotionEvent.ACTION_MOVE:
                Point p = new Point(event.getX(),event.getY());
                currentLine.addPoint(p);
                    invalidate();
                break;
        }

        return true;

}

然后我接受这些观点并用我班级的onDraw方法绘制它们。

@Override
protected void onDraw(Canvas c) {
    super.onDraw(c);

    //Draw Background Color
    c.drawColor(Color.BLUE);

    //Setup Paint
    Paint p = new Paint();
    p.setStyle(Style.FILL);
    p.setColor(COLOR.WHITE);

    //iterate through points
    if(currentLine.size()>0){
        for(int x = 0;x<currentLine.size();x++){
            c.drawCircle(currentLine.get(x).getX(), currentLine.get(x).getY(), 3, p);
        }
    }

}

这种方法效果很好,没有任何延迟或任何事情。

除此之外,它没有足够的所需的点数。

例如,如果我要在整个屏幕上快速拖动手指,它可能只会绘制整个事件的15个点。

如何提高MotionEvent的性能/速度?如何获得更多积分?或者我还应该做些什么呢?

---- ---- EDIT

我自己设法解决了。

我没有使用drawCircle,而是切换到drawLine

示例:

if(points.size()>0){
        for(int x = 0;x<points.size()-1;x++){
            c.drawLine(points.get(x).getX(), points.get(x).getY(), points.get(x+1).getX(), points.get(x+1).getY(), p);
        }
}

这会产生实线,这就是我想要的。

但是,出于知识的考虑,我仍然想知道如何加速MotionEvents。

我们将非常感谢

4 个答案:

答案 0 :(得分:7)

您还应该通过使用event.getHistoricalX / Y()函数

获得更多积分

答案 1 :(得分:7)

显然,瓶颈是绘图方法。

如果您正在使用Android 3.0+,请在GPU上绘制所有这些疯狂的东西。 添加属性

android:hardwareAccelerated="true"

到清单中的<application>标记。这将令人难以置信地增加绘画时间。

此外,如果只需要更新一点,请尽量不重绘整个事物。 调用invalidate(Rect dirty)而不是invalidate()。

答案 2 :(得分:0)

在动作事件中放一个小线程睡眠;当大量的运动事件阻塞了听众时,这帮助我解决了这个问题。

Thread.sleep(100);

答案 3 :(得分:0)

无效();对性能有害。尝试计算bounds rect并调用invalidate(bounds)