Horizo​​ntalScrollView onTouch

时间:2014-05-27 06:48:42

标签: android

我正在使用水平滚动视图,它的工作正常,我在水平滚动视图中有2个Web视图,我的问题是,当你在Web视图中向下或向上滚动时,它会向左或向右滚动到另一个Web视图由于水平滚动视图,我使用此代码

HorizontalScrollView hv = (HorizontalScrollView)findViewById(R.id.horizontalScrollView2);
    webView22.setOnTouchListener(new View.OnTouchListener() {
private String TAG;

        public boolean onTouch(View v, MotionEvent event) {
            Log.v(TAG,"PARENT TOUCH");
            findViewById(R.id.webView22).getParent().requestDisallowInterceptTouchEvent(false);
            return false;
        }
    });
    webView22.setOnTouchListener(new View.OnTouchListener() {

        private String TAG;
        public boolean onTouch(View v, MotionEvent event)
        {
            Log.v(TAG,"CHILD TOUCH");
             //  Disallow the touch request for parent scroll on touch of child view
            findViewById(R.id.webView23).getParent().requestDisallowInterceptTouchEvent(true);
            return false;
        }
    });

当我使用TAG时我收到错误说字段 FragmentActivity .TAG不可见

但是当我添加私有字符串标签时;它走了,无论如何我不确定它是否正确,

在我测试之后,webView22是好的还是很好的但是如果我想使用水平向右和向左移动它将无法正常工作,

我试图将CHILD TOUCH更改为 BUTTON_BACK 但仍然相同。我认为标签没有做任何事情只是去

   findViewById(R.id.webView22).getParent().requestDisallowInterceptTouchEvent(false);
   return false;

我希望有人可以提供帮助

2 个答案:

答案 0 :(得分:0)

实际上,这里的情况是水平滚动视图和Web视图都使用滚动事件。现在,Android操作系统很难决定这个滚动事件应该转到哪个侦听器。

此选项将使用幻灯片动画而不是水平滚动视图。

fragmentTransaction.setCustomAnimations(R.anim.slide_bottom_in,
                                               R.anim.slide_bottom_out,R.anim.slide_bottom_in,
                                               R.anim.slide_bottom_out);

但是这些将再次需要通过某些事件触发。点击按钮。

或者您可以选择view pager implementation.

答案 1 :(得分:0)

我遇到了同样的问题,有一些方法,但是其中许多方法需要更改布局,大多数情况下,在Horizo​​ntalScrollView的子级中有子级的情况下,错误的数据会发送到Horizo​​ntalScrollView的子级。

所以我做了这样的事情,而不是:

  

val childA = horizo​​ntalScrollView.getChild(0)    childA.setOnTouchListener(this)

  

horizo​​ntalScrollView.setOnTouchListener(this)

通过这种方式,您必须计算点击次数和致电次数,但对我来说,它的工作原理比以前更好,滚动之前的速度很慢且出现故障。

var touchHistory=0
var lastTouchX=0f
override fun onTouch(v: View?, event: MotionEvent?): Boolean {
    if (event == null || v == null) return false
    when {
        event.action == MotionEvent.ACTION_DOWN -> {
            touchHistory=0
            lastTouchX=event.x
            // Screen1=0-480 / Screen2=0-2304 / ScrollPos=0-2304
            // Sample: 240 480 - 576 2304 = 240+576 = result
            val child = (v as HorizontalScrollView).getChildAt(0)
            val sXCurrent = event.x.toDouble()
            val sXMax = v.width.toDouble()
            val s2XCurrent = scrollX
            val s2XMax = child.width
            val clickPos = s2XCurrent+sXCurrent
            val result = clickPos/s2XMax
            // Do something

        }
        event.action == MotionEvent.ACTION_UP -> {
            if(touchHistory==0){
            //Click performed, do something
            }
            //if touchHistory > 0 is currently scrolling and click is omitted
            lastTouchX=event.x
            touchHistory=0
        }
        event.action == MotionEvent.ACTION_MOVE -> {
            if(event.x!=lastTouchX)touchHistory++ //Check wether is clicking or scrolling
            lastTouchX=event.x
        }
    }

    return false
}