Android-当包含在ScrollView中时,MPAndroidChart中的拖动是无响应的

Android-当包含在ScrollView中时,MPAndroidChart中的拖动是无响应的,android,scrollview,mpandroidchart,Android,Scrollview,Mpandroidchart,我有一个包含在滚动视图中的折线图。当图表足够长,用户需要滚动才能看到整个图表时,拖动功能将失去响应。只有当我在图表边界上短时间按住手指然后拖动时,才会出现拖动手势 我尝试过使用这种方法,可以防止图表的父对象拦截触摸事件(但这并不能解决任何问题)。我还尝试直接将ScrollView注册的MotionEvents传递到图表/将拖动手势转换为translateY调用,但这并没有达到我所认为的效果 注意:缩放仍然可以完美地工作 此外,当图形适合原始窗口或放置在非滚动视图的任何视图中时,这不是问题。我曾考

我有一个包含在滚动视图中的折线图。当图表足够长,用户需要滚动才能看到整个图表时,拖动功能将失去响应。只有当我在图表边界上短时间按住手指然后拖动时,才会出现拖动手势

我尝试过使用这种方法,可以防止图表的父对象拦截触摸事件(但这并不能解决任何问题)。我还尝试直接将ScrollView注册的MotionEvents传递到图表/将拖动手势转换为translateY调用,但这并没有达到我所认为的效果

注意:缩放仍然可以完美地工作

此外,当图形适合原始窗口或放置在非滚动视图的任何视图中时,这不是问题。我曾考虑过去掉ScrollView,但它是我项目中非常必要的功能

任何关于为什么会发生这种情况的想法都将不胜感激


编辑:折线图有一个固定的高度

这个问题有点老了,但我最近遇到了同样的问题,为了解决这个问题,我做了以下几点

  • 在xml上的图形上添加了一个透明视图
  • 在视图上设置setOnTouchListener
  • 在MotionEvent操作关闭时,我将RequestDisallowWinterCeptTouchEvent设置为true并返回false,这样事件就不会被消费,因此,当用户按下图形上的透明图像时,RequestDisallowWinterCeptTouchEvent将为true,它将在scrollview上禁用触摸事件,从而禁用滚动,当您释放触摸时,scrollview将再次正常工作

  • ***您可以在setOntouchListener上执行所有操作,但在我的例子中,我需要重用RequestDisallowerWinterCeptTouchEvent。

    与Ruan_Lopes提到的方法类似,您不需要透明的覆盖视图。您还可以使用图表手势侦听器以相同的方式截获触摸

    lineChart.onChartGestureListener = object : OnChartGestureListener {
        override fun onChartGestureEnd(
            me: MotionEvent?,
            lastPerformedGesture: ChartTouchListener.ChartGesture?
        ) = Unit
    
        override fun onChartFling(
            me1: MotionEvent?,
            me2: MotionEvent?,
            velocityX: Float,
            velocityY: Float
        ) = Unit
    
        override fun onChartSingleTapped(me: MotionEvent?) = Unit
    
        override fun onChartGestureStart(
            e: MotionEvent?,
            lastPerformedGesture: ChartTouchListener.ChartGesture?
        ) = recyclerView.requestDisallowInterceptTouchEvent(true)
    
        override fun onChartScale(me: MotionEvent?, scaleX: Float, scaleY: Float) = Unit
    
        override fun onChartLongPressed(me: MotionEvent?) = Unit
    
        override fun onChartDoubleTapped(me: MotionEvent?) = Unit
    
        override fun onChartTranslate(me: MotionEvent?, dX: Float, dY: Float) = Unit
    }
    

    你找到解决办法了吗?这是个好答案!它起作用了。在我的案例中,我想向下存储(x,y)个动作,然后我想检测的第一个动作是dx>dy是否允许拖动图表显示值,并继续拖动图表,而不再计算dx和dy。但是,如果第一次移动dx protected boolean onTouchActionHandler(View v, MotionEvent event){ int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: // Disallow RecyclerView to intercept touch events. scrollView.requestDisallowInterceptTouchEvent(true); Log.e(TAG, "onTouchActionHandler: ACTION_DOWN" ); // Disable touch on transparent view return false; default: return true; } }
    lineChart.onChartGestureListener = object : OnChartGestureListener {
        override fun onChartGestureEnd(
            me: MotionEvent?,
            lastPerformedGesture: ChartTouchListener.ChartGesture?
        ) = Unit
    
        override fun onChartFling(
            me1: MotionEvent?,
            me2: MotionEvent?,
            velocityX: Float,
            velocityY: Float
        ) = Unit
    
        override fun onChartSingleTapped(me: MotionEvent?) = Unit
    
        override fun onChartGestureStart(
            e: MotionEvent?,
            lastPerformedGesture: ChartTouchListener.ChartGesture?
        ) = recyclerView.requestDisallowInterceptTouchEvent(true)
    
        override fun onChartScale(me: MotionEvent?, scaleX: Float, scaleY: Float) = Unit
    
        override fun onChartLongPressed(me: MotionEvent?) = Unit
    
        override fun onChartDoubleTapped(me: MotionEvent?) = Unit
    
        override fun onChartTranslate(me: MotionEvent?, dX: Float, dY: Float) = Unit
    }