Android 解决hellocharts与ViewPager滑动冲突以及有且仅有一组数据时不显示的问题

Android 解决hellocharts与ViewPager滑动冲突以及有且仅有一组数据时不显示的问题

前言

hellocharts也很长一段时间没有更新维护了,地址在这里:https://github.com/lecho/hellocharts-android
我最近的使用中就遇到了两个问题:

  1. hellocharts与ViewPager滑动冲突
  2. 有且仅有一组数据时不显示

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)

完事

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章