2011-12-21 38 views
6

Tôi có các trang cuộn ngang như trong thị trường Android (ViewPager).Cuộn ngang Xem bên trong ViewPager

Vấn đề của tôi là tôi muốn có Chế độ xem cuộn ngang trong chúng với một số hình ảnh?

Hiện tại, tôi đang có một cuộn nhỏ trong chế độ xem của mình và sau đó toàn bộ trang đang cuộn.

Cảm ơn bạn đã dành thời gian!

+0

xem [this] (http://stackoverflow.com/questions/7774642/scroll-webview-horizontally-inside-a-viewpager) trả lời. Nhưng thay vì WebView tùy chỉnh trong câu trả lời đó, bạn có thể cần mở rộng HorizontalScrollingView của mình. – grine4ka

Trả lời

0
<Linearlayout> 
    <linearlayout> 
     <scrollView> 
      <ImageView1></ImageView> 
      <ImageView2></....> 
     </scrollView> 
    </Linearlayout> 
    <EditText> 
</Linearlayout> 

Trong trường hợp trên, scrollVIew chỉ áp dụng cho hai hình ảnh không cho văn bản.

Trong trường hợp khác:

<Linearlayout> 
    <linearlayout> 
     <scrollView> 
      here listVIew with Images using listView adapter 
     </scrollView> 
    </Linearlayout> 
    <EditText> 
</Linearlayout> 

Đây scrollview được áp dụng cho chỉ ListView.

18

Bạn cần mở rộng HorizontalScrollView và chặn các sự kiện chạm. Có gì làm việc cho tôi là người mẫu sau:

public class MyScrollView extends HorizontalScrollView { 

    public MyScrollView(Context p_context, AttributeSet p_attrs) 
    { 
     super(p_context, p_attrs); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent p_event) 
    { 
     return true; 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent p_event) 
    { 
     if (p_event.getAction() == MotionEvent.ACTION_MOVE && getParent() != null) 
     { 
      getParent().requestDisallowInterceptTouchEvent(true); 
     } 

     return super.onTouchEvent(p_event); 
    } 
} 

Sau đó, thay vì sử dụng HorizontalScrollView trong cách bố trí XML của bạn, bạn cần phải sử dụng giao diện tùy chỉnh này.

gì đã giúp tôi có được giải pháp này là this post

+0

Nó hoạt động cho tôi, các giải pháp khác thì không! Nhưng có vẻ như nó vô hiệu hóa việc xử lý nhấp chuột trên các nút bên trong scrollview tùy chỉnh của bạn. Bất kỳ ý tưởng? – user1365836

+0

@ user1365836 Vâng ... có thể hơi lộn xộn ... Tôi đã sử dụng getHitRect và tìm nút chính xác được nhấn và sau đó gọi chức năng onClick của nó – Muzikant

+6

Nếu điều duy nhất bạn muốn làm là cho phép cuộn nhưng vẫn cho phép người dùng nhấp vào các phần tử bên trong, bạn chỉ cần kiểm soát mọi thứ từ bên trong onInterceptTouchEvent(). https://gist.github.com/brandondenney/b8ddd655664eb295129d – Brandon

1

Tôi đã làm lại một giải pháp và cuối cùng tìm ra một cách rất đơn giản để thực hiện nó theo cùng một cách nó được thực hiện trên Gmail: các HorizontalScrollView sẽ di chuyển cho đến khi nó đạt đến một các cạnh của nó. Sau đó, trên cuộn tiếp theo, toàn bộ trang sẽ cuộn.

Tất cả những gì cần thiết là ghi đè HorizontalScrollView để kiểm tra hướng cuộn so với cạnh và cũng đảm bảo nội dung thực sự có thể cuộn.

@Override 
public boolean onTouchEvent(MotionEvent ev) 
{ 
    if (no_scrolling) 
     return false; 

    // Standard behavior 
    // 
    return super.onTouchEvent(ev); 
} 

boolean no_scrolling = false; 
float old_x, old_y; 
@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) 
{ 
    int action = ev.getActionMasked(); 
    Log.d(at_data.TAG, "HSV scroll intercept: " + String.format("0x%08x", action)); 

    if (action == MotionEvent.ACTION_DOWN) 
    { 
     old_x = ev.getX(); 
     old_y = ev.getY(); 
     no_scrolling = false; 

    } 
    else if (action == MotionEvent.ACTION_MOVE) 
    { 
     float dx = ev.getX() - old_x; 
     float dy = ev.getY() - old_y; 

     if (Math.abs(dx) > Math.abs(dy) && dx != 0) 
     { 
      View hsvChild = getChildAt(0); 
      int childW = hsvChild.getWidth(); 
      int W = getWidth(); 

      Log.d(at_data.TAG, "HSV " + childW + " > " + W + " ? dx = " + dx + " dy = " + dy); 
      if (childW > W) 
      { 
       int scrollx = getScrollX(); 
       if ((dx < 0 && scrollx + W >= childW) || (dx > 0 && scrollx <= 0)) 
       { 
        Log.d(at_data.TAG, "HSV Wider: on edge already"); 
        no_scrolling = true; 
        return false; 
       } 
       else 
       { 
        Log.d(at_data.TAG, "HSV Wider: can scroll"); 
        no_scrolling = false; 
       } 
      } 
      else 
      { 
       Log.d(at_data.TAG, "HSV cannot scroll in desired direction"); 
       no_scrolling = true; 
      } 
     } 
    } 

    // Standard behavior 
    // 
    return super.onInterceptTouchEvent(ev); 
}