MPAndroidChart的使用

https://github.com/PhilJay/MPAndroidChart

MPAndroidchart是一个很强大的图表第三方库,功能强大,基本可以满足大多数要求,由于在项目使用到了lineChart和BarChart,现在记录下

public class BarChartManager implements OnChartValueSelectedListener {

    private BarChart mChart;
    private Context mContext;
    private XAxis mXAxis;
    private YAxis mLeftAxis;

    public BarChartManager(BarChart chart, Context context) {
        mContext = context;
        mChart = chart;
        initLineChar();
    }

    /**
     * 设置图表的样式
     */
    public void initLineChar() {
        mChart.setDrawBarShadow(false);
        //设置柱状图Value值显示在柱状图上方 true 为显示上方,默认false value值显示在柱状图里面
        mChart.setDrawValueAboveBar(true);
        //设置描述
        mChart.getDescription().setEnabled(false);
        mChart.setTouchEnabled(true);

        MyMarkerView mv = new MyMarkerView(mContext, R.layout.custom_marker_view);
        //        mv.setChartView(mChart); // For bounds control
        mChart.setMarker(mv);

        // scaling can now only be done on x- and y-axis separately
        //按比例
        mChart.setPinchZoom(false);
        //是否能拖动
        mChart.setDragEnabled(false);
        //是否能缩放
        mChart.setScaleEnabled(false);
        //是否绘制网格背景
        mChart.setDrawGridBackground(false);
        mChart.setOnChartValueSelectedListener(this);

        mXAxis = mChart.getXAxis();
        //设置x轴文本显示位置
        mXAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
        //绘制x轴网格线
        mXAxis.setDrawGridLines(false);
        //缩放的时候有用,比如放大的时候,我不想把横轴的月份再细分
        mXAxis.setGranularity(1f); // only intervals of 1 day
        //强制有多少个刻度
        mXAxis.setLabelCount(7);
        //设置问题的旋转角度
        mXAxis.setLabelRotationAngle(0);
        //        mXAxis.setAxisLineColor(ResUtil.getColor(R.color.color_333));
        //        mXAxis.setTextColor(ResUtil.getColor(R.color.color_333));

        mLeftAxis = mChart.getAxisLeft();
        mLeftAxis.setDrawLabels(true);
        mLeftAxis.setDrawGridLines(true);
        mLeftAxis.setDrawAxisLine(false);
        mLeftAxis.setLabelCount(6, false);
        mLeftAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART);
        //        mLeftAxis.setAxisLineColor(ResUtil.getColor(R.color.color_999));
        //        mLeftAxis.setTextColor(ResUtil.getColor(R.color.color_999));
        mLeftAxis.setSpaceTop(15f);
        mLeftAxis.setAxisMinimum(0f); // this replaces setStartAtZero(true)
        mLeftAxis.setAxisMaximum(2000f);
        mLeftAxis.setDrawZeroLine(false);

        YAxis rightAxis = mChart.getAxisRight();
        rightAxis.setEnabled(false);
        mChart.getLegend().setEnabled(false);

        mChart.animateXY(2000, 2000);
    }

    public static final int[] MATERIAL_COLORS = {
            rgb("#54D6B0"), rgb("#BED3FE"), rgb("#F0C33B"), rgb("#F8964E")
    };

    /**
     * 设置数据
     *
     * @param count
     * @param range
     */
    public void showBarChart(int count, float range) {
        //模拟数据
        final String[] mDate = new String[4];
        mDate[0] = "凌晨";
        mDate[1] = "6:00";
        mDate[2] = "中午";
        mDate[3] = "18:00";

        Float[] mScore = new Float[4];
        mScore[0] = 1400f;
        mScore[1] = 1000f;
        mScore[2] = 200f;
        mScore[3] = 300f;

        //设置横坐标值
        mXAxis.setValueFormatter(new IAxisValueFormatter() {
            @Override
            public String getFormattedValue(float value, AxisBase axis) {
                if (mDate.length == 0) {
                    return "";
                }
                if (value < 0 || value > mDate.length) {
                    return "";
                }
                return mDate[(int) value % mDate.length];
            }
        });
        //        mLeftAxis.setValueFormatter(new IAxisValueFormatter() {
        //            @Override
        //            public String getFormattedValue(float value, AxisBase axis) {
        //                return null;
        //            }
        //        });

        ArrayList<BarEntry> yVals1 = new ArrayList<BarEntry>();
        for (int i = 0; i < mScore.length; i++) {
            yVals1.add(new BarEntry(i, mScore[i]));
        }


        BarDataSet set1;
        if (mChart.getData() != null && mChart.getData().getDataSetCount() > 0) {

            set1 = (BarDataSet) mChart.getData().getDataSetByIndex(0);
            set1.setValues(yVals1);
            mChart.getData().notifyDataChanged();
            mChart.notifyDataSetChanged();
            mChart.invalidate();
        } else {

            set1 = new BarDataSet(yVals1, "");
            set1.setDrawIcons(false);
            //设置柱的颜色
            set1.setColors(MATERIAL_COLORS);
            //设置高亮选中透明值
            set1.setHighLightAlpha(50);
            //绘制显示数据
            set1.setDrawValues(true);
            ArrayList<IBarDataSet> dataSets = new ArrayList<IBarDataSet>();
            dataSets.add(set1);

            BarData data = new BarData(dataSets);
            data.setValueTextSize(mContext.getResources().getDimensionPixelOffset(R.dimen.normal_7sp));
            data.setValueTextColor(ResUtil.getColor(R.color.colorAccent));
            data.setBarWidth(0.5f);

            mChart.setData(data);
            mChart.invalidate();
        }

    }

    protected RectF mOnValueSelectedRectF = new RectF();

    @Override
    public void onValueSelected(Entry e, Highlight h) {
        if (e == null)
            return;

        RectF bounds = mOnValueSelectedRectF;
        mChart.getBarBounds((BarEntry) e, bounds);
        MPPointF position = mChart.getPosition(e, YAxis.AxisDependency.LEFT);

        Log.i("bounds", bounds.toString());
        Log.i("position", position.toString());

        Log.i("x-index",
                "low: " + mChart.getLowestVisibleX() + ", high: " + mChart.getHighestVisibleX());

        MPPointF.recycleInstance(position);
    }

    @Override
    public void onNothingSelected() {

    }


}
public class LineChartManager implements OnChartValueSelectedListener, OnChartGestureListener {

    private LineChart mChart;
    private Context mContext;

    public LineChartManager(LineChart chart, Context context) {
        mContext = context;
        mChart = chart;
        initLineChar();
    }

    /**
     * 设置图标的样式
     */
    public void initLineChar() {
        //手势监听
        mChart.setOnChartGestureListener(this);
        //监听数据单击事件
        mChart.setOnChartValueSelectedListener(this);
        //是否显示网格线
        mChart.setDrawGridBackground(false);

        //是否显示描述
        mChart.getDescription().setEnabled(false);

        // 是否能触摸
        mChart.setTouchEnabled(true);

        //能否拖动
        mChart.setDragEnabled(true);
        //是否缩放
        mChart.setScaleEnabled(true);
        // mChart.setScaleXEnabled(true);
        // mChart.setScaleYEnabled(true);

        // if disabled, scaling can be done on x- and y-axis separately  按比例
        mChart.setPinchZoom(true);

        // set an alternative background color
        //         mChart.setBackgroundColor(Color.GRAY);

        // create a custom MarkerView (extend MarkerView) and specify the layout
        // to use for it
        //提示器
        MyMarkerView mv = new MyMarkerView(mContext, R.layout.custom_marker_view);
        mv.setChartView(mChart); // For bounds control
        mChart.setMarker(mv); // Set the marker to the chart

        // x-axis limit line
        //x轴限制线
        LimitLine llXAxis = new LimitLine(10f, "Index 10");
        llXAxis.setLineWidth(4f);
        llXAxis.enableDashedLine(10f, 10f, 0f);
        llXAxis.setLabelPosition(LimitLine.LimitLabelPosition.RIGHT_BOTTOM);
        llXAxis.setTextSize(10f);

        XAxis xAxis = mChart.getXAxis();
        //设置网格线和样式
        xAxis.setDrawGridLines(false);
        xAxis.enableGridDashedLine(10f, 10f, 0f);
        //        xAxis.setValueFormatter(new MyCustomXAxisValueFormatter());
        //        xAxis.addLimitLine(llXAxis); // add x-axis limit line

        //        Typeface tf = Typeface.createFromAsset(getAssets(), "OpenSans-Regular.ttf");

        LimitLine ll1 = new LimitLine(150f, "Upper Limit");
        ll1.setLineWidth(4f);
        ll1.enableDashedLine(10f, 10f, 0f);
        ll1.setLabelPosition(LimitLine.LimitLabelPosition.RIGHT_TOP);
        ll1.setTextSize(10f);
        //        ll1.setTypeface(tf);

        LimitLine ll2 = new LimitLine(-30f, "Lower Limit");
        ll2.setLineWidth(4f);
        ll2.enableDashedLine(10f, 10f, 0f);
        ll2.setLabelPosition(LimitLine.LimitLabelPosition.RIGHT_BOTTOM);
        ll2.setTextSize(10f);
        //        ll2.setTypeface(tf);

        YAxis leftAxis = mChart.getAxisLeft();
        leftAxis.removeAllLimitLines(); // reset all limit lines to avoid overlapping lines
        leftAxis.addLimitLine(ll1);
        leftAxis.addLimitLine(ll2);
        leftAxis.setAxisMaximum(200f);
        leftAxis.setAxisMinimum(-50f);
        //leftAxis.setYOffset(20f);
        leftAxis.enableGridDashedLine(10f, 10f, 0f);
        //绘制0度线
        leftAxis.setDrawZeroLine(false);
        //绘制Y轴线
        leftAxis.setDrawAxisLine(false);

        // limit lines are drawn behind data (and not on top)允许控制LimitLines之间的z轴上的实际的数据顺序。如果设置为true,LimitLines在真实数据后边绘制,,
        // 否则在上面。默认false
        leftAxis.setDrawLimitLinesBehindData(true);
        //绘制右边y轴
        mChart.getAxisRight().setEnabled(false);
        //限定可以缩放倍数
        //        mChart.getViewPortHandler().setMaximumScaleY(2f);
        //        mChart.getViewPortHandler().setMaximumScaleX(2f);

        // add data
        //        setData(45, 100);

        //        mChart.setVisibleXRange(20);
        //        mChart.setVisibleYRange(20f, AxisDependency.LEFT);
        //        mChart.centerViewTo(20, 50, AxisDependency.LEFT);

        //动画时间
        mChart.animateX(2500);
        //mChart.invalidate();

        //标注
        Legend l = mChart.getLegend();
        //标注类型
        l.setForm(Legend.LegendForm.CIRCLE);

        // // dont forget to refresh the drawing
        // mChart.invalidate();
    }


    public void showLineChart(int count, float range) {


        //模拟数据
        ArrayList<Entry> values = new ArrayList<Entry>();

        for (int i = 0; i < count; i++) {

            float val = (float) (Math.random() * range) + 3;
            //添加数据
            values.add(new Entry(i, val, mContext.getResources().getDrawable(R.drawable.star)));
        }


        LineDataSet set1;

        if (mChart.getData() != null && mChart.getData().getDataSetCount() > 0) {
            set1 = (LineDataSet) mChart.getData().getDataSetByIndex(0);
            set1.setValues(values);
            mChart.getData().notifyDataChanged();
            mChart.notifyDataSetChanged();
        } else {
            //标注内容
            set1 = new LineDataSet(values, "DataSet 1");
            //绘制数据点的图标
            set1.setDrawIcons(false);

            //连接虚线
            set1.enableDashedLine(10f, 5f, 0f);
            //            set1.enableDashedHighlightLine(10f, 5f, 0f);
            set1.setColor(Color.BLACK);
            set1.setCircleColor(Color.BLACK);
            set1.setLineWidth(1f);
            set1.setCircleRadius(3f);
            set1.setDrawCircleHole(false);
            set1.setValueTextSize(9f);
            set1.setDrawFilled(true);
            set1.setFormLineWidth(1f);
            set1.setFormLineDashEffect(new DashPathEffect(new float[]{10f, 5f}, 0f));
            set1.setFormSize(15.f);
            set1.setMode(LineDataSet.Mode.CUBIC_BEZIER);

            if (Utils.getSDKInt() >= 18) {
                //填充颜色
                Drawable drawable = ContextCompat.getDrawable(mContext, R.drawable.fade_red);
                set1.setFillDrawable(drawable);
            } else {
                set1.setFillColor(Color.BLACK);
            }

            ArrayList<ILineDataSet> dataSets = new ArrayList<ILineDataSet>();
            dataSets.add(set1); // add the datasets

            // create a data object with the datasets
            LineData data = new LineData(dataSets);

            // set data
            mChart.setData(data);
        }
    }


    @Override
    public void onChartGestureStart(MotionEvent me, ChartTouchListener.ChartGesture lastPerformedGesture) {
        Log.i("Gesture", "START, x: " + me.getX() + ", y: " + me.getY());
    }

    @Override
    public void onChartGestureEnd(MotionEvent me, ChartTouchListener.ChartGesture lastPerformedGesture) {
        Log.i("Gesture", "END, lastGesture: " + lastPerformedGesture);

        // un-highlight values after the gesture is finished and no single-tap
        if (lastPerformedGesture != ChartTouchListener.ChartGesture.SINGLE_TAP)
            mChart.highlightValues(null); // or highlightTouch(null) for callback to onNothingSelected(...)
    }

    @Override
    public void onChartLongPressed(MotionEvent me) {
        Log.i("LongPress", "Chart longpressed.");
    }

    @Override
    public void onChartDoubleTapped(MotionEvent me) {
        Log.i("DoubleTap", "Chart double-tapped.");
    }

    @Override
    public void onChartSingleTapped(MotionEvent me) {
        Log.i("SingleTap", "Chart single-tapped.");
    }

    @Override
    public void onChartFling(MotionEvent me1, MotionEvent me2, float velocityX, float velocityY) {
        Log.i("Fling", "Chart flinged. VeloX: " + velocityX + ", VeloY: " + velocityY);
    }

    @Override
    public void onChartScale(MotionEvent me, float scaleX, float scaleY) {
        Log.i("Scale / Zoom", "ScaleX: " + scaleX + ", ScaleY: " + scaleY);
    }

    @Override
    public void onChartTranslate(MotionEvent me, float dX, float dY) {
        Log.i("Translate / Move", "dX: " + dX + ", dY: " + dY);
    }

    @Override
    public void onValueSelected(Entry e, Highlight h) {
        Log.i("Entry selected", e.toString());
        Log.i("LOWHIGH", "low: " + mChart.getLowestVisibleX() + ", high: " + mChart.getHighestVisibleX());
        Log.i("MIN MAX", "xmin: " + mChart.getXChartMin() + ", xmax: " + mChart.getXChartMax() + ", ymin: " + mChart
                .getYChartMin() + ", ymax: " + mChart.getYChartMax());
    }

    @Override
    public void onNothingSelected() {
        Log.i("Nothing selected", "Nothing selected.");
    }
}

以上只是根据项目需求简单做的例子,具体情况还是要根据自己的需要更新各个参数值。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容