Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 水平滚动视图内部视图寻呼机_Android - Fatal编程技术网

Android 水平滚动视图内部视图寻呼机

Android 水平滚动视图内部视图寻呼机,android,Android,我有水平滚动页面,就像android market(ViewPager)一样 我的问题是,我想有一个水平滚动视图,其中有一些图像?这是可能的 和现在一样,我在视图中得到一个小滚动条,然后整个页面都在滚动 谢谢你的时间 在上述情况下,scrollVIew仅适用于两个图像,而不适用于edittext 在其他情况下: 这里是使用listVIew适配器的带有图像的listVIew 此处scrollView仅适用于listView。您需要扩展水平scrollView并拦截触摸事件。对我有效的是以下

我有水平滚动页面,就像android market(ViewPager)一样

我的问题是,我想有一个水平滚动视图,其中有一些图像?这是可能的

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

谢谢你的时间


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

在其他情况下:


这里是使用listVIew适配器的带有图像的listVIew

此处scrollView仅适用于listView。

您需要扩展
水平scrollView
并拦截触摸事件。对我有效的是以下示例:

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


帮助我找到这个解决方案的是

我重新设计了一个解决方案,并最终找到了一个非常简单的方法来实现它,就像在GMail上一样:HorizontalScrollView将滚动到它的一个边缘。然后在下一次滚动时,整个页面将滚动

它所需要的只是覆盖HorizontalScrollView,以检查滚动方向与边缘,并确保内容确实可以滚动

@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);
}
@覆盖
公共事件(MotionEvent ev)
{
如果(无滚动)
返回false;
//标准行为
//
返回super.onTouchEvent(ev);
}
布尔无滚动=假;
飘浮的老x,老y;
@凌驾
公共布尔值onInterceptTouchEvent(MotionEvent ev)
{
int action=ev.getActionMasked();
Log.d(位于_data.TAG,“HSV滚动截获:”+String.format(“0x%08x”,action));
if(action==MotionEvent.action\u DOWN)
{
old_x=ev.getX();
old_y=ev.getY();
无滚动=错误;
}
else if(action==MotionEvent.action\u MOVE)
{
float dx=ev.getX()-old_x;
float dy=ev.getY()-old_y;
if(Math.abs(dx)>Math.abs(dy)&&dx!=0)
{
查看hsvChild=getChildAt(0);
int childW=hsvChild.getWidth();
int W=getWidth();
Log.d(在_data.TAG,“HSV”+childW+“>”+W+“?dx=“+dx+”dy=“+dy”);
如果(childW>W)
{
int scrollx=getScrollX();

如果((dx<0&&scrollx+W>=childW)|(dx>0&&scrollx它对我有效,其他解决方案不行!但它似乎禁用了自定义scrollview中按钮的单击处理。有什么想法吗?@user1365836是的……这可能有点混乱……我所做的是使用getHitRect,找到按下的确切按钮,然后调用其onClick函数,如果您只想允许滚动的话虽然仍允许用户单击其中的元素,但您只需从onInterceptTouchEvent()内部控制所有内容。我在一个允许左右滑动的ViewPager中有几个片段。问题在于其中一个片段我有一个自定义图表视图,它使用触摸事件来确定在何处绘制垂直线(该线沿图表的x轴充当“光标”)。水平拖动光标会导致ViewPager将其截取为页面滑动。因此,我覆盖了图表的onInterceptTouchEvent()(请参见上面的@Brandon注释),这很好地解决了这个问题:触碰图表内部会拖动光标,但触碰图表外部仍会像它应该的那样滑动页面。谢谢Brandon!!@Muzikant你能给我举一个关于
onClick()
的例子吗。关注答案。但是你可能需要扩展你的HorizontalScrollingView,而不是答案中的自定义WebView。