Android MPAndroidChart LineChart如何完全忽略ViewPager触摸手势?
Android MPAndroidChart LineChart how to Ignore ViewPager touch gestures completely?
我试图让 mpandroidchart 中的折线图忽略 fragmentviewpager,并且在触摸视图时只移动折线图而不移动 viewpager。我的问题是如何存档?
我找到了这个解决方案,但不知道如何实施它也许你们可以帮助我了解如何实施它?
https://github.com/PhilJay/MPAndroidChart/issues/1885#issuecomment-267568663
public class 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;
}
}
您需要为您的图表禁用触摸,您可以使用此代码,
chart.setTouchEnabled(true);
我认为你想要的不是可滑动的视图寻呼机,因为你必须像这样创建自定义视图寻呼机
UPDATE @anomynous
建议的更改
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 替换为自定义的
我试图让 mpandroidchart 中的折线图忽略 fragmentviewpager,并且在触摸视图时只移动折线图而不移动 viewpager。我的问题是如何存档?
我找到了这个解决方案,但不知道如何实施它也许你们可以帮助我了解如何实施它? https://github.com/PhilJay/MPAndroidChart/issues/1885#issuecomment-267568663
public class 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;
}
}
您需要为您的图表禁用触摸,您可以使用此代码,
chart.setTouchEnabled(true);
我认为你想要的不是可滑动的视图寻呼机,因为你必须像这样创建自定义视图寻呼机
UPDATE @anomynous
建议的更改 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 替换为自定义的