2011-12-21 124 views
6

我在android市场(ViewPager)中有水平滚动页面。ViewPager内部的水平滚动视图

我的问题是,我想有一个水平滚动视图在他们的一些图像吗?

现在,我在我的视图中看到一个小滚动,然后整个页面滚动。

谢谢你的时间!

+0

watch [this](http://stackoverflow.com/questions/7774642/scroll-webview-horizo​​ntally-inside-a-viewpager)answer。但是,在该答案中,您可能需要扩展Horizo​​ntalScrollingView,而不是定制WebView。 – grine4ka 2013-10-30 09:19:54

回答

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

在上述情况下,scrollVIew仅适用于两个图像,不适用于edittext。

在其他情况下:

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

这里滚动视图是只适用于ListView控件。

18

您需要扩展HorizontalScrollView并截获触摸事件。什么工作对我来说是下面的示例:

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); 
    } 
} 

然后,而不是在你的布局XML使用HorizontalScrollView,你需要使用这个自定义视图。

什么帮助我得到这个解决方案是this post

+0

它适用于我,其他解决方案不!但它似乎禁用了自定义滚动视图内的按钮上的点击处理。任何想法? – user1365836 2012-11-06 11:19:04

+0

@ user1365836是啊......这可能有点麻烦......我所做的是使用getHitRect,并找到确切的按钮,然后调用它的onClick函数 – Muzikant 2012-11-07 02:29:44

+6

如果你想做的唯一的事情是允许滚动,但仍然允许用户点击里面的元素,你只需要控制onInterceptTouchEvent()中的所有内容。 https://gist.github.com/brandondenney/b8ddd655664eb295129d – Brandon 2013-02-07 17:29:30

1

我已经重新设计一个解决方案,终于找到了实现它以同样的方式它已经在Gmail上做了一个非常简单的方法:在Horizo​​ntalScrollView将滚动,直到它达到一个它的边缘。然后在下一个滚动时,整个页面将滚动。

所需的全部内容是覆盖Horizo​​ntalScrollView来检查滚动方向与边缘,并确保内容可以实际滚动。

@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); 
}