2019独角兽企业重金招聘Python工程师标准>>>
在MPAndroidChart中,有时候显示在图表中的数据太多,想要分页加载数据时,可以调用setOnChartGestureListener这个事件,然后在onChartGestureStart、onChartGestureEnd和onChartTranslate方法中进行做相关的处理。
当然,要让MPAndroidChart中的图表可滑动,必须设置mBarChart.setTouchEnabled(true); mBarChart.setDragEnabled(true)。在滑动事件中,判断是否滑动到图表的最右边的尽头(即最后一个entry),可以使用mBarChart.getHighestVisibleXIndex();获取在可视区域中显示在x轴最右边的entry的index,这样就可以把这个index和当前总的数据的个数进行比较,然后进行相关的处理了。(mBarChart.getLowestVisibleXIndex()是获取在可视区域中,显示在x轴最左边的index,可以根据这个index,处理刷新数据)
代码如下:
mBarChart.setOnChartGestureListener(new OnChartGestureListener() {
@Override
public void onChartGestureStart(MotionEvent me, ChartTouchListener.ChartGesture lastPerformedGesture) {
mIsCanLoad = false;
}
@Override
public void onChartGestureEnd(MotionEvent me, ChartTouchListener.ChartGesture lastPerformedGesture) {
int rightXIndex = mBarChart.getHighestVisibleXIndex(); //获取可视区域中,显示在x轴最右边的index
int size = mBarChart.getBarData().getXVals().size();
if(lastPerformedGesture == ChartTouchListener.ChartGesture.DRAG){
mIsCanLoad = true;
if(rightXIndex == size-1 || rightXIndex == size){
mIsCanLoad = false;
//加载更多数据的操作
}
}
}
@Override
public void onChartLongPressed(MotionEvent me) {
}
@Override
public void onChartDoubleTapped(MotionEvent me) {
}
@Override
public void onChartSingleTapped(MotionEvent me) {
}
@Override
public void onChartFling(MotionEvent me1, MotionEvent me2, float velocityX, float velocityY) {
}
@Override
public void onChartScale(MotionEvent me, float scaleX, float scaleY) {
Log.i("My","onChartScale");
}
@Override
public void onChartTranslate(MotionEvent me, float dX, float dY) {
if(mIsCanLoad){
int rightXIndex = mBarChart.getHighestVisibleXIndex(); //获取可视区域中,显示在x轴最右边的index
int size = mBarChart.getBarData().getXVals().size();
if(rightXIndex == size-1 || rightXIndex == size){
mIsCanLoad = false;
//加载更多数据的操作
}
}
}
});
在以上的代码中,onChartGestureEnd和onChartTranslate两个地方都做处理,因为在滑动的时候,当手离开了图表时(调用onChartGestureEnd),图表还会继续滑动(调用onChartTranslate),此时,如果手指离开了图表的时候,图表没有滑动到最后一个数据项,而由于惯性,继续滑动到最后一个数据项,此时就可以触发加载更多了。