1.由于公司项目的需求,所以花了1.2天研究 MPAndroidCharts框架 。可是发现好多博客对我都没得帮助。浪费非常多时间在百度上。不得不说google 真是比百度强太多了。

要求:统计出56个名族的数量

原创作者的github:https://github.com/PhilJay/MPAndroidChart

MPAndroidCharts  API地址:https://jitpack.io/com/github/PhilJay/MPAndroidChart/v2.2.5/javadoc/

2.用到的框架是MPAndroidCharts。引入的依赖:

compile 'com.github.PhilJay:MPAndroidChart:v3.0.2' 

然后在引入仓库

3.正式開始使用

xml文件:

<?

xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="aas.androidmpcharts.MainActivity"> <com.github.mikephil.charting.charts.BarChart
android:id="@+id/mBarChart"
android:layout_width="match_parent"
android:layout_height="300dp"
/>
</RelativeLayout>

MainActivity代码:

public class MainActivity extends AppCompatActivity {
BarChart mBarChart;
ArrayList<String> mlist=new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBarChart = (BarChart) findViewById(R.id.mBarChart); mBarChart.setDrawBarShadow(false); //表不要阴影
mBarChart.setDrawValueAboveBar(true);
Description description=new Description();
description.setText("通行民族");
mBarChart.setDescription(description); //表的描写叙述信息 mBarChart.setPinchZoom(false);
mBarChart.setMaxVisibleValueCount(60); //最大显示的个数。超过60个将不再显示
mBarChart.setScaleEnabled(false); //禁止缩放
mBarChart.setDragEnabled(true);// 能否够拖拽
mBarChart.setHighlightPerDragEnabled(true);// 拖拽超过图标绘制画布时高亮显示
mBarChart.setDrawGridBackground(false);//
/* mBarChart.setAutoScaleMinMaxEnabled(true);*/
/* mBarChart.animateX(500);//数据显示动画,从左往右依次显示*/
/* mBarChart.getAxisRight().setEnabled(false);*/
/*mBarChart.setDragDecelerationEnabled(true);*///拖拽滚动时。手放开是否会持续滚动,默认是true(false是拖到哪是哪,true拖拽之后还会有缓冲)
mBarChart.zoom(2.5f,1f,0,0);//显示的时候 是 依照多大的比率缩放显示 1f表示不放大缩小
//我默认手机屏幕上显示10 剩下的滑动直方图 然后显示。 。假如要显示25个 那么除以10 就是放大2.5f。 。同理
// 56个民族 那么放大5.6f draw();
} public void draw(){ //X轴 样式
final XAxis xAxis = mBarChart.getXAxis();
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
xAxis.setLabelRotationAngle(90);//柱的以下描写叙述文字 旋转90度
xAxis.setDrawLabels(true);
xAxis.setDrawGridLines(false);
xAxis.setTypeface(Typeface.createFromAsset(getAssets(), "OpenSans-Light.ttf"));//字体的相关的设置
xAxis.setGranularity(1f);//设置最小间隔。防止当放大时,出现反复标签。
xAxis.setCenterAxisLabels(true);//字体以下的标签 显示在每一个直方图的中间
xAxis.setLabelCount(11,true);//一个界面显示10个Lable。那么这里要设置11个
xAxis.setTextSize(10f); //Y轴样式
YAxis leftAxis = mBarChart.getAxisLeft();
leftAxis.setLabelCount(10);
leftAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART);
leftAxis.setSpaceTop(15f);
leftAxis.setStartAtZero(false);
leftAxis.setYOffset(10f); //这个替换setStartAtZero(true)
leftAxis.setAxisMaxValue(50f);
leftAxis.setAxisMinValue(0f);
leftAxis.setDrawGridLines(true);//背景线
leftAxis.setAxisLineColor(getResources().getColor(R.color.colorPrimaryDark)); //.设置比例图标的显示隐藏
Legend l = mBarChart.getLegend();
l.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);
l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.LEFT);
l.setOrientation(Legend.LegendOrientation.HORIZONTAL);
l.setDrawInside(false);
//样式
l.setForm(Legend.LegendForm.CIRCLE);
//字体
l.setFormSize(10f);
//大小
l.setTextSize(13f);
l.setFormToTextSpace(10f);
l.setXEntrySpace(10f); //模拟数据
ArrayList<BarEntry> yVals1 = new ArrayList<BarEntry>();
yVals1.add(new BarEntry(1,23));
yVals1.add(new BarEntry(2, 20));
yVals1.add(new BarEntry(3, 30));
yVals1.add(new BarEntry(4, 10));
yVals1.add(new BarEntry(5, 45));
yVals1.add(new BarEntry(6, 50));
yVals1.add(new BarEntry(7, 35));
yVals1.add(new BarEntry(8, 26));
yVals1.add(new BarEntry(9, 14));
yVals1.add(new BarEntry(10, 20));
yVals1.add(new BarEntry(11, 33));
yVals1.add(new BarEntry(12, 44));
yVals1.add(new BarEntry(13, 42));
yVals1.add(new BarEntry(14, 41));
yVals1.add(new BarEntry(15, 12));
yVals1.add(new BarEntry(16, 31));
yVals1.add(new BarEntry(17, 21));
yVals1.add(new BarEntry(18, 20));
yVals1.add(new BarEntry(19, 44));
yVals1.add(new BarEntry(20, 42));
yVals1.add(new BarEntry(21, 41));
yVals1.add(new BarEntry(22, 12));
yVals1.add(new BarEntry(23, 31));
yVals1.add(new BarEntry(24, 21));
yVals1.add(new BarEntry(25, 20));
setData(yVals1);
}
private void setData(ArrayList yVals1) {
for(int i=1;i<=yVals1.size();i++) {
mlist.add(""+i);
}
IAxisValueFormatter ix=new MyXAxisValueFormatter(mlist);
mBarChart.getXAxis().setValueFormatter(ix); BarDataSet set1;
if (mBarChart.getData() != null &&
mBarChart.getData().getDataSetCount() > 0) {
set1 = (BarDataSet) mBarChart.getData().getDataSetByIndex(0);
set1.setValues(yVals1);
mBarChart.getData().notifyDataChanged();
mBarChart.notifyDataSetChanged();
} else {
set1 = new BarDataSet(yVals1, "The year 2017");
set1.setColors(ColorTemplate.MATERIAL_COLORS);
ArrayList<IBarDataSet> dataSets = new ArrayList<IBarDataSet>();
dataSets.add(set1);
BarData data = new BarData(dataSets);
data.setValueTextSize(10f);
data.setBarWidth(1f);
mBarChart.setData(data);
}
} public class MyXAxisValueFormatter implements IAxisValueFormatter { private List<String> mValues; public MyXAxisValueFormatter(List<String> values) {
this.mValues = values;
} @Override
public String getFormattedValue(float value, AxisBase axis) {
int x=(int)(value);
if (x<0)
x=0;
if (x>=mValues.size())
x=mValues.size()-1;
return mValues.get(x);
}
}
}

最后的结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjU5ODQwMTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

在做的过程中遇到的几个坑说下::

1.xAxis.setAxisMaximum(500f); 设置x轴的最大轴。最開始我是这样设置的。。然后加入BarEntry的时候。随便填写x轴的坐标。

可是最后发现有bug

妈的。

纠结了非常久。

然后看原作者的demo 。发现作者并没有调用xAxis.setAxisMaximum(500f)。。每一个直方图的坐标从1,開始往后数。记住一定要从1
開始。。

从0開始会遇到问题。
2.怎样给 每一个直方图 以下加入标签:主要用到的是IAxisValueFormatter 重写
public String getFormattedValue(float value, AxisBase axis)通过这个value值 获取标签。。可是我debug发现 这个value并非严格的1
,2,3,4,5 等等 这样依照顺序遍历的。所以这种方法 我不是非常理解。看作者的代码也看不懂。坑


demo地址:http://download.csdn.net/detail/qq_25984015/9794208

Android MPAndroidCharts 框架 画可滑动查看的直方图的更多相关文章

  1. Android 仿美团网,探索使用ViewPager+GridView实现左右滑动查看更多分类的功能

    看下效果图,自己考虑下自己会如何实现,然后再继续看看作者的实现~ 不记得什么时候,我留意到到美团网首页有使用ViewPager+GridView实现左右滑动查看更多分类的一个功能,感觉它很有趣,于是想 ...

  2. 2017年Android百大框架排行榜

    框架:提供一定能力的小段程序 >随意转载,标注作者"金诚"即可 >本文已授权微信公众号:鸿洋(hongyangAndroid)原创首发. >本文已经开源到Gith ...

  3. android 优秀框架整理

    程序员界有个神奇的网站,那就是github,这个网站集合了一大批优秀的开源框架,极大地节省了开发者开发的时间,在这里我进行了一下整理,这样可以使我们在使用到时快速的查找到,希望对大家有所帮助! 1. ...

  4. 2017年Android百大框架排行榜(转)

    一.榜单介绍 排行榜包括四大类: 单一框架:仅提供路由.网络层.UI层.通信层或其他单一功能的框架 混合开发框架:提供开发hybrid app.h5与webview结合能力.web app能力的框架 ...

  5. android 开源框架推荐

    同事整理的 android 开源框架,个个都堪称经典.32 个赞! 1.volley 项目地址 https://github.com/smanikandan14/Volley-demo (1)  JS ...

  6. Android自动化框架介绍

    随着Android应用得越来越广,越来越多的公司推出了自己移动应用测试平台.例如,百度的MTC.东软易测云.Testin云测试平台…….由于自己所在项目组就是做终端测试工具的,故抽空了解了下几种常见的 ...

  7. Android开源框架Afinal第一篇——揭开圣女的面纱

    Android开源框架Afinal第一篇——揭开圣女的面纱 分类: Android开源框架哪点事2013-09-02 14:25 260人阅读 评论(0) 收藏 举报 Afinal 这是Afinal在 ...

  8. 六款值得推荐的Android开源框架简介

    技术不再多,知道一些常用的.不错的就够了.下面就是最近整理的“性价比”比较高的Android开源框架,应该是相对实用的. 1.volley 项目地址 https://github.com/smanik ...

  9. Android自动化框架 模拟操作 模拟测试

    转自:http://bbs2.c114.net/home.php?mod=space&uid=1025779&do=blog&id=5322 几种常见的Android自动化测试 ...

随机推荐

  1. python + selenium - selenium常用元素定位

    1. Chrome定位工具 打开Chrome浏览器,按F12会弹出开发者工具选项,选择Elements: 1)鼠标点击最左边箭头 2)鼠标滑动到页面中你要操作的元素,单击一下 3)对应的html元素内 ...

  2. day04_03 题目判断三个数字中的最大值

    num1 = input("Num1:") num2 = input("Num2:") num3 = input("Num3:") 输出三个 ...

  3. oracle 可以连接数据库,vs连不上. 报错提示:ORA-12154: TNS: 无法解析指定的连接标识符

    方法1:问题:VS 连接 Data Source=ORCL_Service19;User Id=*;Password=* 连接不上 oracle 可以连接数据库,vs连不上,报错提示:ORA-1215 ...

  4. jQuery 遍历函数 ,javascript中的each遍历

    jQuery 遍历函数 jQuery 遍历函数包括了用于筛选.查找和串联元素的方法. 函数 描述 .add() 将元素添加到匹配元素的集合中. .andSelf() 把堆栈中之前的元素集添加到当前集合 ...

  5. Python 协程、IO模型

    1.协程(单线程实现并发)2.I/0模型 2.1阻塞I/O 2.2非阻塞I/O 知识点一:协程 协程的目的:是想要在单线程下实现并发(并发看起来是同时运行的) 并发=多个任务间切换+保存状态(正常情况 ...

  6. LineageOS源码定制手机系统

    LineageOS源码定制手机系统 导语: 现在市场的手机基本就两种:  苹果机和android机. 今天我们不谈苹果机, 对小编我来讲,那是个奢侈品, android是我的最爱.对于一般androi ...

  7. 《学习笔记》Maven

    Maven优点之一:jar包统一管理+升级容易+项目清爽 试想一下,我们会在工作中同时创建很多项目,每个项目可能都会引用一些公用的jar包(.NET中是dll文件),一种作法是每个项目里,都复制一份这 ...

  8. 我要好offer之 字符串相关大总结

    1. str*系列手写代码 a. 一定要注意末尾'\0'的处理,切记切记 b. 一定要对输入做有效性判断,多用断言就是了 int Strlen(const char* str) { assert(st ...

  9. CUDA程序计时

    之前写的CUDA程序,想测量一下性能,网上很多用的是CPU端计时,很不准确.翻了一下书,发现这里应该使用事件来计时. CUDA中的事件本质上是一个GPU时间戳,这个时间戳是在用户指定的时间点上记录的. ...

  10. Codeforces Gym101606 D.Deranging Hat (2017 United Kingdom and Ireland Programming Contest (UKIEPC 2017))

    D Deranging Hat 这个题简直了,本来想的是冒泡排序然后逆着输出来的,后来发现不对,因为题目上求的是最优解,而且冒泡的话,输出结果有的超出10000行了,所以就是把一开始的,排好序的字母标 ...