Android - MPAndroidChart 中的拖动在 ScrollView 中时无响应

Posted

技术标签:

【中文标题】Android - MPAndroidChart 中的拖动在 ScrollView 中时无响应【英文标题】:Android - Dragging in MPAndroidChart is unresponsive when contained in ScrollView 【发布时间】:2015-10-28 22:26:50 【问题描述】:

我有一个包含在 ScrollView 中的 LineChart。当图表足够长以至于用户需要滚动才能完整查看图表时,拖动功能将变得无响应。只有当我的手指在图表边界内短时间按住然后拖动时,才会注册拖动手势。

我尝试过使用requestDisallowInterceptTouchEvent 方法来防止图表的父级拦截触摸事件(但这并不能解决任何问题)。我还尝试将 ScrollView 注册的 MotionEvents 直接传递给图表/将拖动手势转换为 translateY 调用,但这并没有达到我的预期。

注意:缩放继续正常工作。

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

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

编辑:LineChart 有一个固定的高度

【问题讨论】:

您找到解决方案了吗? 【参考方案1】:

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

    在 xml 上的图形上添加了一个透明视图。 在视图上设置 setOnTouchListener

例如

     clickInterceptorGraph.setOnTouchListener(new View.OnTouchListener() 
           @Override
           public boolean onTouch(View v, MotionEvent event) 

            return onTouchActionHandler(v, event);

            
        );
    在 MotionEvent Action Down 上,我将 requestDisallowInterceptTouchEvent 设置为 true 并返回 false,这样事件就不会被消耗,所以当用户在图形上按下透明图像时 requestDisallowInterceptTouchEvent 将为 true,它将禁用滚动视图上的触摸事件将禁用滚动,当您释放触摸时,滚动视图将再次正常工作。

例如

 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;
    

*** 您可以在 setOntouchListener 上执行所有操作,但在我的情况下,我需要重用 requestDisallowInterceptTouchEvent。

【讨论】:

这个答案很好!有用。我的情况是我想向下存储 (x, y) 的动作,然后我想检测 dx > dy 是否让拖动图表显示值并继续拖动图表而不计算 dx 和 dy 的第一个动作移动。但是,如果第一步 dx 【参考方案2】:

与 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

【讨论】:

以上是关于Android - MPAndroidChart 中的拖动在 ScrollView 中时无响应的主要内容,如果未能解决你的问题,请参考以下文章

Android MPAndroidChart--使用柱状图

Android MPAndroidChart--使用柱状图

如何在Android中使用MPAndroidChart绘制面积图?

Android 使用开源表格框架MPAndroidChart

Android图表库MPAndroidChart——条形图的绘制过程过程,隐隐约约我看到了套路

如何在 Android 中使用 MPAndroidChart 自定义饼图?