Android MPAndroidChart LineChart如何完全忽略ViewPager触摸手势?

时间:2019-07-01 12:48:43

标签: java android android-fragments android-viewpager linechart

我正在尝试使mpandroidchart中的折线图忽略fragmentviewpager,并且仅在触摸视图时移动折线图,而不移动viewpager。我的问题是如何存档?

我找到了此解决方案,但不知道如何实施。Maybee,你们可以帮助我理解如何实施它吗? https://github.com/PhilJay/MPAndroidChart/issues/1885#issuecomment-267568663

公共类PagerAdapter扩展FragmentStatePagerAdapter {

int mNumberOfTabs;

public PagerAdapter(FragmentManager fm, int NumberOfTabs) {
    super(fm);
    this.mNumberOfTabs = NumberOfTabs;
}

@Override
public Fragment getItem(int position) {
    switch (position) {
        case 0:
            IncomeOutcomeOverviewFragment incomeOutcomeOverviewFragment = new IncomeOutcomeOverviewFragment();
            return incomeOutcomeOverviewFragment;
        case 1:
            IncomeFragment incomeFragment = new IncomeFragment();
            return incomeFragment;
        case 2:
            OutcomeFragment outcomeFragment = new OutcomeFragment();
            return outcomeFragment;
        default:
            return null;
    }
}



@Override
public int getCount() {
    return mNumberOfTabs;
}

}

2 个答案:

答案 0 :(得分:0)

您需要禁用图表的触摸,可以使用此代码,

chart.setTouchEnabled(true);

答案 1 :(得分:0)

我认为您想要的也不是可滑动视图的寻呼机,因此您必须创建这样的自定义视图寻呼机

由@anomynous建议的

UPDATE 更改

 public class NonSwipeableViewPager extends ViewPager {

        boolean enabled = false;

        public NonSwipeableViewPager(Context context) {
            super(context);
            setMyScroller();
        }

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

        @Override

        public boolean onInterceptTouchEvent(MotionEvent event) {
            if (this.enabled) {
                return false;
            }
            return super.onInterceptTouchEvent(event);

        }

        @SuppressLint("ClickableViewAccessibility")
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            if (this.enabled) {
                return false;
            }
            return super.onTouchEvent(event);

        }

        //down one is added for smooth scrolling

        private void setMyScroller() {
            try {
                Class<?> viewpager = ViewPager.class;
                Field scroller = viewpager.getDeclaredField("mScroller");
                scroller.setAccessible(true);
                scroller.set(this, new MyScroller(getContext()));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        public class MyScroller extends Scroller {
            public MyScroller(Context context) {
                super(context, new DecelerateInterpolator());
            }

            @Override
            public void startScroll(int startX, int startY, int dx, int dy, int duration) {
                super.startScroll(startX, startY, dx, dy, 350 /*1 secs*/);
            }
        }

        public void setPagingDisabled(boolean enabled) {
            this.enabled = enabled;
        }
    }

Then on my linechart I used onChartGestureStart and onChartGestureEnd to enable or disable the pageview:

    @Override
        public void onChartGestureStart(MotionEvent me, ChartTouchListener.ChartGesture lastPerformedGesture) {
            nonSwipeableViewPager.setPagingDisabled(true);
        }

        @Override
        public void onChartGestureEnd(MotionEvent me, ChartTouchListener.ChartGesture lastPerformedGesture) {
            nonSwipeableViewPager.setPagingDisabled(false);
        }

用xml中的自定义视图替换默认的viewpager