Android开发过程中实现折线图的方法
一开始为了期末作业做了个计步器,也就是可以连接手机的传感器简单实现计步功能的,但是发现页面太单调,于是考虑加上每日的步数趋势图,因为通过对应日期对应步数变化这种折线方式显示给用户是比较直观的。
也是有参考好些现已有的计步器设计样式,个人觉得简洁美观的页面才是真的能让大家看得舒服。
这是两个计步器的历史记录页面,一个是峰图,一个是折线型。
而我在做图表这部分时,在实现过程中也遇到了不少问题,在网上寻求了很多的解决办法,在这里简单记录些相关问题。
首先对在安卓开发中实现折线图的方法做了一些简单的了解,类似MPAndroidChart、XCL-chart、achartenginee和hellochart等,在具体决定做之前先去网上找了很多相关资料,了解到了各个方法直接的利弊点。
先来说说MPAndroidChart,也是一个很不错的图表工具,可以支持多种类型图表展示,也能够缩放图表、支持动画效果等,但是也有些人表示性能一般,因为在使用view的时候它会卡顿或者不流畅,这是很容易让开发者头疼的地方;
其次,对于XCL-chart定制图表也不错,但其实较为适应固定图表,如果需要满足滑动界面操作的话就一言难尽了;再者是achartenginee,这个首先就是界面不怎么样,然后就是适应性不强,不能满足开发者的需求。
最后来说说我们今天的目标:hellochart,据说是非常适合初入门的开发者使用,简单快捷,引入也很方便,而且界面美观,尤其是自己亲历使用之后能感觉到hellochart的代码是比较清晰的,操作时对应的滑动或者是缩放都很流畅。支持饼状图、折线图、柱状图、泡泡型······ 基本可以可以说是“只要你要,只要我有”。
hellochart导入
这部分就简单的一笔带过了,因为网络上已经有很多相关的介绍了:app–>build–>dependencies,在闭包里写
dependencies{
compile 'com.github.lecho:hellocharts-library:1.5.8@aar'
}
还有一些其他的方法,推荐大家可以到“简书”或者“知乎”上找找吧。
折线图布局部分:
折线图的布局是很简单的:
<lecho.lib.hellocharts.view.LineChartView
android:id="@+id/line_chart"
android:padding="25dp"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#ffffff"/>
<ListView
android:visibility="gone"
android:divider="@null"
android:scrollbars="none"
android:layout_marginTop="15dp"
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent"></ListView>
</LinearLayout>
折线图部分对应java代码
public class ListActivity extends Activity {
private ListView listview;
private List<StepEntity> stepEntityList = new ArrayList<>();
private StepDataDao stepDataDao;
private LineChartView lineChart;
private List<StepEntity> list;
String[] date ;
float [] score;
private List<PointValue> mPointValues = new ArrayList<PointValue>();
private List<AxisValue> mAxisXValues = new ArrayList<AxisValue>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list);
stepDataDao = new StepDataDao(this);
initView();
list = stepDataDao.getAllDatas( );
date=new String[list.size()];
score=new float[list.size()];
for (int i=0;i<list.size();i++){
date[i]=list.get(i).getCurDate();
score[i]=Float.parseFloat(list.get(i).getSteps());
}
getAxisXLables();
getAxisPoints();
initLineChart();
}
private void initLineChart(){
Line line = new Line(mPointValues).setColor(Color.parseColor("#FFCD41"));
List<Line> lines = new ArrayList<Line>();
line.setShape(ValueShape.CIRCLE); //折线图上每个数据点的形状,这里是圆形
line.setCubic(false);
line.setFilled(false);
line.setHasLabels(true);
line.setHasLines(true);
line.setHasPoints(true);
lines.add(line);
LineChartData data = new LineChartData();
data.setLines(lines);
//坐标轴
Axis axisX = new Axis();
axisX.setHasTiltedLabels(true);
axisX.setTextColor(Color.parseColor("#D6D6D9"));//设置字体颜色
axisX.setTextSize(8);//设置字体大小
axisX.setMaxLabelChars(8);//最多几个X轴坐标
axisX.setValues(mAxisXValues);
data.setAxisXBottom(axisX);
axisX.setHasLines(true);
Axis axisY = new Axis();
axisY.setName("");
axisY.setTextSize(8);
data.setAxisYLeft(axisY);
//设置行为属性,缩放、滑动、平移
lineChart.setInteractive(true);
lineChart.setZoomType(ZoomType.HORIZONTAL);
lineChart.setMaxZoom((float) 3);
lineChart.setLineChartData(data);
lineChart.setVisibility(View.VISIBLE);
//设置X轴数据的显示个数(x轴0-7个数据)
Viewport v = new Viewport(lineChart.getMaximumViewport());
v.left = 0;
v.right= 7;
lineChart.setCurrentViewport(v);
}
private void initView() {
listview=(ListView) findViewById(R.id.listview);
lineChart = (LineChartView)findViewById(R.id.line_chart);
}
private void getAxisXLables(){
for (int i = 0; i < date.length; i++) {
mAxisXValues.add(new AxisValue(i).setLabel(date[i]));
}
}
private void getAxisPoints(){
for (int i = 0; i < score.length; i++) {
mPointValues.add(new PointValue(i, score[i]));
}
}
}
最后出现的折线图是这样子的:
原作者:谢月荫
原文地址:https://blog.csdn.net/xyy_d_semine/article/details/80703953