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

在画布中平滑位图移动(android),android,canvas,bitmap,ondraw,Android,Canvas,Bitmap,Ondraw,我试图用加速度传感器创建一个迷宫,里面有一个移动的球和一个洞。使用下面的代码,球会掉进洞里,但是性能非常差,我将加速度计的频率设置为最快的,但是除了平滑之外,一切都很顺利。我做了第二块画布,因为这样我可以做一个洞 public RenderView(Context context, int width, int height) { super(context); playGround = new Rect(40, 40, width - 40, height - 40);

我试图用加速度传感器创建一个迷宫,里面有一个移动的球和一个洞。使用下面的代码,球会掉进洞里,但是性能非常差,我将加速度计的频率设置为最快的,但是除了平滑之外,一切都很顺利。我做了第二块画布,因为这样我可以做一个洞

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(位图,0,0,paint)时,则球会更平滑,但木制背景会消失

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

这里有一些你应该如何处理的技巧

你最好有一个静态的视图(背景图像和洞),在你的布局上有第二个视图,在上面画球

在背景图像上,不要调用invalidate。这样你只需要画一次背景

顶部图像(仅球)可以无效,因此它可以在新位置上重新绘制

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


愉快的编码。

成功了,我将它分成了不同的视图,谢谢!现在更平滑了。