[Android]HelloCharts实现动态加载数据

来源:互联网 发布:铁十字勋章淘宝 编辑:程序博客网 时间:2024/06/14 18:19

最近项目中用到了折线图,找了几个.最后还是选择了hellocharts.需求要加载八万个点,这么多直接就卡死了,所以做了修改,实现边滑动边加载点.

hellocharts里的ChartScroller.class里有用来计算滚动时x轴可见距离的方法,那么可以在这里设置回调函数,将当前屏幕可见的x轴位置获取出来,然后在list中取对应位置的点去加载.

1.在ChartScroller类中中加入回调函数,分别在测量距离和滑动的方法中,即computeScrollOffset和scroll方法中使用回调

private onScrollListener onScrollListener;   /**     * 设置回调接口     */    public void setOnScrollListener(onScrollListener onScrollListener)    {        this.onScrollListener = onScrollListener;    }    public interface onScrollListener    {        /**         * 当进行滑动时,将x点坐标记录         */public void onScroll(float x,float y);    }//曲线滑动过程中public boolean computeScrollOffset(ChartComputator computator) {if (scroller.computeScrollOffset()) {// The scroller isn't finished, meaning a fling or programmatic pan// operation is// currently active.computator.computeScrollSurfaceSize(surfaceSizeBuffer);scrollerStartViewport.set(computator.getCurrentViewport());//Log.e("computeScrollOffset", "x--" + scrollerStartViewport.left//+ " :y--" + scrollerStartViewport.right);//计算时回调if(onScrollListener !=null){onScrollListener.onScroll(scrollerStartViewport.right,scrollerStartViewport.left);}final Viewport maxViewport = computator.getMaximumViewport();computator.computeScrollSurfaceSize(surfaceSizeBuffer);final float currXRange = maxViewport.left + maxViewport.width()* scroller.getCurrX() / surfaceSizeBuffer.x;final float currYRange = maxViewport.top - maxViewport.height()* scroller.getCurrY() / surfaceSizeBuffer.y;computator.setViewportTopLeft(currXRange, currYRange);return true;}return false;}

2.在ChartTouchHandler类中同样设置回调,并在computeTouch方法中的move事件中接收回调         

 private onChartScrollListener onChartScrollListener; /**    * 设置回调接口    */   public void setOnChartScrollListener(onChartScrollListener onChartScrollListener)   {       this.onChartScrollListener = onChartScrollListener;   }   public interface onChartScrollListener   {       /**        * 当进行滑动时,将x点坐标记录        */public void onChartScroll(float x,float y);   }case MotionEvent.ACTION_MOVE:                // If value was touched and now touch point is outside of value area - clear touch and invalidate, user                // probably moved finger away from given chart value.            //滑动时设置回调             chartScroller.setOnScrollListener(new onScrollListener() {                  @Override         public void onScroll(float right, float left) {         if(onChartScrollListener !=null){         onChartScrollListener.onChartScroll(right,left);         }         }         });            if (renderer.isTouched()) {                    if (!checkTouch(event.getX(), event.getY())) {                        renderer.clearTouch();                        needInvalidate = true;                    }                }                break;

3.在AbstractChartView类中也设置回调函数,并在onTouchEvent方法中接收回调
private onScrollListener onScrollListener;/** * 设置回调接口 */public void setOnScrollListener(onScrollListener onScrollListener) {this.onScrollListener = onScrollListener;}public interface onScrollListener {/** * 当进行滑动时,将x点坐标记录 */public void onChartScroll(float x, float y);}@Overridepublic boolean onTouchEvent(MotionEvent event) {super.onTouchEvent(event);touchHandler.setOnChartScrollListener(new onChartScrollListener() {@Overridepublic void onChartScroll(float right, float left) {if (onScrollListener != null) {onScrollListener.onChartScroll(right, left);}}});if (isInteractive) {boolean needInvalidate;if (isContainerScrollEnabled) {needInvalidate = touchHandler.handleTouchEvent(event,getParent(), containerScrollType);} else {needInvalidate = touchHandler.handleTouchEvent(event);}if (needInvalidate) {ViewCompat.postInvalidateOnAnimation(this);}return true;} else {return false;}}

4.然后就可以在我们的页面中接收回调了,实现滑动加载数据

//滑动回调chart.setOnScrollListener(new onScrollListener() {@Overridepublic void onChartScroll(float right, float left) {// TODO Auto-generated method stubLog.e("xy", right + ":" + left);//是否滑动isfill = true;xList.clear();labels.clear();for (int i = (int) left; i < right; i++) {//当前可见的点加入listxList.add(dayList.get(i));//同可见的点名称加入listlabels.add(dayList.get(i).getTime());}//List mList = new ArrayList();//mList.clear();////特殊点的过滤算法//ArrayList fList = new ArrayList();//fList.clear();//int len = xList.size();//int i = 0;////加入可见范围的第一个点//if (Collections.frequency(fList, xList.get(0)) < 1) {//fList.add(xList.get(0));//}//for (i = 0; i < len; i++) {//if (i > 0 && i < len - 2) {//if ((Math.abs(xList.get(i).getPointY()//- xList.get(i + 1).getPointY())) > 10//&& Collections.frequency(mList, xList.get(i)) < 1) {//fList.add(xList.get(i));//}//// if(i!=0&&Collections.frequency(fList,//// xList.get(len/(i*10)))<1){//// fList.add(xList.get(len/(i*10)));//// }//}//}////加入可见范围的最后一个点//if (Collections.frequency(fList, xList.get(len - 1)) < 1) {//fList.add(xList.get(len - 1));//}//加载曲线数据generateData(xList);}});


不知道源码中是不是有滑动加载的方法,不过我是没有找到....然后想出了这个方法..

大家要是有更好的方法,我也希望学习学习..

原创粉丝点击