2012-02-07 44 views
5

Tôi đang sử dụng ViewPager trong ứng dụng của mình có bố cục hình ảnh nằm ngang để triển khai thư viện được phân trang.Android - Cài đặt cuộn ViewPager

Khi tôi kiểm tra chế độ xem một mình, tức là chế độ xem chính của một hoạt động, nó hoạt động tốt. Tuy nhiên, khi tôi bao gồm điều này như là một phần của bố cục khác, việc di chuyển (hoặc vuốt) trở nên kỳ lạ. Nếu dường như thiết lập lại vị trí ban đầu của nó xung quanh một nửa thông qua một swipe (flicks thực sự nhanh chóng là điều duy nhất tôi đã nhận được để làm việc cho đến nay).

Bất kỳ ý tưởng nào về sự cố có thể là gì?

Chỉ trong trường hợp nó có bất kỳ mức độ liên quan nào, chế độ xem được tăng cao từ XML và được thêm vào một lớp được thừa hưởng PagerAdapter.

Trả lời

9

Vâng, ViewPager và các mục cuộn khác không hoạt động tốt cùng nhau theo mặc định. Khi tôi phải làm những điều như vậy, tôi thường phân lớp ViewPager để làm điều gì đó nhận thức được trẻ em có thể cuộn. Sau đó, trong onInterceptTouchEvent() của tôi, tôi kiểm tra xem các hit rect là trong đó đứa trẻ và không đánh chặn các sự kiện liên lạc để đứa trẻ có một Whack vào nó. Một cái gì đó như thế này:

/** 
* Override to not intercept touch events within our scroller if it exists. 
*/ 
@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 
    if(scrollerId != 0) { 
     View scroller = findViewById(scrollerId); 
     if(scroller != null) { 
      Rect rect = new Rect(); 
      scroller.getHitRect(rect); 
      if(rect.contains((int)ev.getX(), (int)ev.getY())) { 
       return false; 
      } 
     } 
    } 
    return super.onInterceptTouchEvent(ev); 
} 

Sau đó, tất cả bạn cần là một cách để thiết lập rằng scrollerId (một phương pháp nào đơn giản hoạt động).

Lưu ý một cách khác là nếu bạn đang sử dụng một ScrollView cho theo chiều dọc yếu tố di chuyển với ViewPagertrẻ em, bạn sẽ cần phải đi một hướng khác. Có một lớp con của ScrollView phát hiện các hướng cuộn dọc và bails để cuộn ngang để ViewPager chọn nó.

@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 
    switch (ev.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      xDistance = yDistance = 0f; 
      lastX = ev.getX(); 
      lastY = ev.getY(); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      final float curX = ev.getX(); 
      final float curY = ev.getY(); 
      xDistance += Math.abs(curX - lastX); 
      yDistance += Math.abs(curY - lastY); 
      lastX = curX; 
      lastY = curY; 
      if (xDistance > yDistance) 
       return false; 
    } 

    return super.onInterceptTouchEvent(ev); 
} 
+0

Có thể sẽ xuống đến MotionEvents ... không bao giờ hiểu nhiều thứ nhưng có thể mã mẫu sẽ giúp tôi đến đó ... Tôi sẽ thử ngay bây giờ –

+0

Yup ... công trinh. Tuy nhiên, kể từ khi tôi bắt đầu hiểu điều này ngay bây giờ, tôi nghĩ rằng tôi sẽ có một vấn đề khác ngay từ khi tôi có ý định để có hình ảnh trong ViewPager có thể nhấp và họ cần phải bắt đầu hoạt động. Bất kỳ lời khuyên về điều đó .... Tôi nghĩ rằng tôi nên bắt ACTION_MOVE và để cho ACTION_DOWN đi tương tự như ví dụ thứ hai của bạn. –

+0

Không, đó không phải là quá nhiều của một vấn đề. Đặt 'onClickListener' của bạn trên' ImageView' và đảm bảo đặt chúng là có thể nhấp (trong bố cục XML hoặc trong mã) và bạn sẽ không sao. Hành động nhấp chuột hơi khác so với các sự kiện di chuyển. –

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