ViewPager中的水平滚动视图

时间:2011-12-21 18:11:19

标签: android

我有像Android市场一样的水平滚动页面(ViewPager)。

我的问题是我希望在其中有一些水平滚动视图和一些图像?这可能吗?

就像现在一样,我在视图中得到一个小滚动,然后整个页面都在滚动。

谢谢你的时间!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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);
}

答案 2 :(得分: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>

此处scrollView仅适用于listView。