我尝试使用加速计传感器创建一个带有移动球和孔的迷宫。使用以下代码,球落入洞中,但性能非常糟糕,我将加速度计频率设置为最快,但除了平滑之外,其他一切都是如此。我做了第二个画布,因为我可以画个洞。
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);
时,球更平滑,但木制背景消失了。
答案 0 :(得分:0)
这里的问题是你一直在做大量的绘图,这需要时间来绘制,而且性能会非常低。
这里有一些关于如何处理它的提示。
你可能最好有一个带有静态东西的视图(背景图像和孔),并且在你的布局上有一个第二个视图,它只是在绘制球。
在背景图片上,不要调用invalidate。这样你只需要绘制一次背景。
并且您可以使顶部图像(仅限球)无效,因此可以重新绘制新位置。
我不确定这最后一部分:但是你可能需要打电话给invalidate(rect);
通过前一次球的区域,让背景只重绘那个小区域(而不是整个屏幕)
快乐的编码。