2012-06-29 3 views
1

Я уже задал этот вопрос, но в то время мне показалось, что время обновления между событиями onTouch - это моя проблема Android onTouch refresh rate. Но это не так. Итак, снова моя проблема: Мне нужен Sprite, двигающийся влево/вправо/вверх, пока мой палец касается экрана. Так что мой onTouchEvent возвращает true. Но это работает только в том случае, если мой палец немного поскользнется или если драйверы с сенсорным экраном настолько хуже, что он так сильно дрожит, что обнаруживается как движение пальца. У меня есть решение с Threads. Поэтому я запускаю Thread, который перемещает игрока, который прерывается при поднятии пальца. Но, может быть, есть лучший способ сделать это?Сделайте какое-то действие, пока палец вниз

@Override 
public boolean onTouchEvent(MotionEvent me) { 
    ... 
if (me.getY() < getHeight()/2) { 
    return doAction(0); 
} else if (me.getX() >= getWidth()/2) 
    return doAction(2); 
else if (me.getX() < getWidth()/2) 
    return doAction(1); 
//doAction returns TRUE 
... 

}

+0

передать событие движения к детектору жест он даст метод и движение скорости для мониторинга и реагировать соответствующим образом –

+0

Методы GestureDetector срабатывают только один раз ... – bluewhile

+0

да это сделал, но вы можете управлять, чтобы получить его работа –

ответ

1

хорошо я справился с потоками. Вот часть doAction.

if (event == MotionEvent.ACTION_DOWN) { 
      movePlayer = new Thread() { 
       public void run() { 
        while (!this.isInterrupted()) { 
         if (main.player.x > 5 
           && now.getLevel()[playerXsc][playerYsc] == Level.FLAG_SKY 
           && now.getLevel()[playerXsc][playerY2sc] == Level.FLAG_SKY) { 
          main.player.x -= 4; 
         } else if (main.player.x <= 5 && now instanceof L9) 
          main.player.x = aspectX * 19; 
         try { 
          Thread.sleep(5); 
         } catch (InterruptedException e) { break; } 
        } 
       } 
      }; 
      movePlayer.start(); 
     } else if (event == MotionEvent.ACTION_UP) { 
      Log.e("ui", "mpt interrupt"); 
      movePlayer.interrupt(); 
     } 
0

Если ваш метод DoAction нетривиален, то это вызовет отставание в качестве будущих событий прикосновения будет «буфер» вверх ожидает ответ от этого onTouchEvent обработчика. Кроме того, вы используете больше

runOnUiThread(new Runnable() { 
    public void run() { 
     // Changes to UI here... 
    } 
}); 

информация: Activity.runOnUIThread

+0

doAction устанавливает только 2 ints объекта игрока. Это не влияет на пользовательский интерфейс. – bluewhile

0
WebView1 = (WebView) findViewById(R.id.StudyWebview); 
detector = new GestureDetector(this, this); 
WebView1.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      detector.onTouchEvent(event); 
      return true; 
     } 
    }); 

пожалуйста реализует OnGestureListener и использовать его обратный вызов метода

@Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float arg3) { 
    float dX = e2.getX() - e1.getX(); 
    float dY = e1.getY() - e2.getY(); 
    // check is all completed or return with some condition 
    if (Math.abs(dY) < SWIPE_MAX_OFF_PATH && Math.abs(velocityX) >= SWIPE_THRESHOLD_VELOCITY && Math.abs(dX) >= SWIPE_MIN_DISTANCE) { 
     // logic for left and right 
     if (dX < 0) { 

     } 

     else if (dX > 0) { 

     } 
    } 

    return true; 
} 

@Override 
public void onLongPress(MotionEvent arg0) { 

} 

@Override 
public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2, float arg3) { 

    return false; 
} 

@Override 
public void onShowPress(MotionEvent e) { 

} 

@Override 
public boolean onSingleTapUp(MotionEvent e) { 

    return false; 
} 
+0

если вы используете этот способ, если проблема не решена, просите более подробно о том, что вы на самом деле хотите реализовать с ней ......... и какой результат вы ожидаете –

+0

Я не хочу прокручивать. Я разделил экран на три части. Они взаимодействуют как кнопки. Один для прыжков, один для ходьбы справа, а другой для ходьбы влево (срабатывает doAction). Теперь, когда мой палец касается экрана, игрок должен идти влево/вправо в зависимости от того, где произошло прикосновение, и должен остановиться, когда мой палец поднимается. – bluewhile

+0

Я напишу код для этого в свободное время и скоро опубликую вам, если вы можете подождать ............. –

1
final Button b=(Button)findViewById(R.id.button1); 

    b.setOnTouchListener(new View.OnTouchListener() { 

     public boolean onTouch(View v, MotionEvent event) { 
       switch (event.getAction()) { 
       case MotionEvent.ACTION_UP: 
        b.setBackgroundResource(R.drawable.ic_launcher);  
        finish(); 
        return true; 
         case MotionEvent.ACTION_DOWN: 
       //work u want to do etc ..use all the events like this 
} 


     b.setBackgroundResource(R.drawable.ic_back);  
     return false; 
     } 
    }); 
Смежные вопросы