0

我尝试使用加速度计传感器创建一个带有移动球和一个洞的迷宫。使用下面的代码,球掉进了洞里,但是性能真的很差,我把加速度计频率设置为最快,但除了平滑之外,其他的都没有。我做了第二张画布,因为这样我可以打一个洞。

public RenderView(Context context, int width, int height) {
    super(context);
    playGround = new Rect(40, 40, width - 40, height - 40);
    holes.addElement(new PointF(500f, 500f));

    // Set background
    this.setBackgroundResource(R.drawable.bottom);

    // Set bitmap
    woodGround= wood.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    bitmapCanvas = new Canvas();
    bitmapCanvas.setBitmap(woodGround);

    // Set eraser paint properties
    eraserPaint.setAlpha(0);
    eraserPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
    eraserPaint.setAntiAlias(true);
}

protected void onDraw(Canvas canvas) {
    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG
            | Paint.FILTER_BITMAP_FLAG);
    paint.setStyle(Style.FILL_AND_STROKE);
    paint.setAntiAlias(true);

    if (ballInHole)
        canvas.drawBitmap(ball, b.x, b.y, paint);

    bitmapCanvas.drawBitmap(wall, 0, 0, paint);
    bitmapCanvas.drawBitmap(wood, playGround, playGround, paint);

    canvas.drawBitmap(bitmap, 0, 0, paint);

    for (PointF h : holes) {
        bitmapCanvas.drawCircle(h.x + radius, h.y + radius, radius,
                eraserPaint);
    }
    if (!ballInHole)
        canvas.drawBitmap(ball, b.x, b.y, paint);
    invalidate();
}

它解决得很丑,因为当他掉进洞里时,我只是在其他位图下面画球。还有另一种方法吗?

性能也很差,我将加速度计-传感器-延迟设置为最快,但球运行不顺畅。当我删除线canvas.drawBitmap(bitmap, 0, 0, paint);时,球更光滑,但木质背景消失了。

4

1 回答 1

0

这里的问题是你一直在做很多绘图,这需要时间来绘制并且性能变得非常低。

这里有一些关于如何处理它的提示。

您可能最好有一个带有静态内容(背景图像和孔)的视图,并在您的布局上在其顶部有第二个视图,只是绘制球。

在背景图像上,不要调用无效。这样,您将只绘制一次背景。

和顶部图像(仅限球)您可以使之无效,因此它可以在新位置上重绘。

我不确定最后一部分:但您可能需要调用invalidate(rect);上一次传球所在的区域,以使背景仅重新绘制那个小区域(而不是整个屏幕)

快乐编码。

于 2013-04-10T13:23:15.543 回答