我试图学习Android图形&事件handeling为多人游戏。Android,无法在模拟器上绘制基于Touch或MotionEvent的视图
的构建块林开发一些代码,将利用基于触摸/移动事件点的路径,但林无法得出,没有东西画在模拟器
我有3个简单的类(MyPoint,GameCanvas类,游戏):
1)MyPoint类封装X & y位置,得出方法绘制基于这些位置的点
public class MyPoint {
private float x;
private float y;
Paint pWhite = new Paint(R.color.white);
public MyPoint(float x, float y) {
this.x = x;
this.y = y;
}//end const
public void draw(Canvas canvas) {
canvas.drawPoint(this.x, this.y, pWhite);
}//end method
}//end MyPoint Class
2)的GameCanvas是将要绘制在视图中,这类负责对于 其对事件通过实施OnTouchListener处理,onThouch()方法
public class GameCanvas extends View implements OnTouchListener {
//keep track on points created by touch events
java.util.List<MyPoint> pointsList = null;
public GameCanvas(Context context) {
super(context);
setFocusable(true);
setFocusableInTouchMode(true);
setOnTouchListener(this);
pointsList = new java.util.Stack();
}//end const
//onDraw iterates through points that were added during motion/touch events and calls the MyPoint.draw(canvas)
@Override
protected void onDraw(Canvas canvas) {
MyPoint p = null;
for (int i = 0; i < pointsList.size(); i++) {
p = (MyPoint) pointsList.remove(i);
p.draw(canvas);
}
}//end onDraw
//implemented in order to handel touch events
public boolean onTouch(View arg0, MotionEvent event) {
int action = event.getAction();
float currentX = event.getX();
float currentY = event.getY();
//log x and y coordinates
Log.v(this.getClass().getName().toString(), "X=" + currentX);
//log x and y coordinates
Log.v(this.getClass().getName().toString(), "Y=" + currentY);
if (action == MotionEvent.ACTION_DOWN) {
// log action down
Log.v(this.getClass().getName().toString(), "MotionEvent = ACTION_DOWN");
pointsList.add(new MyPoint(currentX, currentY));
this.invalidate();
} else if (action == MotionEvent.ACTION_MOVE) {
//log action move
Log.v(this.getClass().getName().toString(), "MotionEvent = ACTION_MOVE");
pointsList.add(new MyPoint(currentX, currentY));
this.invalidate();
} else if (action == MotionEvent.ACTION_UP) {
//log action move
Log.v(this.getClass().getName().toString(), "MotionEvent = ACTION_UP");
pointsList.add(new MyPoint(currentX, currentY));
this.invalidate();
}
//call invalidate in order to call trigger onDraw()
return true;
}//end onTouch()
}//end GameCanvas class
3)游戏类是活动推出的GameCanvas查看
public class Game extends Activity {
GameCanvas newGameCanvas = null;
@Override
public void onCreate(Bundle savedInstanceState) {
//create GameCanvas object
newGameCanvas = new GameCanvas(this);
super.onCreate(savedInstanceState);
setContentView(newGameCanvas);
//
newGameCanvas.requestFocus();
}//end OnCreate
}//end Game class
那么,我能说什么:调试它。编写代码只是一个部分,让它工作是另一个:)。尝试找到你的问题:验证触摸是否进入你的视图(请参阅onTouch()的日志),然后检查每次触摸后是否执行onDraw(应该是无效的结果),检查列表(它是否有点..)等等......你很快就会缩小问题范围,并且能够确定bug – 2012-02-13 02:21:01
由于某些原因,他们没有被记录,我无法查看日志。想到的一个问题是鼠标点击/拖在emaulator被视为触摸事件 – cyber101 2012-02-13 03:15:03
只是一个疯狂的猜测,尝试addind setClickable(true),看看点击和触摸是否会通过 – 2012-02-13 23:34:49