2014-11-19 2 views
2

Я пытаюсь скопировать макет в Android с помощью сенсорного прослушивателя. Я ожидаю, что MOTION_UP следует перехватить, когда пользователь коснется экрана и перетащит палец вверх по экрану. И MOTION_DOWN наоборот. Но когда я отлаживаю, вызывается как Up, так и Down.Слайд-шоу с помощью EventMotion в Android

Я пытаюсь сдвинуть макет, когда я перетаскиваю его с помощью анимации. Я не понимаю, что я делаю неправильно. Раньше у кого была такая ситуация? Любые подсказки полезны, спасибо.

Это мой код:

@TargetApi(Build.VERSION_CODES.HONEYCOMB) 
public class MainActivity extends Activity implements AnimationListener, 
     OnDragListener { 

    // Animation 
    private Animation animSlideUp; 
    private ImageView img; 
    private Rect rect; 

    @TargetApi(Build.VERSION_CODES.HONEYCOMB) 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     img = (ImageView) findViewById(R.id.interstitialImg); 
     img.setOnDragListener(this); 
     img.setOnTouchListener(new View.OnTouchListener() { 

      @Override 
      public boolean onTouch(View v, MotionEvent event) { 

       if (event.getActionMasked() == MotionEvent.ACTION_UP) { 
        System.out.println("up"); 

        rect = new Rect(v.getLeft(), v.getTop(), v.getRight(), v 
          .getBottom()); 
        v.getHitRect(rect); 
        if (rect.contains(Math.round(v.getX() + event.getX()), 
          Math.round(v.getY() + event.getY()))) { 
         System.out.println("inside"); 
         // Animation slide_up = AnimationUtils.loadAnimation(
         // getApplicationContext(), R.anim.slide_up); 
         // img.startAnimation(slide_up); 
        } else { 
         // outside 
         System.out.println("outside"); 
        } 
       } 
       if (event.getAction() == MotionEvent.ACTION_DOWN) { 
        System.out.println("down"); 
        // Construct a rect of the view's bounds 
        rect = new Rect(v.getLeft(), v.getTop(), v.getRight(), v 
          .getBottom()); 
        return true; 
       } 
       if (event.getAction() == MotionEvent.ACTION_MOVE) { 
        // if (!rect.contains(v.getLeft() + (int) event.getX(), 
        // v.getTop() + (int) event.getY())) { 
        // // User moved outside bounds 
        // System.out.println("moved outside bounds " + rect); 
        // } 
       } 
       return true; 
      } 
     }); 
    } 

    @Override 
    public void onAnimationEnd(Animation animation) { 
     // check for zoom in animation 
     if (animation == animSlideUp) { 
      System.out.println("animation: " + animation); 
      overridePendingTransition(R.anim.slide_up, R.anim.slide_up); 
      finish(); 
     } 

    } 

    @Override 
    public void onAnimationRepeat(Animation animation) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onAnimationStart(Animation animation) { 
     // TODO Auto-generated method stub 
    } 

    @SuppressLint("NewApi") 
    @Override 
    public boolean onDrag(View v, DragEvent e) { 
     if (e.getAction() == DragEvent.ACTION_DROP) { 
      System.out.println("action drop"); 
      View view = (View) e.getLocalState(); 
      ViewGroup from = (ViewGroup) view.getParent(); 
      from.removeView(view); 
      RelativeLayout to = (RelativeLayout) v; 
      to.addView(view); 
      view.setVisibility(View.VISIBLE); 
     } 
     return true; 
    } 

    @Override 
    public void onBackPressed() { 
     super.onBackPressed(); 
     overridePendingTransition(R.anim.slide_up, R.anim.slide_up); 
    } 
} 

ответ

2

Я ожидал MOTION_UP должен быть перехвачена, когда пользователь касается экрана и перетаскивает палец вверх по экрану.

Uh, no.

Docs к спасению:

общественности статической окончательный ИНТ ACTION_DOWN Прессованный жест начал движение содержит начальное местонахождение.

Думайте о ACTION_DOWN как о начале взаимодействия с пользователем. DOWN НЕ УКАЗЫВАЕТ НАПРАВЛЕНИЕ. В грубом смысле это говорит вам, что пользователь положил пальцы на экран.

Аналогично:

общественности статической окончательный ИНТ ACTION_UP Прессованный жест закончена, движение содержит окончательное расположение выпуска, а также любые промежуточные точки с момента последнего вниз или переместить событие.

Опять же, UP - это не то, что вы предполагаете. Это означает, что пользователь снял свой палец (ы) с экрана.

Давайте посмотрим на код прямо сейчас:

rect = new Rect(v.getLeft(), v.getTop(), v.getRight(), v 
         .getBottom()); 
v.getHitRect(rect); 
if (rect.contains(Math.round(v.getX() + event.getX()), 
         Math.round(v.getY() + event.getY()))) { 
    System.out.println("inside"); 
    // Animation slide_up = AnimationUtils.loadAnimation(
    // getApplicationContext(), R.anim.slide_up); 
    // img.startAnimation(slide_up); 
} else { 
    // outside 
    System.out.println("outside"); 
} 

Во-первых, getHitRect(Rect) заполняет rect вы поставляете в качестве аргумента. Таким образом, инициализация с помощью v.getLeft(), v.getTop(), v.getRight(), v.getBottom() не требуется.

Во-вторых, так как вы настраиваете в OnTouchListener на img, почему вам нужно проверить, если event.getX() и event.getY() находятся в пределах вида по? На самом деле, вы этого не делаете. Потому что onTouch(...)не будет срабатывать, если пользователь коснется наружу.

В-третьих, вам может не понадобиться реализовать OnTouchListener, чтобы сделать то, что вы хотите .. или, по крайней мере, не так, как вы сейчас. Например, если все, что вы ищете, - это если у пользователя есть flinged вид UP или DOWN, вы можете положиться на SimpleOnGestureListener. Принятый ответ на этот вопрос покажет вам, как его использовать: Android: How to handle right to left swipe gestures.

Так что же означают эти события ACTION_DOWN и ACTION_UP? Ну, вы работаете с ними, когда вам нужно более точное управление: например, реагировать на ввод пользователя сразу. Например, вы даже не можете позволить себе базовую функциональность перемещения вида по экрану с помощью SimpleOnGestureListener.