画布中的平滑位图移动(android)

时间:2013-04-10 12:50:42

标签: android canvas bitmap ondraw

我尝试使用加速计传感器创建一个带有移动球和孔的迷宫。使用以下代码,球落入洞中,但性能非常糟糕,我将加速度计频率设置为最快,但除了平滑之外,其他一切都是如此。我做了第二个画布,因为我可以画个洞。

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

它的解决非常难看,因为当他掉进洞里时,我只是把球拉向其他位图。还有其他办法吗?

性能也非常糟糕,我将Accelerometer-Sensor-Delay设置为最快,但球不能顺畅运行。当我移除线canvas.drawBitmap(bitmap, 0, 0, paint);时,球更平滑,但木制背景消失了。

1 个答案:

答案 0 :(得分:0)

这里的问题是你一直在做大量的绘图,这需要时间来绘制,而且性能会非常低。

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

你可能最好有一个带有静态东西的视图(背景图像和孔),并且在你的布局上有一个第二个视图,它只是在绘制球。

在背景图片上,不要调用invalidate。这样你只需要绘制一次背景。

并且您可以使顶部图像(仅限球)无效,因此可以重新绘制新位置。

我不确定这最后一部分:但是你可能需要打电话给invalidate(rect);通过前一次球的区域,让背景只重绘那个小区域(而不是整个屏幕)

快乐的编码。