Android中mpchartlib折线图的详细属性以及实现(双曲线)
来源:互联网 发布:淘宝怎么修改分类 编辑:程序博客网 时间:2024/04/30 16:26
冒充前言的前言
个人觉得,这个第三方功能还是十分强大的,至少我的这几个项目所需的功能都可以满足。嗯,还是说说这个东西怎么用吧,以及各个属性的意思吧。
step1:下载mpchartlib.jar,放进项目,add as library即可。
jar包下载地址:
http://download.csdn.net/download/qq_34947883/9937839
step2:放入布局文件中,如下所示:
<!--折线图--> <com.github.mikephil.charting.charts.LineChart android:id="@+id/lineChart" android:layout_width="match_parent" android:layout_height="200dp" android:layout_margin="10dp"/>
step3:在Activity中找到控件,然后设置相应的属性以及填充数据(copy整个类啦,这样实现也方便一些)
public class MyLineChartActivity extends AppCompatActivity implements OnChartValueSelectedListener { public static int ChartClickPosition=0;//用一个静态变量记录折线图被点击数值对应的横坐标 private LineChart mLineChart; private List<String> datas,datas2;//两条折线图的数据源 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my_line_chart); initView(); initData(); setDateForLineChart(); } //初始化控件 public void initView() { datas = new ArrayList<>(); datas2 = new ArrayList<>(); mLineChart = (LineChart) findViewById(R.id.lineChart); } //模拟数据源 private void initData() { Random random = new Random(); for (int i = 0; i < 8; i++) { if (i%6==0&&i!=0){ datas.add("超时");//模拟无数据 }else{ datas.add( random.nextInt(66)+"");//生成0-66的随机整数 } } for (int i = 0; i < 8; i++) { if (i%6==0&&i!=0){ datas2.add("超时");//模拟无数据 }else{ datas2.add( random.nextInt(66)+"");//生成0-66的随机整数 } } } //为折线图设置数据 private void setDateForLineChart() { initSrc(); ArrayList<String> xValues = initXAxis(); initYAxis(); LineDataSet dataSet1 = initYValueAxis("one");//可创建多条线 LineDataSet dataSet2 = initYValueAxis("two"); //构建一个类型为LineDataSet的ArrayList 用来存放所有 y的LineDataSet 它是构建最终加入LineChart数据集所需要的参数 ArrayList<LineDataSet> dataSets = new ArrayList<>(); dataSets.add(dataSet1); //将数据加入dataSets dataSets.add(dataSet2); //将数据加入dataSets LineData lineData = new LineData(xValues, dataSets); //构建一个LineData 将dataSets放入 mLineChart.setData(lineData); //将数据绑定到图表 mLineChart.invalidate();//刷新图表 } private void initSrc() { mLineChart.setOnChartValueSelectedListener(this);//设置监听 //折线图与用户交互 mLineChart.setTouchEnabled(true); // 设置是否可以触摸 mLineChart.setDragEnabled(false);// 是否可以拖拽 mLineChart.setScaleEnabled(false);// 是否可以缩放 mLineChart.setDrawBorders(false); //是否在折线图上添加边框 mLineChart.setPinchZoom(false);//y轴的值是否跟随图表变换缩放;如果禁止,y轴的值会跟随图表变换缩放 mLineChart.setDoubleTapToZoomEnabled(false);//设置双击不放大 mLineChart.setNoDataTextDescription("暂无数据"); mLineChart.setDescriptionColor(0xffffffff);//设置数据描述的字体颜色 mLineChart.setDescriptionPosition(100, 15);//数据描述的位置 mLineChart.setGridBackgroundColor(0x00000000);//透明色 mLineChart.animateXY(1000, 1000); //从XY轴一起进入的动画 mLineChart.setDescription(""); mLineChart.setBackgroundColor(0xff0092F3);//设置整个折线图的背景颜色 MyMarkerView mv = new MyMarkerView(MyLineChartActivity.this, R.layout.custom_marker_view); mLineChart.setMarkerView(mv); Legend mLegend = mLineChart.getLegend(); // 设置比例图标示 mLegend.setForm(Legend.LegendForm.CIRCLE); //设置图最下面显示的类型 CIRCLE小圆圈 SQUARE正方形 LINE直线 mLegend.setEnabled(true); //设置图最下面的比例图标是否显示 mLegend.setTextColor(0xffffffff); } private ArrayList<String> initXAxis() { //X轴样式设置 XAxis xAxis = mLineChart.getXAxis(); xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);// 设置x轴在底部显示 xAxis.setSpaceBetweenLabels(50); // x轴间距,对折线图来说好像没啥用 xAxis.setAxisLineColor(0x00000000);//设置横坐标线的颜色 xAxis.setDrawGridLines(false);//设置是否显示横轴表格 xAxis.setTextColor(0xffffffff);//设置横坐标文字的颜色 xAxis.setLabelsToSkip(0);//横坐标间隔数 //x轴数据 ArrayList<String> xValues = new ArrayList<>(); for (int i = 1; i <= datas.size(); i++) {//我这里设置横坐标从一显示了 xValues.add(i + ""); } return xValues; } private void initYAxis() { // 左面y轴样式设置 YAxis yleftAxis = mLineChart.getAxisLeft(); yleftAxis.setDrawGridLines(false); //设置显示Y轴表格线 yleftAxis.setStartAtZero(false);//设置数据不从零显示 yleftAxis.setAxisLineColor(0x00000000);//透明色 yleftAxis.setTextColor(0xffffff); yleftAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART); // 右面y轴样式设置 YAxis yrightAxis = mLineChart.getAxisRight(); yrightAxis.setDrawGridLines(false);//设置隐藏Y轴表格线 yrightAxis.setDrawLabels(false);//设置右侧Y轴是否显示 Label yrightAxis.setDrawAxisLine(false); } private LineDataSet initYValueAxis(String type) { ArrayList<Entry> yValue1 = new ArrayList<>(); if (type.equals("one")){ for (int i = 0; i <datas.size(); i++) { try { if (i < datas.size()) { String yDataStr = datas.get(i); if (yDataStr != null && !yDataStr.equals("超时")) {//如果数据有效(有数据),显示 yValue1.add(new Entry(Float.parseFloat(yDataStr), i)); } } } catch (Exception e) { // e.printStackTrace(); return null; } } }else if(type.equals("two")){ for (int i = 0; i <datas2.size(); i++) { try { if (i < datas2.size()) { String yDataStr = datas2.get(i); if (yDataStr != null && !yDataStr.equals("超时")) {//如果数据有效(有数据),显示 yValue1.add(new Entry(Float.parseFloat(yDataStr), i)); } } } catch (Exception e) { // e.printStackTrace(); return null; } } } /** * 曲线样式设置 */ LineDataSet dataSet1;//构建一个LineDataSet 代表一组Y轴数据 String title= (type.equals("one")?"oneChart":"twoChart"); dataSet1 = new LineDataSet(yValue1,title); dataSet1.setDrawValues(false); if (type.equals("one")){ dataSet1.setColor(0xffffffff);//折线图线的颜色 dataSet1.setCircleColor(0xffffffff);//圆圈颜色 dataSet1.setCircleColorHole(0xff148CEF);//圆实心颜色 }else if (type.equals("two")){ dataSet1.setColor(0xab404040);//折线图线的颜色 dataSet1.setCircleColor(0xab404040);//圆圈颜色 dataSet1.setCircleColorHole(0x148CEF);//圆实心颜色 } dataSet1.setCircleSize(2.5f);//设置圆的尺寸 dataSet1.setHighLightColor(0x90ffffff);//设置点击数值时,出现横纵坐标线的颜色 dataSet1.setLineWidth(1f); dataSet1.setDrawCubic(true); //设置曲线为圆滑的线 return dataSet1; } @Override public void onValueSelected(Entry entry, int i, Highlight highlight) { ChartClickPosition=entry.getXIndex();//获取当前点击的横坐标,并保存 } @Override public void onNothingSelected() { }}
step4:layout.custom_marker_view.xml,样式咋好看咋改
<TextView android:id="@+id/tvContent" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="5dp" android:layout_centerHorizontal="true" android:textSize="9sp" android:textColor="#ffffff" />
step5: MyMarkerView .class
public class MyMarkerView extends MarkerView { private TextView tvContent; public MyMarkerView(Context context, int layoutResource) { super(context, layoutResource); tvContent = (TextView) findViewById(R.id.tvContent); } // callbacks everytime the MarkerView is redrawn, can be used to update the // content @Override public void refreshContent(Entry e, int dataSetIndex) { if (e instanceof CandleEntry) { CandleEntry ce = (CandleEntry) e; tvContent.setText("" + ce.getHigh());//值为浮点数 //tvContent.setText("" + Utils.formatNumber(ce.getHigh(), 0, true));//值为四舍五入后的整数 } else { tvContent.setText("" + e.getVal());//值为浮点数 //tvContent.setText("" + Utils.formatNumber(e.getVal(), 0, true));//值为四舍五入后的整数 } } @Override public int getXOffset() {//设置偏移量 if (MyLineChartActivity.ChartClickPosition <= 3) {//避免数值与纵坐标重叠 return 0; } else { return -getMeasuredWidth(); } } @Override public int getYOffset() {//设置偏移量 return -getMeasuredHeight(); }}
step6:上传一张效果图
冒充后记的后记
1、横纵坐标的数据我动态填充的,因为毕竟项目中数据都比较灵活嘛。
2、在没有值的情况下,可以自己添加一个标识,添加y轴数据的时候自己判断就好了。
3、如果添加多条线的时候,需要多条线的横坐标数量保持一致才行,要不然程序就挂了。
4、以上内容纯属个人理解,如有不妥之处,请指出。如有雷同,那就算咱俩心有灵犀吧,哈哈。
5、还有啊,解释权归本人所有。
源码下载:
http://download.csdn.net/download/qq_34947883/9937739
阅读全文
1 0
- Android中mpchartlib折线图的详细属性以及实现(双曲线)
- Android中mpchartlib柱状图的详细属性以及实现(可移动可点击)
- Android统计图的绘制( MPChartLib 的使用)
- Android 折线图的实现
- Android中折线图实现方法(各类图表实现)
- Android实现折线图
- android 实现淘宝收益图的折线
- Android实现自定义的折线图MyChartView
- Android中折线图的画法
- Android中使用HelloChart开源库图表来实现折线图
- mpchartlib
- Android中对HelloCharts的修改,实现动态绘制折线图
- android中 menu的属性详细解释
- android中 menu的属性详细解释
- Android hellochart折线图各属性设置
- Android中自定义折线图
- html5中表格的各种属性以及应用详细介绍
- 自适应布局的折线图,柱状图以及天气预报折线图
- 计算数字k在0到n中的出现的次数,k可能是0~9的一个值
- 产品汪的日常
- Postgresql UNION & UNION ALL 用法以及应用场景.md
- 编写代码时,每打一个字符就会弹出“Computing additional info”.Could not initialize class……
- 二维码自动扫描完整版
- Android中mpchartlib折线图的详细属性以及实现(双曲线)
- PHP7源码安装Memcached和Memcache拓展
- (译) 在AngularJS中使用的表单验证功能
- mac 更改文件权限
- 题目1112:拦截导弹
- 寻找一个字符串中第一个只出现两次的字符
- @Autowired的使用:推荐对构造函数进行注释
- 原生js获取鼠标坐标方法全面讲解:clientX/Y,pageX/Y,offsetX/Y,layerX/Y,screenX/Y
- 想食麦当劳#5