Android LineChart绘制多条曲线的方法

本文实例为大家分享了Android LineChart绘制多条曲线的具体代码,供大家参考,具体内容如下

目标效果:

1.新建custom_marker_view.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="40dp"
 android:background="@drawable/marker2" >

 <TextView
  android:id="@+id/tvContent"
  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:textSize="12dp"
  android:textColor="@android:color/white"
  android:ellipsize="end"
  android:singleLine="true"
  android:textAppearance="?android:attr/textAppearanceSmall" />

</RelativeLayout>

2.activity_main.xml页面:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:paddingBottom="10dp"
 android:paddingLeft="10dp"
 android:paddingRight="10dp"
 android:paddingTop="10dp"
 tools:context=".MainActivity" >

 <com.github.mikephil.charting.charts.LineChart
  android:id="@+id/chartTall"
  android:layout_width="match_parent"
  android:layout_height="400dp"
  android:layout_marginTop="20dp" />

</RelativeLayout>

3.新建MyMarkerView.java重写MarkView控件:

package com.example.weixu.drawline;

import android.content.Context;
import android.widget.TextView;

import com.github.mikephil.charting.data.CandleEntry;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.utils.MarkerView;
import com.github.mikephil.charting.utils.Utils;

public class MyMarkerView extends MarkerView {

 private TextView tvContent;

 public MyMarkerView(Context context, int layoutResource) {
  super(context, layoutResource);

  tvContent = (TextView) findViewById(R.id.tvContent);
 }

 @Override
 public void refreshContent(Entry e, int dataSetIndex) {

  if (e instanceof CandleEntry) {
   CandleEntry ce = (CandleEntry) e;
   tvContent.setText("" + Utils.formatNumber(ce.getHigh(), 0, true));
  } else {
   tvContent.setText("" +e.getVal());
  }
 }
}

4.MainActivity.java页面:

package com.example.weixu.drawline;

import java.util.ArrayList;

import android.app.Activity;
import android.graphics.Color;
import android.graphics.Typeface;
import android.os.Bundle;
import android.view.WindowManager;

import com.github.mikephil.charting.charts.BarLineChartBase;
import com.github.mikephil.charting.charts.BarLineChartBase.BorderPosition;
import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.utils.Legend;
import com.github.mikephil.charting.utils.Legend.LegendForm;
import com.github.mikephil.charting.utils.XLabels;
import com.github.mikephil.charting.utils.XLabels.XLabelPosition;
import com.github.mikephil.charting.utils.YLabels;

public class MainActivity extends Activity {

 private LineChart chartTall;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
    WindowManager.LayoutParams.FLAG_FULLSCREEN);
  setContentView(R.layout.activity_main);

  chartTall = (LineChart) findViewById(R.id.chartTall);

  setType();

  // 刷新图表
  chartTall.invalidate();
 }

 private void setType() {
  // 设置在Y轴上是否是从0开始显示
  chartTall.setStartAtZero(true);
  //是否在Y轴显示数据,就是曲线上的数据
  chartTall.setDrawYValues(true);
  //设置网格
  chartTall.setDrawBorder(true);
  chartTall.setBorderPositions(new BarLineChartBase.BorderPosition[] {
    BorderPosition.BOTTOM});
  //在chart上的右下角加描述
  chartTall.setDescription("身高曲线图");
  //设置Y轴上的单位
  chartTall.setUnit("cm");
  //设置透明度
  chartTall.setAlpha(0.8f);
  //设置网格底下的那条线的颜色
  chartTall.setBorderColor(Color.rgb(213, 216, 214));
  //设置Y轴前后倒置
  chartTall.setInvertYAxisEnabled(false);
  //设置高亮显示
  chartTall.setHighlightEnabled(true);
  //设置是否可以触摸,如为false,则不能拖动,缩放等
  chartTall.setTouchEnabled(true);
  //设置是否可以拖拽,缩放
  chartTall.setDragEnabled(true);
  chartTall.setScaleEnabled(true);
  //设置是否能扩大扩小
  chartTall.setPinchZoom(true);
  //设置点击chart图对应的数据弹出标注
  MyMarkerView mv = new MyMarkerView(this, R.layout.custom_marker_view);
  mv.setOffsets(-mv.getMeasuredWidth() / 2, -mv.getMeasuredHeight());
  chartTall.setMarkerView(mv);
  chartTall.setHighlightIndicatorEnabled(false);
  //设置字体格式,如正楷
  Typeface tf = Typeface.createFromAsset(getAssets(),
    "OpenSans-Regular.ttf");
  chartTall.setValueTypeface(tf);

  XLabels xl = chartTall.getXLabels();
  xl.setPosition(XLabelPosition.BOTTOM); // 设置X轴的数据在底部显示
  xl.setTypeface(tf); // 设置字体
  xl.setTextSize(10f); // 设置字体大小
  xl.setSpaceBetweenLabels(3); // 设置数据之间的间距

  YLabels yl = chartTall.getYLabels();
  yl.setTypeface(tf); // 设置字体
  yl.setTextSize(10f); // s设置字体大小
  yl.setLabelCount(5); // 设置Y轴最多显示的数据个数
  // 加载数据
  setData();
  //从X轴进入的动画
  chartTall.animateX(4000);
  chartTall.animateY(3000); //从Y轴进入的动画
  chartTall.animateXY(3000, 3000); //从XY轴一起进入的动画

  //设置最小的缩放
  chartTall.setScaleMinima(0.5f, 1f);

 }

 private void setData() {
  String[] babAge = {"0","1","2","3","4","5","6"};  //连线的x轴数据
  String[] babyTall = {"50","60","90","110","130","135","140"};
  String[] usuaTall = {"55","65","95","115","125","135","145"};//连线的y轴数据

  LineData data=new LineData(babAge,setLine(babAge,babyTall,1,"宝宝身高")); //创建LineData实体类并添加第一条曲线
  data.addDataSet(setLine(babAge,usuaTall,2,"正常身高"));  //添加第二条曲线
  chartTall.setData(data);
 }

 //画线
 private LineDataSet setLine(String[] babAge, String[] Tall,int flag,String name) {
  ArrayList<String> xValsAge = new ArrayList<String>();
  for (int i = 0; i < babAge.length; i++) {
   xValsAge.add(babAge[i]);
  }
  ArrayList<Entry> yValsBabyTall = new ArrayList<Entry>();
  for (int i = 0; i < Tall.length; i++) {
   yValsBabyTall.add(new Entry(Float.parseFloat(Tall[i]), i));
  }
  //设置baby的成长曲线
  LineDataSet setData = new LineDataSet(yValsBabyTall,name);
  setData.setDrawCubic(true); //设置曲线为圆滑的线
  setData.setCubicIntensity(0.2f);
  setData.setDrawFilled(false); //设置包括的范围区域填充颜色
  setData.setDrawCircles(true); //设置有圆点
  setData.setLineWidth(2f); //设置线的宽度
  setData.setCircleSize(5f); //设置小圆的大小
  setData.setHighLightColor(Color.rgb(244, 117, 117));
  //设置曲线颜色
  if(flag==1)
   setData.setColor(Color.rgb(104, 241, 175)); //宝宝身高曲线颜色
  else if(flag==2)
   setData.setColor(Color.rgb(255, 0, 0)); //普通身高曲线颜色
  return setData; //返回曲线
 }
}

源码:点击打开链接

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • android中贝塞尔曲线的应用示例

    前言: 贝塞尔曲线又称贝兹曲线,它的主要意义在于无论是直线或曲线都能在数学上予以描述.最初由保罗·德卡斯特里奥(Paul de Casteljau)于1959年运用德卡斯特里奥演算法开发(de Casteljau Algorithm),在1962,由法国工程师皮埃尔·贝塞尔(Pierre Bézier)所广泛发表.目前广泛应用于图形绘制领域来模拟光滑曲线,为计算机矢量图形学奠定了基础.在一些图形处理软件中都能见到贝塞尔曲线,比如CorelDraw中翻译成"贝赛尔工具":而在Firewo

  • Android中贝塞尔曲线的绘制方法示例代码

    贝塞尔曲线,很多人可能不太了解,什么叫做贝塞尔曲线呢?这里先做一下简单介绍:贝塞尔曲线也可以叫做贝济埃曲线或者贝兹曲线,它由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋.一般的矢量图形软件常利用贝塞尔曲线来精确画出曲线. 上面的介绍中,"线段像可伸缩的皮筋"这句话非常关键,但也特别好理解.至于贝塞尔曲线的详细内容大家可以查阅相关资料.        Android提供的贝塞尔曲线绘制接口 在Android开发中,要实现贝塞尔曲线其实还是很简单的,因为Android已经给我们提

  • Android编程之canvas绘制各种图形(点,直线,弧,圆,椭圆,文字,矩形,多边形,曲线,圆角矩形)

    本文实例讲述了Android编程之canvas绘制各种图形的方法.分享给大家供大家参考,具体如下: 1.首先说一下canvas类: Class Overview The Canvas class holds the "draw" calls. To draw something, you need 4 basic components: A Bitmap to hold the pixels, a Canvas to host the draw calls (writing into

  • Android 自定义View实现芝麻分曲线图效果

    1.简介 其实这个效果几天之前就写了,但是一直没有更新博客,本来想着把芝麻分雷达图也做好再发博客的,然后今天看到鸿洋的微信公众号有朋友发了芝麻分的雷达图,所以就算了,算是一个互补吧.平时文章也写的比较少,所以可能有点杂乱,有什么需要改进的地方欢迎给出建议,不胜感激. 效果图: 2.步骤: 初始化View的属性 初始化画笔 绘制代表最高分和最低分的两根虚线 绘制文字 绘制代表月份的属性 绘制芝麻分折线 绘制代表芝麻分的圆点 绘制选中分数的悬浮文字以及背景 处理点击事件 3.编码: 初始化View属

  • Android利用MPAndroidChart绘制曲线图表的基础教程

    前言 最近看了一下 Android 上的图表控件,去年做过一款应用也已上架了,也用到了图表控件,但是只是按照官方 demo 集成了,并没有过多的研究. 我最近基本上是面向 Github 编程了,拿别人造好的轮子拿来用,不能直接用的就改改再用,实在不好实现的就劝说产品去改需求,基本这是个套路. 既然是图表控件,就上 github 一番搜索,关键字 chart,按照 java 一筛选,再按照 start 数量排序,由高到低.基本上 start 从高到低的图表控件就是 MPAndroidChart.h

  • Android贝塞尔曲线初步学习第二课 仿QQ未读消息气泡拖拽黏连效果

    上一节初步了解了Android端的贝塞尔曲线,这一节就举个栗子练习一下,仿QQ未读消息气泡,是最经典的练习贝塞尔曲线的东东,效果如下 附上github源码地址:https://github.com/MonkeyMushroom/DragBubbleView 欢迎star~ 大体思路就是画两个圆,一个黏连小球固定在一个点上,一个气泡小球跟随手指的滑动改变坐标.随着两个圆间距越来越大,黏连小球半径越来越小.当间距小于一定值,松开手指气泡小球会恢复原来位置:当间距超过一定值之后,黏连小球消失,气泡小球

  • Android 曲线图的绘制示例代码

    本文介绍了Android 曲线图的绘制示例代码,分享给大家,具体如下: 效果展示 效果展示.gif 使用方式 // 初始化数据表格相关 with(mTableView) { // 配置坐标系 setupCoordinator("日", "人", /*这里是横坐标的值*/0f, 5f, 10f, 15f, 20f, 25f, 30f) // 添加曲线, 确保纵坐标的数值位数相等 addWave(ContextCompat.getColor(this@MainActiv

  • Android实现价格走势自定义曲线图

    本文是引用开源图表库框架 MPAndroidChart的LineChart 地址:https://github.com/PhilJay/MPAndroidChart 1.需求: (1)动态添加RadioButton,点击改变下面的LineChart数据 (2)LineChart绘制价格走势图,只显示最低点的小圆点和View,手指滑动,MarkView数据变化. (3) 服务端返回端数据,不是每一天端数据,但是x轴显示的必须是每一天的数据,这里是有我自己处理过的.返回里需要显示点的数组,之前的时间

  • Android把商品添加到购物车的动画效果(贝塞尔曲线)

    当我们写商城类的项目的时候,一般都会有加入购物车的功能,加入购物车的时候会有一些抛物线动画,具体代码如下: 实现效果如图: 思路: 确定动画的起终点 在起终点之间使用二次贝塞尔曲线填充起终点之间的点的轨迹 设置属性动画,ValueAnimator插值器,获取中间点的坐标 将执行动画的控件的x.y坐标设为上面得到的中间点坐标 开启属性动画 当动画结束时的操作 难点: PathMeasure的使用 - getLength() - boolean getPosTan(float distance, f

  • Android 利用三阶贝塞尔曲线绘制运动轨迹的示例

    本篇文章主要介绍了Android 利用三阶贝塞尔曲线绘制运动轨迹的示例,分享给大家,具体如下: 实现点赞效果,自定义起始点以及运动轨迹 效果图: xml布局: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/rl_root&

随机推荐