当前位置:首页 > 谈天说地 > 正文内容

Android画图实现MPAndroidchart折线图示例详解

34资源网2022年07月28日 11:00326

效果图

  • 用的是3.1.0的依赖

依赖

    allprojects {
        repositories {
            jcenter()
            maven { url "https://jitpack.io" }
        }
    }
 //依赖
dependencies{
 implementation 'com.github.philjay:mpandroidchart:v3.1.0'
}

activity.xml

<?xml version="1.0" encoding="utf-8"?>
<relativelayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".mainactivity">
    <com.github.mikephil.charting.charts.linechart
        android:id="@+id/linechart"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ffffff"
        android:layout_margin="15dp"/>
</relativelayout>

mainactivity

  private linechart linechart;
    @override
    protected void oncreate(bundle savedinstancestate) {
        super.oncreate(savedinstancestate);
        setcontentview(r.layout.activity_main);
         linechart = (linechart) findviewbyid(r.id.linechart);
        //创建描述信息
        description description = new description();
        description.settext("测试图表");
        description.settextcolor(color.red);
        description.settextsize(20);
        linechart.setdescription(description);//设置图表描述信息
        linechart.setnodatatext("没有数据哦");//没有数据时显示的文字
        linechart.setnodatatextcolor(color.blue);//没有数据时显示文字的颜色
        linechart.setdrawgridbackground(false);//chart 绘图区后面的背景矩形将绘制
        linechart.setdrawborders(false);//禁止绘制图表边框的线
        //linechart.setbordercolor(); //设置 chart 边框线的颜色。
        //linechart.setborderwidth(); //设置 chart 边界线的宽度,单位 dp。
        //linechart.setlogenabled(true);//打印日志
        //linechart.notifydatasetchanged();//刷新数据
        //linechart.invalidate();//重绘
        initdate();
        initxy();
    }
private void initdate() {
        /**
         * entry 坐标点对象  构造函数 第一个参数为x点坐标 第二个为y点
         */
        arraylist<entry> values1 = new arraylist<>();
        arraylist<entry> values2 = new arraylist<>();
        values1.add(new entry(1, 10));
        values1.add(new entry(2, 15));
        values1.add(new entry(3, 20));
        values1.add(new entry(4, 5));
        values1.add(new entry(5, 30));
        values1.add(new entry(6, 15));
        values1.add(new entry(7, 6));
        values2.add(new entry(1, 20));
        values2.add(new entry(2, 15));
        values2.add(new entry(3, 13));
        values2.add(new entry(4, 8));
        values2.add(new entry(5, 9));
        values2.add(new entry(6, 12));
        values2.add(new entry(7, 15));
        //linedataset每一个对象就是一条连接线
        linedataset set1;
        linedataset set2;
//设置图例
//获取图例
legend legend=mchart.getlegend();
//是否开启设置图例
legend.setenabled(true);
//设置图例文字大小
legend.settextsize(50f);
//设置图例文字颜色
legend.settextcolor(color.blue);
//如果设置为true,那么当图例过多或者过长一行显示不下的时候就会自适应换行
legend.setwordwrapenabled(true);
//设置表格的最大相对大小,默认为0.95f(95%)
legend.setmaxsizepercent(0.95f);
//设置图例位置
legend.setposition(legend.legendposition.above_chart_left);
//设置图例形状:如square、circle、line、default
legend.setform(legend.legendform.circle);
//设置图例xy方向的间隔宽度
legend.setxentryspace(20f);
legend.setyentryspace(20f);
//设置图例标签到文字之间的距离
legend.setformtotextspace(20f);
//设置文本包装
legend.setwordwrapenabled(true);
        //判断图表中原来是否有数据
        if (linechart.getdata() != null && linechart.getdata().getdatasetcount() > 0) {
            //获取数据1
            set1 = (linedataset) linechart.getdata().getdatasetbyindex(0);
            set1.setvalues(values1);
            set2 = (linedataset) linechart.getdata().getdatasetbyindex(1);
            set2.setvalues(values2);
            //刷新数据
            linechart.getdata().notifydatachanged();
            linechart.notifydatasetchanged();
        } else {
            //设置数据1  参数1:数据源 参数2:图例名称setvalueformatter
            set1 = new linedataset(values1, "测试数据1");
            set1.setcolor(color.blue);//两个点之间的距离连接线
            set1.setcirclecolor(color.white);//数据展示的圆点颜色
            set1.setlinewidth(3f);//设置线宽
            set1.setcircleradius(3f);//设置焦点圆心的大小
            set1.enabledashedhighlightline(2f, 5f, 0f);//点击后的高亮线的显示样式
            set1.sethighlightlinewidth(1f);//设置点击交点后显示高亮线宽
            set1.sethighlightenabled(true);//是否禁用点击高亮线
            set1.sethighlightcolor(color.yellow);//设置点击交点后显示交高亮线的颜色
            set1.setvaluetextsize(9f);//设置显示值的文字大小
            set1.setmode(linedataset.mode.cubic_bezier);//直线 变成 曲线
            set1.setdrawvalues(false);  //不显示数值
//            set1.setvalueformatter(new largevalueformatter("℃"));//显示数值的样式
            //阴影填充
//            set1.setdrawfilled(true);//设置禁用范围背景填充 阴影
//            set1.setfilldrawable(getresources().getdrawable(r.drawable.line_gradient_bg_shape));
            //设置数据2
            set2 = new linedataset(values2, "测试数据2");
            set2.setcolor(color.gray);//两个点之间的距离连接线
            set2.setcirclecolor(color.white);//数据展示的圆点颜色
            set2.setlinewidth(3f);//设置线宽
            set2.setcircleradius(3f);//设置焦点圆心的大小
            set2.enabledashedhighlightline(2f, 5f, 0f);//点击后的高亮线的显示样式
            set2.sethighlightlinewidth(1f);//设置点击交点后显示高亮线宽
            set2.sethighlightenabled(true);//是否禁用点击高亮线
            set2.sethighlightcolor(color.yellow);//设置点击交点后显示交高亮线的颜色
            set2.setvaluetextsize(9f);//设置显示值的文字大小
            set2.setmode(linedataset.mode.cubic_bezier);//直线 变成 曲线
            set2.setdrawvalues(false);  //不显示数值
            //阴影填充
//            set2.setdrawfilled(true);//设置禁用范围背景填充 阴影
//            set2.setfilldrawable(getresources().getdrawable(r.drawable.line_gradient_bg_shape2));
            //保存linedataset集合
            arraylist<ilinedataset> datasets = new arraylist<>();
            datasets.add(set1); // 添加数据集
            datasets.add(set2);// 添加数据集
            //创建linedata对象 属于linechart折线图的数据集合
            linedata data = new linedata(datasets);
            // 添加到图表中
            linechart.setdata(data);
            //绘制图表
            linechart.invalidate();
        }
    }
   private void initxy() {
        arraylist<string> xvalue=new arraylist<>();//x轴时间
        xvalue.add("10-1");//当然这样可以把x轴的数据随便设置成啥都行。
        xvalue.add("10-2");
        xvalue.add("10-3");
        xvalue.add("10-4");
        xvalue.add("10-5");
        xvalue.add("10-6");
        xvalue.add("10-7");
        //获取此图表的x轴
        xaxis xaxis = linechart.getxaxis();
        xaxis.setenabled(true);//设置轴启用或禁用 如果禁用以下的设置全部不生效
        xaxis.setdrawaxisline(true);//是否绘制轴线
        xaxis.setdrawgridlines(true);//设置x轴上每个点对应的线
        xaxis.setdrawlabels(true);//绘制标签  指x轴上的对应数值
        xaxis.setposition(xaxis.xaxisposition.bottom);//设置x轴的显示位置
        xaxis.setgranularity(1);//让x轴上自定义的值和折线上相对应
        xaxis.setaxislinecolor(r.color.white);//设置横轴线的颜色
        xaxis.settextcolor(r.color.white);//设置横轴字体颜色
        xaxis.setvalueformatter(new valueformatter() {
            @override
            public string getaxislabel(float value, axisbase axis) {
                return xvalue.get((int) value - 1);
            }
        });
//        xaxis.setlabelstoskip(0);
        //xaxis.settextsize(20f);//设置字体
        //xaxis.settextcolor(color.black);//设置字体颜色
        //设置竖线的显示样式为虚线
        //linelength控制虚线段的长度
        //spacelength控制线之间的空间
//        xaxis.enablegriddashedline(0f, 0f, 0f);
//        xaxis.setaxisminimum(0f);//设置x轴的最小值
//        xaxis.setaxismaximum(10f);//设置最大值
//        xaxis.setavoidfirstlastclipping(true);//图表将避免第一个和最后一个标签条目被减掉在图表或屏幕的边缘
//        xaxis.setlabelrotationangle(0f);//设置x轴标签的旋转角度
//        设置x轴显示标签数量  还有一个重载方法第二个参数为布尔值强制设置数量 如果启用会导致绘制点出现偏差
//        xaxis.setlabelcount(10);
//        xaxis.settextcolor(color.blue);//设置轴标签的颜色
//        xaxis.settextsize(24f);//设置轴标签的大小
//        xaxis.setgridlinewidth(10f);//设置竖线大小
//        xaxis.setgridcolor(color.red);//设置竖线颜色
//        xaxis.setaxislinecolor(color.green);//设置x轴线颜色
//        xaxis.setaxislinewidth(5f);//设置x轴线宽度
//        xaxis.setvalueformatter();//格式化x轴标签显示字符
        /**
         * y轴默认显示左右两个轴线
         */
        //获取右边的轴线
        yaxis rightaxis=linechart.getaxisright();
        //设置图表右边的y轴禁用
        rightaxis.setenabled(false);
        //获取左边的轴线
        yaxis leftaxis = linechart.getaxisleft();
        //设置网格线为虚线效果
        leftaxis.enablegriddashedline(0f, 0f, 0f);
        //是否绘制0所在的网格线
        leftaxis.setdrawzeroline(false);
        leftaxis.setenabled(true);//设置轴启用或禁用 如果禁用以下的设置全部不生效
        leftaxis.setdrawaxisline(true);//是否绘制轴线
        leftaxis.setdrawgridlines(true);//设置x轴上每个点对应的线
        leftaxis.setdrawlabels(true);//绘制标签  指x轴上的对应数值
        leftaxis.setgranularity(1);//让y轴上自定义的值和折线上相对应
        leftaxis.setaxislinecolor(r.color.white);//设置纵轴线的颜色
        leftaxis.settextcolor(r.color.white);    //设置纵轴字体颜色
        linechart.settouchenabled(true); // 设置是否可以触摸
        linechart.setdragenabled(false); // 是否可以拖拽
        linechart.setscaleenabled(false);// 是否可以缩放 x和y轴, 默认是true
        linechart.setscalexenabled(false); //是否可以缩放 仅x轴
        linechart.setscaleyenabled(false); //是否可以缩放 仅y轴
        linechart.setpinchzoom(false);  //设置x轴和y轴能否同时缩放。默认是否
        linechart.setdoubletaptozoomenabled(false);//设置是否可以通过双击屏幕放大图表。默认是true
        linechart.sethighlightperdragenabled(true);//能否拖拽高亮线(数据点与坐标的提示线),默认是true
        linechart.setdragdecelerationenabled(false);//拖拽滚动时,手放开是否会持续滚动,默认是true(false是拖到哪是哪,true拖拽之后还会有缓冲)
        linechart.setdragdecelerationfrictioncoef(0.99f);//与上面那个属性配合,持续滚动时的速度快慢,[0,1) 0代表立即停止。
        linechart.getxaxis().setdrawgridlines(false);//设置网格线
        linechart.getaxisleft().setdrawgridlines(false);//去掉左右边线
        linechart.getaxisright().setdrawgridlines(false);//去掉左右边线
        final markerviews mv = new markerviews(this, r.layout.maekertextview,linechart,xvalue);
        mv.setchartview(linechart);
        // set the marker to the chart
        linechart.setmarker(mv);
        //自定义的markerview对象
//        mymarkerview mv = new mymarkerview(this, r.layout.item);
//        mv.setchartview(linechart);
//        linechart.setmarker(mv);
    }

mymarkerview 自定义class

public class markerviews extends markerview {
    private textview tvcontent;//自己定义的xml
    linechart linechart;//图表控件
    arraylist<string> xvalue;//x轴数据源
    /**
     * constructor. sets up the markerview with a custom layout resource.
     *
     * @param context
     * @param layoutresource the layout resource to use for the markerview
     */
    public markerviews(context context, int layoutresource, linechart linechart,arraylist<string> xvalue) {
        super(context,layoutresource);
        tvcontent = (textview) findviewbyid(r.id.tvcontent1);
        this.linechart=linechart;
        this.xvalue=xvalue;
    }
    @override
    public void refreshcontent(entry e, highlight highlight) {//重写refreshcontent方法(注意,在  //mpandroidchart早期版本里这里有三个参数,这里有两个,我这是mpandroidchart 3.0.2版本
        //下面这里是关键的
        linedata linedata=linechart.getlinedata();//得到已经绘制成型的折线图的数据
        linedataset set=(linedataset)linedata.getdatasetbyindex(0);//获取第一条折线图y轴数据
        linedataset set1=(linedataset)linedata.getdatasetbyindex(1);//获取第二条折线图y轴数据
        int datasetindex=highlight.getdatasetindex();//获取点击的是哪条折线上的交叉点,0就是第一条,以此类推
        int index;
        if (datasetindex==0){
            index= set.getentryindex(e);//根据点击的该条折线的点,获取当前y轴数据对应的index值,
        }else {
            index= set1.getentryindex(e);//根据点击的该条折线的点,获取当前y轴数据对应的index值,
        }
        //根据index值,分别获取当前x轴上对应的两条折线的y轴的值
        log.i("x,y轴","/"+xvalue.get(index)+"/"+e.gety());
        tvcontent.settext("时间:"+xvalue.get(index)+"\n在线人数:"+e.gety());
        super.refreshcontent(e, highlight);
    }
    @override
    public mppointf getoffset() {
        return new mppointf(-(getwidth() / 2), -getheight());
    }
}

maekertextview .xml

<?xml version="1.0" encoding="utf-8"?>
<relativelayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@color/white"
    >
    <textview
        android:id="@+id/tvcontent1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerhorizontal="true"
        android:layout_margintop="7dp"
        android:layout_marginleft="5dp"
        android:layout_marginright="5dp"
        android:text=""
        android:singleline="false"
        android:textsize="12dp"
        android:textcolor="@android:color/black"
        android:textappearance="?android:attr/textappearancesmall" />
</relativelayout>

常用属性

  • setdescription(string desc) : 设置表格的描述
  • setdescriptiontypeface(typeface t) :自定义表格中显示的字体
  • setdrawyvalues(boolean enabled) : 设置是否显示y轴的值的数据
  • setvaluepaintcolor(int color) :设置表格中y轴的值的颜色,但是必须设置setdrawyvalues(true)
  • setvaluetypeface(typeface t):设置字体
  • setvalueformatter(decimalformat format) : 设置显示的格式
  • setpaint(paint p, int which) : 自定义笔刷
  • public chartdata getdatacurrent() :返回chartdata对象当前显示的图表。它包含了所有信息的显示值最小和最大值等
  • public float getychartmin() : 返回当前最小值
  • public float getychartmax() : 返回当前最大值
  • public float getaverage() : 返回所有值的平均值。
  • public float getaverage(int type) : 返回平均值
  • public pointf getcenter() : 返回中间点
  • public paint getpaint(int which) : 得到笔刷
  • settouchenabled(boolean enabled) : 设置是否可以触摸,如为false,则不能拖动,缩放等
  • setdragscaleenabled(boolean enabled) : 设置是否可以拖拽,缩放
  • setonchartvalueselectedlistener(onchartvalueselectedlistener l) : 设置表格上的点,被点击的时候,的回调函数
  • sethighlightenabled(boolean enabled) : 设置点击value的时候,是否高亮显示
  • public void highlightvalues(highlight[] highs) : 设置高亮显示
  • savetogallery(string title) : 保存图表到图库中
  • savetopath(string title, string pathonsd) : 保存.
  • setscaleminima(float x, float y) : 设置最小的缩放
  • centerviewport(int xindex, float val) : 设置视口
  • fitscreen() : 适应屏幕

以上就是android画图实现mpandroidchart折线图示例详解的详细内容,更多关于android mpandroidchart折线图的资料请关注萬仟网其它相关文章!

看完文章,还可以用支付宝扫描下面的二维码领取一个支付宝红包,目前可领1-88元不等

支付宝红包二维码

除了扫码可以领取之外,大家还可以(复制 720087999 打开✔支付宝✔去搜索, h`o`n.g.包哪里来,动动手指就能领)。

看下图所示是好多参与这次活动领取红包的朋友:

支付宝红包

扫描二维码推送至手机访问。

版权声明:本文由34楼发布,如需转载请注明出处。

本文链接:https://www.34l.com/post/19937.html

分享给朋友:

相关文章

李开复的经典语录32句
李开复的经典语录32句

李开复的经典语录32句分享:1、 一个人品不完善的人是不可能成为一个真正有所作为的人的。2、动表达自己对各种事物的看法和意见。3、一个一流的人与一个一般的人在一般问题上的表现可能一样,但是在一流问题上的表现则会有天壤之别。4、只有积极主动的...

37句老师的经典励志短句
37句老师的经典励志短句

1、无知者无畏并不可怕,真正可怕的是无知者还无所谓。请你记住:不要用无所谓的态度原谅自己,对待一切,那会使一切变得对你无所谓,也会使你成为一个无所谓而又无所成的痛苦的边缘人。2、斗争在许多时候就是意志的较量,意志坚定者便是最后的赢家。面对人...

50句非常励志的短句,正能量的励志句子
50句非常励志的短句,正能量的励志句子

1、人非要经历一番不同平时的劫难才能脱胎换骨,成为真正能解决问题的人。2、务须咬牙厉志,蓄其气而长其志,切不可恭然自馁也3、生活比电影狠多了,从来不给弱者安排大逆转的情节。4、即使赚得了全世界,却失去了自己,又有什么意义呢?5、不要把时间、...

好想你花开富贵大礼包多少钱一提?1236g优惠价只需要43.90元
好想你花开富贵大礼包多少钱一提?1236g优惠价只需要43.90元

好想你花开富贵大礼包多少钱一提?好想你,花开富贵礼盒1236g零食大礼包,原价58.90元,领取15元的优惠券减掉之后只需要43.90元,这个价格在近30日内属于最低价,喜欢这款商品的朋友不要错过哦。好想你花开富贵礼盒1236g,零食大礼包...

女人奋斗励志语录分享10句
女人奋斗励志语录分享10句

1、即便无人喝彩,也要守住自己的人生。每一次失败,都是成功的伏笔;每一次考验,都有一份收获;每一次泪水,都有一次醒悟;每一次磨难,都有生命的财富。每一次伤痛,都是成长的支柱。2、不要沮丧,不必惊慌,做努力爬的蜗牛或坚持飞的笨鸟,我们试着长大...

英国正在调查一种新出现的变异病毒
英国正在调查一种新出现的变异病毒

新华社伦敦3月11日电(记者张家伟 金晶)英国英格兰公共卫生局11日表示,该国近期确诊两例感染了一种新的变异新冠病毒的病例,目前正在对这一新的变异病毒开展调查。英格兰公共卫生局说,这两例病例是近期在英格兰东南部被确诊的,该局已于3月4日将该...