【问题标题】:Horizontal Scroll View inside ViewPagerViewPager 内的水平滚动视图
【发布时间】:2014-09-26 19:27:02
【问题描述】:

我在 android 市场 (ViewPager) 中有水平滚动页面。

我的问题是我想在其中包含一些图像的水平滚动视图?这可能吗??

现在,我在我的视图中滚动一点,然后整个页面都在滚动。

感谢您的宝贵时间!

【问题讨论】:

  • 观看this 回答。但是,您可能需要扩展您的 Horizo​​ntalScrollingView,而不是该答案中的自定义 WebView。

标签: android


【解决方案1】:

您需要扩展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

帮助我找到了这个解决方案

【讨论】:

  • 它适用于我,其他解决方案不适用!但它似乎禁用了自定义滚动视图内按钮的点击处理。有什么想法吗?
  • @user1365836 是的......这可能有点乱......我所做的是使用 getHitRect 并找到按下的确切按钮,然后调用它的 onClick 函数
  • 如果您只想允许滚动但仍允许用户单击其中的元素,您只需从 onInterceptTouchEvent() 内部控制所有内容。 gist.github.com/brandondenney/b8ddd655664eb295129d
  • 我在 ViewPager 中有几个片段,它允许左右滑动。问题出在其中一个片段中,我有一个自定义图表视图,该视图使用触摸事件来确定在何处绘制垂直线(该线充当图表 x 轴上的“光标”)。水平拖动光标导致 ViewPager 将其拦截为页面滑动。所以我覆盖了图表的 onInterceptTouchEvent() (参见上面@Brandon 的评论),这完美地解决了这个问题:触摸 INSIDE 图表拖动光标,但触摸 OUTSIDE 图表仍然按应有的方式滑动页面。谢谢布兰登!
  • @Muzikant 你能给我举个关于onClick()的例子吗?
【解决方案2】:

我重新设计了一个解决方案,最后找到了一种非常简单的方法来实现它,就像在 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);
}

【讨论】:

    【解决方案3】:
    <Linearlayout>
        <linearlayout>
            <scrollView>
               <ImageView1></ImageView>
               <ImageView2></....>
            </scrollView>
        </Linearlayout>
        <EditText>
    </Linearlayout>
    

    在上述情况下,scrollVIew 仅适用于两个图像,不适用于编辑文本。

    其他情况:

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

    这里的scrollView只适用于listView。

    【讨论】:

      猜你喜欢
      • 2017-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-18
      • 1970-01-01
      • 2013-03-07
      相关资源
      最近更新 更多