我正在尝试根据位图做一个菜单。菜单本身应该可以通过screentouch移动事件移动,基本上我想在视图上拖动按钮。该按钮还包括碰撞检测,因此无论何时触摸它们都会相互反弹。
但是在绘制我的位图时遇到了一些问题。目前我正在使用矩形来缩放我的位图以适应我的设备窗口。想要我想要的,目前无法获得我的位图更平滑的动作而不会闪烁。是开启gl的唯一选择吗?或者我错过了我的代码中的一些重要内容?
这是在我的surfaceview中绘制每个按钮,其中MenuButton是保存位图的类,并根据触摸和拖动移动更新其位置。
protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.WHITE);
for(MenuButton menuButton : menuButtonSprites) {
menuButton.onDraw(canvas);
}
}
我希望位图缩放到每个设备的宽度,为此我使用矩形来适应位图。
public MenuButton(MenuView v, Bitmap bmp, int yPosition){
this.menuView = v;
this.menuButton = bmp;
this.xMax = v.getWidth();
this.yPosistion = yPosition;
menuButtonRectangle = new Rect(xMin, this.yPosistion-yMin, xMax, this.yPosistion+yMax);
}
public void update(int y){
if(menuButtonPressed)
{
this.yPosistion = y;
menuButtonRectangle.set(xMin, yPosistion-yMin, xMax, yPosistion+yMax);
}
}
public void onDraw(Canvas canvas){
canvas.drawBitmap(menuButton, null, menuButtonRectangle, null);
}
我还有一个更新绘图的线程
public void run() {
long ticksPS = 1000 / FPS;
long startTime;
long sleepTime;
Canvas c = null;
while (running) {
startTime = System.currentTimeMillis();
try {
c = view.getHolder().lockCanvas();
synchronized (view.getHolder()) {
view.onDraw(c);
}
}
finally {
if (c != null) {
view.getHolder().unlockCanvasAndPost(c);
}
}
sleepTime = ticksPS - (System.currentTimeMillis() - startTime);
try {
if (sleepTime > 0)
sleep(sleepTime);
else
sleep(10);
}
catch (Exception e) {
}
}
}
我真的不知道我做错了什么以及为什么我无法让按钮顺利移动。这是使用画布的缺点还是我错过了一些非常重要的东西:D?
答案 0 :(得分:0)
通常在绘画时存在同步问题时会出现此问题。这可能是由于较高的帧速率或者也可能是较低的帧速率。这些问题可以通过双缓冲或调整帧速率来修复。
双缓冲意味着,我们将创建一个屏幕大小的空位图并获取图形对象,而不是将图像直接绘制到主画布上。将所有内容绘制到位图上,然后直接将此位图绘制到主画布。