【发布时间】:2015-04-23 17:08:43
【问题描述】:
我有一个名为OurView 的课程。我有 3 个 Buttons 调用 moveImage() 并根据它是哪个 Button 传递两个数字。
moveImage() 应该改变xCoord 和yCoord 的值,它似乎是这样做的。当从moveImage() 打印xCoord 和yCoord 时,它们会显示正确的值。
但是当从delay() 或doDraw() 打印时,它们显示的原始值是 500。
我是否在做不正确的事情导致变量无法更新?
这是OurView类:
package com.thatoneprogrammerkid.gameminimum;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class OurView extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder holder;
private Handler handler = new Handler();
private Bitmap testimg;
private int xCoord = 500;
private int yCoord = 500;
int xPos;
int yPos;
public OurView(Context context) {
super(context);
init();
}
public OurView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public OurView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
private void init() {
holder = getHolder();
holder.addCallback(this);
testimg = BitmapFactory.decodeResource(getResources(),R.drawable.testimg);
}
void moveImage(int xChange, int yChange) {
this.xCoord = this.xCoord + xChange;
this.yCoord = this.yCoord + yChange;
System.out.println("Move Image");
printCoords();
}
void printCoords() {
System.out.println(xCoord);
System.out.println(yCoord);
}
void delay() {
System.out.println("Delay");
printCoords();
handler.postDelayed(new Runnable() {
public void run() {
Canvas canvas = getHolder().lockCanvas();
System.out.println("Run");
printCoords();
if(canvas != null){
synchronized (getHolder()) {
doDraw(canvas, xCoord, yCoord);
}
holder.unlockCanvasAndPost(canvas);
}
}
}, 33);
}
void doDraw(Canvas canvas, int x, int y) {
xPos = this.xCoord + (testimg.getWidth()/2);
yPos = this.yCoord + (testimg.getHeight()/2);
System.out.println("Draw");
printCoords();
canvas.drawARGB(255, 55, 255, 255);
canvas.drawBitmap(testimg, x, y, null);
delay();
}
@Override
public void surfaceCreated(final SurfaceHolder holder) {
delay();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {}
}
这是处理按钮按下的类:
package com.thatoneprogrammerkid.gameminimum;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.os.Bundle;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
public class SurfaceViewExample extends Activity {
OurView gameView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
gameView = new OurView(this);
setContentView(R.layout.activity_surface_view_example);
}
public void arrowPressed(View view) {
switch (view.getId()) {
case R.id.arrowLeft:
gameView.moveImage(-1,0);
break;
case R.id.arrowRight:
gameView.moveImage(1,0);
break;
case R.id.arrowUp:
gameView.moveImage(0,1);
break;
}
}
}
编辑:
为了澄清,按下按钮 10 次后 moveImage() 中的 printCoords() 显示如下:
510
500
所有其他位置的 printCoords() 显示如下:
500
500
【问题讨论】:
-
delay() 或 doDraw() 显示原始值 500 女巫是正确的,你期望什么?
-
你是在调用 moveImage() 之后调用 delay() 还是 doDraw()。另外,你能检查一下 moveImage 的参数,以确保它们不是 0, 0 吗?
-
我 100% 确定 moveImage 的参数不是 0,0。就像我在帖子中所说的那样,如果我使用 moveImage 更改 xCoord 和 yCoord,然后从 moveImage 中打印它们,它们会反映正确的值(每次按下增加一,因此在按下 moveImage 中的打印功能 10 次后打印“510 / n 500")