我开发了一款游戏,当玩家使用onTouchListener
替换我的自定义SurfaceView
和Thread
时触摸屏幕。
但现在我想改变方法,而不是onTouchListener
我将onTouchEvent
添加到SurfaceView
我的活动中。
问题在于,当我点击模拟器时,我得到某种偏移 一切都很好,除了偏移不断出现,我不明白为什么。
另外,我要提一下我的应用程序是在横向模式下运行,也许这是相关的。
我怀疑它无法正常工作,因为onTouchListener
已添加到视图中并依赖于它,但onTouchEvent
并不依赖于视图。
此外,我的视图没有任何填充或边距属性,它是全屏视图(fill_parent
)。
有没有人对此有任何想法?
答案 0 :(得分:0)
我完成了我的申请,现在一切正常,但我仍然不知道问题是什么。
在对我的应用程序进行大量调试后,onTouchEvent
返回的随机Y值始终高于onTouchListener
返回的值。而且我不确定为什么这是hapening,因为我的观点认为onTouchListener
是一个全屏视图。
所以我想办法通过做一些数学来通过这个。
android调用的第一个函数是onTouch
方法,它提供正确的值,但只需一次触摸。我需要它才能在MotionEvent.ACTION_MOVE
上提供正确的值,所以我注意到MotionEvent.ACTION_MOVE
实际上是正确的,具体取决于onTouchEvent
识别的第一次触摸。
所以我只是从onTouch
获得了坐标Y,而onTouchEvent
的偏移量的不同坐标计算了差异,并从那里计算了每个onTouchEvent
,直到用户抬起他们的手指,我只是减去这个差异,这给了我正确的价值。
如果其他人有这个问题,并且不知道如何修复它,这里是我的代码,也许它会有所帮助。
@Override
public boolean onTouchEvent(MotionEvent arg1) {
/*you can only touch when the thread is running*/
if(game.state() != STATE_PAUSE){
if(arg1.getAction() == MotionEvent.ACTION_DOWN){
coordinateX = arg1.getX();
coordinateY = arg1.getY();
differenceY = Math.abs(coordinateY - touchedY);
coordinateY = coordinateY - differenceY;
shootingIsOkay = true;
game.setDrawCircle(coordinateX,coordinateY);
}
if(arg1.getAction() == MotionEvent.ACTION_MOVE){
coordinateX = arg1.getX();
coordinateY = arg1.getY();
coordinateY = coordinateY - differenceY;
shootingIsOkay = true;
game.setDrawCircle(coordinateX,coordinateY);
}
if(arg1.getAction() == MotionEvent.ACTION_UP){
shootingIsOkay = false;
}
}
return false;
}
从依赖于视图的onTouch
调用的onTouchListener
方法很简单,在这里:
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
touchedY = arg1.getY();
return false;
}
如果有人知道如何解决这个问题,请发布您的回答,我很好奇为什么会这样?