2014-10-21 23 views
8

của tôi của View Tôi có yêu cầu UX mà người dùng kích hoạt Dialog bằng cách nhấn và giữ một ô trong một số GridView.Đăng ký UP/CANCEL từ Hộp thoại khi sự kiện DOWN được kích hoạt từ LongPress

  • Trong khi Dialog được hiển thị cho người sử dụng phải có khả năng di chuyển ngón tay của họ/thumb xung quanh màn hình mà không kích hoạt các sự kiện UP/CANCEL khi họ rời khỏi bờ cõi của GridView tế bào.

  • Khi người dùng cuối cùng ngắt liên lạc với màn hình là những gì tôi đang tìm cách chụp. GridView dường như đăng ký một số mặt tích cực sai cho UP/CANCEL mà chúng tôi không thấy bằng bất kỳ chế độ xem nào khác.

  • Vấn đề là quan điểm ban đầu chụp tất cả các sự kiện liên lạc vì DOWN bị bắt bởi nó.

  • Hộp thoại đăng ký/không thấy chạm cho đến sau sự kiện UP từ chế độ xem gốc.

Tôi đã thử hủy sự kiện chạm ban đầu và sử dụng dispatchTouch(), v.v. Không vui.

Bất kỳ ý tưởng nào?

+0

Bạn có thể cụ thể hơn không? tôi không hiểu những gì bạn muốn làm. – TheRedFox

+0

Có chế độ xem trong một hoạt động hoặc đoạn kích hoạt hiển thị hộp thoại khi chế độ xem được nhấn lâu (hoạt động). Người dùng phải có thể di chuyển ngón tay của họ ra khỏi chế độ xem đã kích hoạt hộp thoại nhưng không bao giờ ngắt liên lạc với màn hình. Khi nào và chỉ khi nào, người dùng ngắt liên hệ với màn hình sẽ kích hoạt một sự kiện khác. Sự cố: khi di chuyển ra ngoài giới hạn của chế độ xem gốc ACTION_UP và/hoặc ACTION_CANCEL được kích hoạt và không có lần chạm nào được hộp thoại đăng ký (hoặc bất kỳ thứ gì khác) cho đến khi người dùng ngắt liên lạc với màn hình và chỉnh sửa lại. –

+0

Tôi đã làm điều gì đó tương tự mà không có chế độ xem lưới. Người dùng phải bấm lâu một hộp thoại sẽ xuất hiện người dùng có thể di chuyển ngón tay của mình (trong khi nhấn) ở khắp mọi nơi và khi người dùng nhấc hộp thoại ngón tay bị ẩn. Vui lòng cân nhắc tạo video và đăng video tại đây. Tôi không hiểu phần này (và không có chạm được đăng ký bởi hộp thoại (hoặc bất cứ điều gì khác) cho đến khi người dùng phá vỡ liên lạc với màn hình và chỉnh sửa.) –

Trả lời

2

Tôi đã sử dụng một cái gì đó như thế này trong một trong các dự án của tôi.

Chỉ định OnTouchListener cho mọi ô trong lưới của bạnXem và ghi đè phương thức OnTouch.

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

boolean isLongPressed; 

int mSwipeSlop = ViewConfiguration.get(context). 
       getScaledTouchSlop(); 

boolean mSwiping; 

switch (event.getAction()) { 
    case MotionEvent.ACTION_DOWN: 
     handler.postDelayed(mLongPressed, 1000); 
     break; 

    case MotionEvent.ACTION_CANCEL: 
     handler.removeCallbacks(mLongPressed); 
     break; 

    case MotionEvent.ACTION_MOVE: 
     float x = event.getX() + v.getTranslationX(); 
      float deltaX = x - mDownX; 
      float deltaXAbs = Math.abs(deltaX); 
      float y = event.getY() + v.getTranslationY(); 
      float deltaY = Y - mDownY; 
      float deltaYAbs = Math.abs(deltaY); 
      float absDist = Math.sqrt(Math.pow(deltaXAbs, 2) + Math.pow(deltaXAbs, 2)); 
      if (!mSwiping) { 
       if (absDist > mSwipeSlop) { 
        mSwiping = true; 
        handler.removeCallbacks(mLongPressed); 
       } 
      } 
     break; 

    case MotionEvent.ACTION_UP: 
     handler.removeCallbacks(mLongPressed); 
     if (isLongPressed) { 
      // DO ACTION UP 
     } 
     break; 

    default: 
     return false; 
    } 
return true; 
} 

Mở hộp thoại trong Runnable mLongĐược nén, sẽ chỉ chạy nếu người dùng chạm vào cùng một vị trí trong một giây. Bạn có thể thay đổi khoảng cách mà anh ấy có thể di chuyển và thời gian anh ấy cần nhấn để đăng ký như một cú nhấp chuột dài. Tuy nhiên, tôi khuyên bạn nên sử dụng getScaledTouchSlop() cho khoảng cách.

final Handler handler = new Handler(); 
Runnable mLongPressed = new Runnable() { 
    public void run() { 
     // OPEN DIALOG 
     isLongPressed = true; 
    } 
}; 

Bằng cách sử dụng mã này trong dự án của tôi, người dùng có thể di chuyển ngón tay quanh toàn màn hình mà không kích hoạt ACTION_UP. Chỉ khi anh ta nhấc ngón tay lên, nó được kích hoạt.

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