Android MPChart 可跨屏幕可滑动 扩展项目 OpenCodeMpSiChart

OpenCodeMpSiChart

seeweekend.com Git 开源区 android MPChart 可跨屏幕可滑动 扩展项目 OpenCodeMpSiChart
由于该网站服务器已停用,代码已上传到github:https://github.com/hrony/MpSiChart.git

以下是从右向左滑动效果:

这里写图片描述

app 下载

扫描二维码下载安装体验:

扫描二维码下载安装体验

点此查看Git源码 DEMO

项目git共享页快照

代码实例:


package com.seeweekend.code;
/**
 * author Keinta Powered by (SK开源) seeweekend.com/code on    2017/6/29.
 * email: hronyt@foxmail.com
 */
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
 
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        View rootView = View.inflate(this, R.layout.activity_main, null);
        setContentView(rootView);
        MpSlideableChart mpSlideableChart = new MpSlideableChart(rootView, this);
        mpSlideableChart.myonCreate();
    }
}
以上代码为activity调用方法,封装简洁易用

=====================================
对chart图格UI对象的封装代码:

package com.seeweekend.code;
 
import android.app.Activity;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.support.v4.content.ContextCompat;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.widget.LinearLayout;
 
import java.util.ArrayList;
import java.util.List;
 
import com.seeweekend.code.charting.charts.LineChart;
import com.seeweekend.code.charting.components.LimitLine;
import com.seeweekend.code.charting.components.YAxis;
import com.seeweekend.code.charting.data.Entry;
import com.seeweekend.code.charting.data.LineData;
import com.seeweekend.code.charting.data.LineDataSet;
import com.seeweekend.code.charting.data.xyvals;
import com.seeweekend.code.charting.highlight.Highlight;
import com.seeweekend.code.charting.interfaces.datasets.ILineDataSet;
import com.seeweekend.code.charting.listener.ChartTouchListener;
import com.seeweekend.code.charting.listener.OnChartGestureListener;
import com.seeweekend.code.charting.listener.OnChartValueSelectedListener;
import com.seeweekend.code.charting.utils.MpChartSetdate;
import com.seeweekend.code.charting.utils.Transformer;
 
/**
 * author Keinta Powered by (SK开源) seeweekend.com/code on 2017/6/29.
 * email: hronyt@foxmail.com
 */
public class MpSlideableChart implements OnChartGestureListener, OnChartValueSelectedListener {
    private ArrayList<Sleepdate> sleep1_linedate;//最后将这个添加到原数组里面
    private static final int controltag = 31;
    private static final int hourUtil = 2;//4
    private final static int MunitUtils = 30;//15
    private Transformer mytrans1;
    private LineChart mChart1;
    private int screenWidth, maxwidth;
  
    private Activity context;
    private View rootView;
    private final int skipleng = 1;
    private final float PointCR = 5f;
    private int maxpoint = 70;
    public MpSlideableChart(View v, Activity context) {
        this.rootView = v;
        this.context = context;
    }
    public void myonCreate() {
        sleep1_linedate = new ArrayList<>();
        mChart1 = (LineChart) rootView.findViewById(R.id.mytempchart);
      //  mChart1.setNoDataText(context.getResources().getString(R.string.isnulldate) + "");
        mChart1.getXAxis().setAxisLineWidth(0.3f);
        mChart1.getXAxis().setAxisLineColor(Color.TRANSPARENT);
        mChart1.getAxisLeft().setAxisLineWidth(0.2f);//少于 0.5F就画不出来了
        screenWidth = widthPixels(context);
        maxwidth = screenWidth * 3;
        showChartView(mChart1,getTestData());
    }
    public static int widthPixels(Activity activity) {
        DisplayMetrics mDisplayMetrics = new DisplayMetrics();
        activity.getWindowManager().getDefaultDisplay().getMetrics(mDisplayMetrics);
        int widthPixels = mDisplayMetrics.widthPixels;
        return widthPixels;
    }
    private ArrayList<Sleepdate> getTestData(){
        ArrayList<Sleepdate> sleepdateList=new ArrayList<>();
        float[] tmeplist=new float[]{28,20,25,23,27,29,18,25,28,20,19,29,20,24,23,28};
        for (int i = 0; i < tmeplist.length; i++) {
            Sleepdate sleepdate=new Sleepdate(tmeplist[i], 7, 30, "","2017-6-29 10:30:33");
            sleepdateList.add(sleepdate);
        }
        return sleepdateList;
    }
    //如果初始化进定来的是添加,就起点为00,终点为24.00 在进来时就把数据给写好,这里是画点的数据
    private synchronized void showChartView(LineChart mChart, final ArrayList<Sleepdate> sleepdate) {
        mChart.setOnChartGestureListener(this);
        mChart.setOnChartValueSelectedListener(this);
        mChart.setDrawGridBackground(false);
        mChart.setDescription("");
        mChart.setNoDataTextDescription("");
        mChart.setTouchEnabled(true);
        mChart.setDragEnabled(true);
        mChart.setScaleEnabled(false);
        mChart.setPinchZoom(false);
        mChart.setLogEnabled(false);
        mChart.setHighlightPerDragEnabled(false);
        mChart.setHorizontalScrollBarEnabled(true);
        mChart.setHorizontalFadingEdgeEnabled(true);
        mChart.setScrollContainer(true);
        if (sleepdate != null) {
            setLinedate(mChart, sleepdate);
        }
    }
    //这里把画Y轴的值改为画横线,Y值需要自定义一个布局在左边去实现它固定好就行了
    private  final int LeftYlabWith=-5;
    private synchronized void setLinedate(LineChart mChart, final List<Sleepdate> listdate) {
        mChart.setHighlightPerDragEnabled(false);
        float max = 100;
        float min = 0;
        int getcolor =Color.GREEN;
        int tolsize = listdate.size();
        if (listdate == null || listdate.size() == 0) {
            return;
        }
        float[] getyvels = new float[tolsize];
        String[] times = new String[tolsize];
        for (int i = 0; i < listdate.size(); i++) {
            getyvels[i] =listdate.get (i).getTemperature();//float) controltag;
            times[i] =listdate.get(i).getHour()+":"+listdate.get(i).getMinute();// "time";
        }
        int resize = listdate.size() / skipleng;
        float maxwith = getmaxwith(resize);
        LinearLayout.LayoutParams layoutParamsfram = new LinearLayout.LayoutParams((int) maxwith,
                LinearLayout.LayoutParams.MATCH_PARENT);
        maxwidth=(int)maxwith;
        mChart1.setLayoutParams(layoutParamsfram);
        mChart.getXAxis().setLabelsToSkip(0);//skipleng
        mChart.getXAxis().setTextSize(9);
        // 自定义一个Y 坐杯的显示方式
        LimitLine lmin = new LimitLine(min, "");
        lmin.setLineWidth(1f);
        lmin.enableDashedLine(10f, 10f, 0f);
        lmin.setLabelPosition(LimitLine.LimitLabelPosition.RIGHT_BOTTOM);
        lmin.setLineColor(Color.GRAY);
        YAxis leftAxis = mChart.getAxisLeft();
        leftAxis.removeAllLimitLines();
        leftAxis.addLimitLine(lmin);
        leftAxis.setAxisMaxValue(max);
        leftAxis.setAxisMinValue(min);
        leftAxis.enableGridDashedLine(10f, 10f, 0f);
        leftAxis.setDrawZeroLine(false);
        leftAxis.setDrawLimitLinesBehindData(true);
        xyvals xyval = new xyvals(MpChartSetdate.YSLEEPTYPE, "0", LeftYlabWith + "");
        List<xyvals> myyvals = new ArrayList<>();
        myyvals.add(xyval);
        leftAxis.setMyYvals(myyvals);
        mChart.getAxisLeft().setTextSize(MpChartSetdate.YlabTextSizeNull);
        mChart.getAxisRight().setEnabled(false);
        setTData(mChart, getcolor, getyvels, times);
    }
 
    private void setTData(LineChart mChart, final int colors, float[] getyvels,  final String[] times) {
        ArrayList<String> xVals = new ArrayList<String>();
       // ArrayList<Entry> yVals = new ArrayList<Entry>();
        ArrayList<Entry> yValsline = new ArrayList<Entry>();
        for (int i = 0; i < getyvels.length; i++) {
            String Xveltv = times[i].trim();
            if (Xveltv.endsWith("30")) {
                Xveltv = "";
            }
            xVals.add(Xveltv);//这是X轴的内容
            yValsline.add(new Entry(chicklistdate(i, getyvels), i, new String[]{times[i], (int) getyvels[i] + "", null, "null"}));
        }
        LineDataSet setline;
        if (mChart.getData() != null &&
                mChart.getData().getDataSetCount() > 0) {
            setline = (LineDataSet) mChart.getData().getDataSetByIndex(0);
            setline.setYVals(yValsline);
            setline.setColor(colors);
            setline.setDrawFilled(true);
            setline.setHighlightEnabled(false);
            setline.setHighLightColor(Color.TRANSPARENT);
            if (setline.mpChartSetdate == null) {
                setline.mpChartSetdate = new MpChartSetdate(context);
                setline.mpChartSetdate.drawLineType = 2;
            }
            setline.setLineWidth(1f);
            setline.setCircleRadius(0f);
            setline.setValueTextSize(7f);
            setline.setDrawValues(false);
            setline.setDrawCircles(false);
            setline.setMode(LineDataSet.Mode.CUBIC_BEZIER);//LineDataSet.Mode.CUBIC_BEZIER
            mChart.getData().setXVals(xVals);
            mChart.getData().notifyDataChanged();
            mChart.notifyDataSetChanged();
        } else {
            setline = new LineDataSet(yValsline, "temperature line");
            setline.setColor(colors);
            setline.setLineWidth(1f);
            setline.setCircleRadius(0f);
            setline.setValueTextSize(7f);
            setline.setDrawFilled(true);
            setline.setDrawValues(false);
            setline.setDrawCircles(false);
            setline.setHighlightEnabled(false);
            setline.setHighLightColor(Color.TRANSPARENT);
            setline.setMode(LineDataSet.Mode.CUBIC_BEZIER);//LineDataSet.Mode.CUBIC_BEZIER STEPPED
            if (setline.mpChartSetdate == null) {
                setline.mpChartSetdate = new MpChartSetdate(context);
                setline.mpChartSetdate.drawLineType = 2;
            }
            if (Build.VERSION.SDK_INT >= 18) {
                Drawable drawable = ContextCompat.getDrawable(context, R.drawable.lchartbk_stye);
                setline.setFillDrawable(drawable);
            } else {
                setline.setFillColor(colors);
            }
            ArrayList<ILineDataSet> dataSets = new ArrayList<ILineDataSet>();
            dataSets.add(setline);
            LineData data = new LineData(xVals, dataSets);
            mChart.setData(data);
            mytrans1 = mChart.getTransformer(mChart.getLineData().getDataSets().get(0).getAxisDependency());
            mChart.getData().notifyDataChanged();
            mChart.notifyDataSetChanged();
        }
        mChart.invalidate();
    }
    //传 数据列表 长度的 五分之一
    private float getmaxwith(int resize) {
        float remax = (screenWidth / 10f) * resize;
        if (remax > screenWidth * 3.5f) {
            remax = screenWidth * 3.5f;
        }
        if (remax < screenWidth) {
            remax = screenWidth;
        }
        return remax; // 最多七个屏幕的数据,华为最多画五个 屏幕 超过就画不出来,一个屏幕显示七个小时  screenWidth * 7
    }
 
    /**
     * @param index 当前值的位置
     * @param ylist 原数组
     * @return 合格值
     */
    private static float chicklistdate(int index, float[] ylist) {
        if (ylist[index] >= 0) return ylist[index];
        for (int length = index; length > 0; length--) {
            if (ylist[length] >= 0) {
                return ylist[length];
            }
        }
        for (int i = index; i < ylist.length; i++) {
            if (ylist[i] >= 0) {
                return ylist[i];
            }
        }
        return -10;
    }
 
 
    @Override
    public void onChartGestureStart(MotionEvent me, ChartTouchListener.ChartGesture lastPerformedGesture) {
        if (getTrandt() == null) {
            return;
        }
    }
 
    private float scrollx = -1555;
    @Override
    public void onChartGestureMove(MotionEvent me, ChartTouchListener.ChartGesture lastPerformedGesture) {
        if (scrollx != -1555) {
            float mov = me.getX() - scrollx;
            if (mov > 1 || mov < -1) {
                float movleng = mChart1.getScrollX() - mov;
                if (movleng < 0) {
                    movleng = 0;
                }
                if (movleng >= 0 && movleng <= (maxwidth-screenWidth+50)  && movleng != mChart1.getScaleX()) {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
                        mChart1.setScrollX((int) (movleng));
                    }
                }
            }
        }
        scrollx = me.getX();
    }
 
    @Override
    public void onChartGestureEnd(MotionEvent me, ChartTouchListener.ChartGesture lastPerformedGesture) {
        scrollx = -1555;
        if (getTrandt() != null) {
            setLinedate(getmart(), getSleep());
        }
    }
 
    private ArrayList<Sleepdate> getSleep() {
        return   sleep1_linedate;
    }
    private synchronized LineChart getmart() {
        return mChart1;
    }
    private Transformer getTrandt() {
        return mytrans1;
    }
    @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) {
    }
 
    @Override
    public void onChartTranslate(MotionEvent me, float dX, float dY) {
    }
    @Override
    public void onValueSelected(Entry e, int dataSetIndex, Highlight h) {
    }
    @Override
    public void onNothingSelected() {
    }
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值