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