Android 解决hellocharts与ViewPager滑动冲突以及有且仅有一组数据时不显示的问题
前言
hellocharts也很长一段时间没有更新维护了,地址在这里:https://github.com/lecho/hellocharts-android
我最近的使用中就遇到了两个问题:
- hellocharts与ViewPager滑动冲突
- 有且仅有一组数据时不显示
hellocharts与ViewPager滑动冲突
在使用LineChartView的时候,恰好当前Activity是用ViewPager+Fragment组成的,恰好我需要左右滑动翻页。这时候LineChartView的左右滑动查看数据的触摸事件就被ViewPager给抢了。
解决方法
新建一个类继承LineChartView,拦截触摸事件。
/**
* @author D10NG
* @date on 2020/6/17 5:01 PM
*/
class FixLineChartView constructor(
context: Context,
attrs: AttributeSet?,
defStyle: Int
) : LineChartView(context, attrs, defStyle) {
constructor(context: Context) : this(context, null, 0)
constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
private var downPoint: PointF = PointF()
override fun dispatchTouchEvent(event: MotionEvent?): Boolean {
// 重点在这一句,是不是很夸张哈哈哈哈,其实是要根目录的父组件,可以根据自己的布局来修改
parent.parent.parent.parent.parent.parent.requestDisallowInterceptTouchEvent(true)
return super.dispatchTouchEvent(event)
}
override fun onTouchEvent(event: MotionEvent?): Boolean {
event?: return super.onTouchEvent(event)
when(event.action) {
MotionEvent.ACTION_DOWN -> {
downPoint.x = event.x
downPoint.y = event.y
}
MotionEvent.ACTION_MOVE -> {
if (scaleX > 1 && abs(event.x - downPoint.x) > 5) {
// 同样的这里也需要
parent.parent.parent.parent.parent.parent.requestDisallowInterceptTouchEvent(true);
}
}
}
return super.onTouchEvent(event)
}
}
有且仅有一组数据时不显示
当只有一组数据的时候不显示数据
解决方法
需要设置好两个东西,一个是maximumViewport(最大显示范围),一个是currentViewport(当前显示范围)
// 首先拿到最大显示范围
val viewPort = Viewport(binding.chart.maximumViewport)
// maxY是我的Y轴最大值,需要做的是保证viewPort.bottom不能等于viewPort.top,也就是显示范围的高度不能等于0啊
viewPort.bottom = maxY -4
viewPort.top = maxY
// 接下来设置显示宽度,左边是 -0.5f就保证了最左侧的数据能显示出来,右边的是数据量和5之间取最大值再减去0.5f,同样是保证最右侧的数据能显示出来,当然viewPort.left不能等于viewPort.right
viewPort.left = -0.5f
viewPort.right = (labelsX.size.toFloat().coerceAtLeast(5f)) -0.5f
// 设置最大显示范围
binding.chart.maximumViewport = viewPort
// currentViewport一定要在设置maximumViewport之后,不然显示的座标数据是不能左右滑动查看更多数据的
// 这是当前的现实范围
viewPort.left = 0f
viewPort.right = 3f
binding.chart.currentViewport = viewPort
// 滚动到最开头的位置
binding.chart.moveTo(-0.5f ,viewPort.bottom)