MPAndroidChart在ViewPager+Fragment滑动冲突解决

本文出自:http://blog.csdn.net/dt235201314/article/details/53894944

MPAndroidChart常见设置属性(一)——应用层 

MPAndroidChart项目实战(一)——实现对比性柱状图 

MPAndroidChart项目实战(二)——双平滑曲线(双折线图)和MarkView实现 

MPAndroidChart项目实战(三)——饼状图实现和文字重合问题解决 

MPAndroidChart项目实战(四)——柱状图实现及X轴文字不显示问题和柱状图上显示文字 

一丶慨述

这个问题在禅道上本来是交给我处理,拖了一天没解决,转交给做给的同事了,做折中处理(滑动MPChart时禁止外部滑动)

二丶直接上代码

方法一:

/**
 * 设置左右滑动
 *
 * @param barChart
 */
public static void setChartScaleX(LineChart barChart) {
    if (barChart != null) {
        float scaleX = barChart.getScaleX();
        if (scaleX <= 1.0f) { //可以左右滑动
            ChartAllFragment.setViewPageScrollEnable(true);
        } else {
            ChartAllFragment.setViewPageScrollEnable(false);
        }
    } else {
        ChartAllFragment.setViewPageScrollEnable(true);
    }
}

/**
 * 设置上下滑动
 *
 * @param scrollView
 * @param lineChart
 */
public static void setScrollViewScrolling(ScrollView scrollView, LineChart lineChart) {
    if (lineChart != null) {
        float scaleY = lineChart.getScaleY();
        if (scaleY <= 1.0f) { //可以左右滑动
            if (scrollView != null) scrollView.setEnabled(true);
        } else {
            if (scrollView != null) scrollView.setEnabled(false);
        }
    } else {
        if (scrollView != null) scrollView.setEnabled(true);
    }
}

这里页面上下滑动用的都是ScrollView

代码思路:scaleX和scaleY是图标是否放大(1f为正常),左右滑动MpChart时关闭fragment左右滑动,执行MpChart的,上下滑动时则关闭MpChart的打开ScrollView的

最后监听里调用方法:

linechart.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        boolean isScaled = linechart.getScaleX() != 1.0 && linechart.getScaleY() != 1.0;
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            setChartScaleX(linechart);
            setScrollViewScrolling(scrollView, linechart);
            linechart.getParent().requestDisallowInterceptTouchEvent(isScaled);
            return false;
        } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
            return false;
        } else if (event.getAction() == MotionEvent.ACTION_UP) {
            ChartAllFragment.setViewPageScrollEnable(true);
            scrollView.setEnabled(true);
            return false;
        } else {
            return false;
        }
    }
});

到达效果:MPchart能左右滑动时,fragment不滑动

方法二:

使用改装集成后的LintChart

public class LineChartInViewPager extends LineChart {

    PointF downPoint = new PointF();

    public LineChartInViewPager(Context context) {
        super(context);
    }

    public LineChartInViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public LineChartInViewPager(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @SuppressLint("ClickableViewAccessibility")
    @Override
    public boolean onTouchEvent(MotionEvent evt) {
        switch (evt.getAction()) {
            case MotionEvent.ACTION_DOWN:
                downPoint.x = evt.getX();
                downPoint.y = evt.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                LogUtils.i("getScrollX ", getScrollX() + "" );
                if (getScaleX() > 1 && Math.abs(evt.getX() - downPoint.x) > 5) {
                    getParent().requestDisallowInterceptTouchEvent(true);
                }
                break;
        }
        return super.onTouchEvent(evt);
    }
}


  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值