2011-08-02 25 views
6

Tôi có Gallery đầy đủ ImageView s và ImageView s có thể thu nhỏ và có thể dịch được. Mục tiêu của tôi là khi ImageView không còn có thể dịch sang trái/phải, Gallery sẽ cuộn. Vì vậy, đôi khi cần ImageView sự kiện cảm ứng, đôi khi cần Gallery sự kiện cảm ứng. Tôi có logic trong phương thức onTouchEvent của mình khi tôi muốn bắt tay, nhưng tôi nhận được kết quả không mong muốn. Tôi sẽ giải thích vấn đề sau khi tôi hiển thị mã của mình:Tuyên bố sự kiện chạm cảm ứng vụng về giữa các chế độ xem

// PinchZoomImageView.java 

@Override 
public boolean onTouchEvent(MotionEvent event) { 

    Log.i("PinchZoomImageView", "IM GETTING TOUCHED!"); 

    if (isPassThroughTouchEvent()) { 
     Log.i("PinchZoomImageView", "IM RETURNING FALSE!"); 
     return false; 
    } 

    getScaleDetector().onTouchEvent(event); 

    switch (event.getAction() & MotionEvent.ACTION_MASK) { 
     case MotionEvent.ACTION_DOWN: { 
      final float x = event.getX(); 
      final float y = event.getY(); 

      setLastTouchX(x); 
      setLastTouchY(y); 
      setActivePointerId(event.getPointerId(0)); 

      break; 
     } 

     case MotionEvent.ACTION_MOVE: { 
      final int pointerIndex = event.findPointerIndex(getActivePointerId()); 
      final float x = event.getX(pointerIndex); 
      final float y = event.getY(pointerIndex); 

      // Only move if the ScaleGestureDetector isn't processing a gesture. 
      if (!getScaleDetector().isInProgress()) { 
       if (isDetectMovementX()) { 
        final float dx = x - getLastTouchX(); 
        setPosX(getPosX() + dx); 
       } 

       if (isDetectMovementY()) { 
        final float dy = y - getLastTouchY(); 
        setPosY(getPosY() + dy); 
       } 

       invalidate(); 
      } 

      setLastTouchX(x); 
      setLastTouchY(y); 

      if (isAtXBound() && !isPassThroughTouchEvent()) { 

       setPassThroughTouchEvent(true); 
      } 

      break; 
     } 

     case MotionEvent.ACTION_UP: { 
      setActivePointerId(INVALID_POINTER_ID); 
      break; 
     } 

     case MotionEvent.ACTION_CANCEL: { 
      setActivePointerId(INVALID_POINTER_ID); 
      break; 
     } 

     case MotionEvent.ACTION_POINTER_UP: { 
      final int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; 
      final int pointerId = event.getPointerId(pointerIndex); 
      if (pointerId == getActivePointerId()) { 
       // This was our active pointer going up. Choose a new 
       // active pointer and adjust accordingly. 
       final int newPointerIndex = pointerIndex == 0 ? 1 : 0; 
       setLastTouchX(event.getX(newPointerIndex)); 
       setLastTouchY(event.getY(newPointerIndex)); 
       setActivePointerId(event.getPointerId(newPointerIndex)); 
      } 
      break; 
     } 
    } 

    return true; 
} 

Và đây là số Gallery của tôi. Tôi ghi đè onTouchEvent chỉ để hiển thị khi nhận được sự kiện chạm.

// SwipeGallery.java 

@Override 
public boolean onTouchEvent(MotionEvent event) { 

    Log.i("SwipeGallery", "IM GETTING TOUCHED!"); 
    return super.onTouchEvent(event); 
} 

Vì vậy, khi tôi tải lên hoạt động, tôi cố gắng vuốt từ phải sang trái. Logic để truyền thông qua sự kiện chuyển động được kích hoạt ngay lập tức, nhưng đây là đầu ra bản ghi của tôi.

08-02 10:04:47.097: INFO/PinchZoomImageView(17189): IM GETTING TOUCHED! 
08-02 10:04:47.179: INFO/PinchZoomImageView(17189): IM GETTING TOUCHED! 
08-02 10:04:47.179: INFO/PinchZoomImageView(17189): IM GETTING TOUCHED! 
08-02 10:04:47.179: INFO/PinchZoomImageView(17189): IM RETURNING FALSE! 
08-02 10:04:47.230: INFO/PinchZoomImageView(17189): IM GETTING TOUCHED! 
08-02 10:04:47.230: INFO/PinchZoomImageView(17189): IM RETURNING FALSE! 
08-02 10:04:47.230: INFO/PinchZoomImageView(17189): IM GETTING TOUCHED! 
08-02 10:04:47.230: INFO/PinchZoomImageView(17189): IM RETURNING FALSE! 
08-02 10:04:47.245: INFO/PinchZoomImageView(17189): IM GETTING TOUCHED! 
08-02 10:04:47.245: INFO/PinchZoomImageView(17189): IM RETURNING FALSE! 
08-02 10:04:47.261: INFO/PinchZoomImageView(17189): IM GETTING TOUCHED! 
08-02 10:04:47.261: INFO/PinchZoomImageView(17189): IM RETURNING FALSE! 
08-02 10:04:47.277: INFO/PinchZoomImageView(17189): IM GETTING TOUCHED! 
08-02 10:04:47.277: INFO/PinchZoomImageView(17189): IM RETURNING FALSE! 
08-02 10:04:47.296: INFO/PinchZoomImageView(17189): IM GETTING TOUCHED! 
08-02 10:04:47.296: INFO/PinchZoomImageView(17189): IM RETURNING FALSE! 
08-02 10:04:47.312: INFO/PinchZoomImageView(17189): IM GETTING TOUCHED! 
08-02 10:04:47.312: INFO/PinchZoomImageView(17189): IM RETURNING FALSE! 
08-02 10:04:47.327: INFO/PinchZoomImageView(17189): IM GETTING TOUCHED! 
08-02 10:04:47.327: INFO/PinchZoomImageView(17189): IM RETURNING FALSE! 
08-02 10:04:47.343: INFO/PinchZoomImageView(17189): IM GETTING TOUCHED! 
08-02 10:04:47.343: INFO/PinchZoomImageView(17189): IM RETURNING FALSE! 
08-02 10:04:47.360: INFO/PinchZoomImageView(17189): IM GETTING TOUCHED! 
08-02 10:04:47.360: INFO/PinchZoomImageView(17189): IM RETURNING FALSE! 
....etc. 

lần thứ hai tôi vuốt phải sang trái, tôi có được điều này:

08-02 10:27:31.573: INFO/PinchZoomImageView(17189): IM GETTING TOUCHED! 
08-02 10:27:31.573: INFO/PinchZoomImageView(17189): IM RETURNING FALSE! 
08-02 10:27:31.573: INFO/SwipeGallery(17189): IM GETTING TOUCHED! 
08-02 10:27:31.636: INFO/SwipeGallery(17189): IM GETTING TOUCHED! 
08-02 10:27:31.636: INFO/SwipeGallery(17189): IM GETTING TOUCHED! 
08-02 10:27:31.683: INFO/SwipeGallery(17189): IM GETTING TOUCHED! 
08-02 10:27:31.933: INFO/SwipeGallery(17189): IM GETTING TOUCHED! 
08-02 10:27:31.964: INFO/SwipeGallery(17189): IM GETTING TOUCHED! 
08-02 10:27:31.999: INFO/SwipeGallery(17189): IM GETTING TOUCHED! 
08-02 10:27:32.034: INFO/SwipeGallery(17189): IM GETTING TOUCHED! 

mô hình này của "sự kiện chuyển động 1st các ImageView luôn xử lý, sự kiện chuyển động 2 bộ sưu tập luôn xử lý" tiếp tục mãi mãi (Số lần xem hình ảnh mới được thực hiện cho từng vị trí trong thư viện, đó là lý do tại sao isPassThroughTouchEvent() trả về sai thời gian thứ 3, thứ 5, v.v ...). Vì vậy, chính xác những gì tôi đang thiếu ở đây? Tôi nghĩ trở về sai sẽ tuyên truyền các sự kiện liên lạc cho đến khi nó được xử lý, nhưng Gallery sẽ không mang nó lần đầu tiên, nhưng nó làm thứ hai? Điều này không có nghĩa gì với tôi. Ai có ý tưởng gì không? Cảm ơn.

+0

Bạn đã thử clearFocus() trên thư viện chưa? – bgs

+0

Tôi muốn giữ cho nó một cách tiếp cận từ dưới lên, nơi 'ImageView' và' Gallery' không biết rằng nó tồn tại và không cần. Hơn nữa, bất kỳ hành động nào được thực hiện trên 'Thư viện' sẽ không ảnh hưởng đến kết quả vuốt đầu tiên của tôi khi' Thư viện' không bao giờ nhận được bất kỳ sự kiện chạm nào. –

+0

Tôi là curios làm thế nào để giải quyết điều này, WhatPassThroughTouchEvent() trông như thế nào? – bgs

Trả lời

3

Khi chế độ xem trả về true trên sự kiện chuyển động xuống (ACTION_DOWN), chế độ xem đó được "khóa" làm mục tiêu chuyển động chạm. Điều này có nghĩa là nó sẽ nhận các sự kiện chuyển động tiếp theo cho đến sự kiện cuối cùng bất kể nó xảy ra ở đâu trên màn hình (xem thread), trừ khi phụ huynh wantsallowed để chặn sự kiện.

Để giải thích tình hình của bạn:

  1. Trên swipe đầu tiên, bạn ImageView xử lý chuyển động xuống mà làm cho nó trở thành mục tiêu chuyển động (xem bản ghi). Điều đó có nghĩa là tất cả các sự kiện chuyển động tiếp theo sẽ được gửi đến nó và vì Gallery của bạn không chặn các sự kiện, trình xử lý onTouchEvent của nó sẽ không được gọi.

  2. Trên lần vuốt thứ hai, ImageView không xử lý chuyển động xuống (được hiển thị trong nhật ký có "IM GETTING TOUCH!" + "IM RETURNING FALSE!") Và chuyển sự kiện cho trình xử lý tiếp theo, trong này trường hợp Gallery sẽ chạy trình xử lý onTouchEvent của nó. Theo mặc định, Gallery luôn xử lý sự kiện xuống, khóa sự kiện này làm mục tiêu chuyển động.

+0

Vì vậy, tôi đã thử gửi lại một 'MotionEvent' thay đổi hành động thành' ACTION_DOWN' thông qua 'MotionEvent.obtain (MotionEvent)' và 'dispatchTouchEvent (MotionEvent)' với cùng một kết quả. Sự kiện này được gửi đến 'onTouchEvent (MotionEvent)' của ImageView của tôi, tôi đã xác minh đó là một hành động xuống và nó trả về false, với cùng một kết quả như được hiển thị ở trên. –

+0

Gửi lại 'MotionEvent' sẽ không thay đổi bất cứ điều gì. Khi một khung nhìn đã trở thành một mục tiêu chuyển động (bằng cách xử lý sự kiện xuống), nó sẽ bị khóa làm mục tiêu chuyển động lên đến sự kiện cuối cùng, trừ khi phụ huynh chặn nó. Những gì bạn cần kiểm tra là tại sao 'isPassThroughTouchEvent()' trả về true trên lần vuốt thứ hai. –

+0

Bởi vì tôi đặt nó thành sự thật. Xem bên trong trường hợp cho 'ACTION_MOVE' ở dưới cùng. Các boolean được thiết lập chính xác khi tôi cần nó, vì vậy nó không phải là vấn đề. Về cơ bản, tôi cần một cách để giải phóng "khóa" chế độ xem hình ảnh của tôi có trên sự kiện cảm ứng khi boolean đó được đặt thành true. –

Các vấn đề liên quan