@Override
public boolean onTouchEvent(MotionEvent event)
{
synchronized (getHolder())
{
int aktion = event.getAction();
if (aktion == MotionEvent.ACTION_DOWN)
{
touched = true;
bar.shareTouch(event.getX(), event.getY(), touched);
}
else if (aktion == MotionEvent.ACTION_UP)
{
touched = false;
bar.shareTouch(event.getX(), event.getY(), touched);
}
if (aktion == MotionEvent.ACTION_POINTER_DOWN)
{
touched2 = true;
bar.shareTouch2(event.getX(), event.getY(), touched2);
}
else if (aktion == MotionEvent.ACTION_POINTER_UP)
{
touched2 = false;
bar.shareTouch2(event.getX(), event.getY(), touched2);
}
}
return true;
}
如果第一个手指进入屏幕或离开屏幕,这是一个代码。另一个手指也一样。
public void shareTouch2(float xTouch2, float yTouch2, boolean touched2)
{
if (xTouch2 <= gameViewWidth/2) {
if (touched2 == true) {
touchedLeft2 = true;
}
else if(touched2 == false) {
touchedLeft2 = false;
}
}
else if (xTouch2 > gameViewWidth/2) {
if (touched2 == true) {
touchedRight2 = true;
}
else if(touched2 == false) {
touchedRight2 = false;
}
}
}
public void shareTouch(float xTouch, float yTouch, boolean touched)
{
if (xTouch <= gameViewWidth/2) {
if (touched == true) {
touchedLeft = true;
}
else if(touched == false) {
touchedLeft = false;
}
}
else if (xTouch > gameViewWidth/2) {
if (touched == true) {
touchedRight = true;
}
else if(touched == false) {
touchedRight = false;
}
}
}
private void moveRight()
{
x += 3;
}
private void moveLeft()
{
x -= 3;
}
private void checkTouch() {
if ((touchedLeft == true && touchedRight2 == false) || (touchedLeft2 == true && touchedRight == false)) {
moveLeft();
}
else if ((touchedLeft == false && touchedRight2 == true) || (touchedLeft2 == false && touchedRight == true)) {
moveRight();
}
else if ((touchedLeft == true && touchedRight2 == true) || (touchedLeft2 == true && touchedRight == true)) {
}
}
在checkTouch()
方法中调用onDraw()
。现在,如果我将手指放在屏幕的右侧,它会向右移动。左边相同。但是,如果我在不移除左手指的情况下向左和向右触摸,尽管它应该停止,但对象仍然向左移动。现在,当我离开左手指时,它仍然向左移动,尽管它应该向右移动。
我希望你能理解我的问题。
希望你能帮忙
答案 0 :(得分:0)
您不能只假设ACTION_POINTER_UP
事件仅针对发送的ACTION_POINTER_DOWN
手指发送。
正如ACTION_DOWN
事件总是在第一根手指触发时被触发一样,ACTION_UP
事件仅在最后手指抬起时被触发(即在那里在屏幕上没有更多的手指)。所有其他人都会得到一个ACTION_POINTER_UP
事件,即使它是开始手势的手指。
但是,Android文档会specify
每个指针都有一个唯一的id,当它第一次出现时被分配[和]保持有效,直到指针最终上升。
所以从理论上讲,你的第一个和第二个手指应该仍然具有相同的ID,无论报告它们的事件是什么。
解决方案很简单,然后:使用getPointerCount()和getPointerID()跟踪您的手指。
如果您通过使用单个计数器替换布尔touchedLeft
和touchedLeft2
来重构您的代码以解决两个以上的问题,这可能会更容易。 fingersOnLeftSide
- 它具有整洁的副作用,只需要一个shareTouch()
方法,否则会减少代码中的冗余。
修改强>
免责声明:除了您发布的内容之外,这不是我的头脑,未经测试和编写,不知道您的任何代码。不一定是解决问题的最佳方法,但我能想到的最短。
这是事件处理程序:
public boolean onTouchEvent(MotionEvent event)
{
synchronized (getHolder())
{
int aktion = event.getAction();
if (aktion == MotionEvent.ACTION_DOWN || aktion == MotionEvent.ACTION_POINTER_DOWN
|| aktion == MotionEvent.ACTION_UP || aktion == MotionEvent.ACTION_POINTER_UP)
{
bar.clearTouches();
for (int i = 0; i < event.getPointerCount(); i++) {
bar.shareTouch(event.getX(i)); // we don't need the y coordinate anyway
}
}
}
return true;
}
重写的shareTouch()
以及clearTouches()
我介绍的更简单:
private void shareTouch(float x)
{
if (x < gameViewWidth/2) {
fingersLeft++;
} else {
fingersRight++;
}
}
private void clearTouches()
{
fingersLeft = 0;
fingersRight = 0;
}
最后,新的checkTouch()
:
public void checkTouch()
{
if (fingersLeft > fingersRight) {
moveLeft();
} else if (fingersRight > fingersLeft) {
moveRight();
}
}