Android MPAndroidCharts 框架 画可滑动查看的直方图

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);
        }
    }
}

最后的结果:

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

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

时间: 2024-10-13 23:25:30

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

android多媒体框架学习 详解 最新版本

一:多媒体框架概述   jellybean 的多媒体跟以前的版本,通过对比没啥变化,最大的变化是google终于舍得给multimedia建个独立的git了(framework/av),等你好久了!也体现了media 在整个android系统中的重要性!framework/av下都是些C/C++代码(libmedia,libmediaplayerservice,libstagefright),jni和 java api 还是保留在原来的位置,改革还不够彻底,但还是迈出了这一步,以后维护能更好的进

AFinal-开源android应用框架简介

正文 1. 官方网站 开源中国社区AFinal项目 2. 简介 Afinal 是一个android的sqlite orm 和 ioc 框架. 同时封装了android中的http框架,使其更加简单易用:使用finalBitmap,无需考虑bitmap在android 中加载的时候oom的问题和快速滑动的时候图片加载位置错位等问题. Afinal的宗旨是简洁,快速.约定大于配置的方式.尽量一行代码完成所有事情. 什么是orm? 对象关系映射(英语:Object Relational Mapping

Android View框架的measure机制

概述 Android中View框架的工作机制中,主要有三个过程: 1.View树的測量(measure)Android View框架的measure机制 2.View树的布局(layout) Android View框架的layout机制 3.View树的绘制(draw)Android View框架的draw机制 View框架的工作流程为:測量每一个View大小(measure)-->把每一个View放置到对应的位置(layout)-->绘制每一个View(draw).          本文

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

Android开源框架Afinal第一篇——揭开圣女的面纱 分类: Android开源框架哪点事2013-09-02 14:25 260人阅读 评论(0) 收藏 举报 Afinal 这是Afinal在github的地址:https://github.com/yangfuhai/afinal Afinal这个框架主要分4块: 1.FinalDB模块:android中的orm框架,一行代码就可以进行增删改查.支持一对多,多对一等查询. 2.FinalActivity模块:android中的ioc框架

android 开源框架推荐

同事整理的 android 开源框架,个个都堪称经典.32 个赞! 1.volley 项目地址 https://github.com/smanikandan14/Volley-demo (1)  JSON,图像等的异步下载: (2)  网络请求的排序(scheduling) (3)  网络请求的优先级处理 (4)  缓存 (5)  多级别取消请求 (6)  和Activity和生命周期的联动(Activity结束时同时取消所有网络请求) 2.android-async-http  项目地址:ht

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

转自:http://bbs2.c114.net/home.php?mod=space&uid=1025779&do=blog&id=5322 几种常见的Android自动化测试框架及其应用 随着Android应用得越来越广,越来越多的公司推出了自己移动应用测试平台.例如,百度的MTC.东软易测云.Testin云测试平台…….由于自己所在项目组就是做终端测试工具的,故抽空了解了下几种常见的基于UI层面的自动化测试工具.趁晚上有空总结下,好记心不如烂笔头呀! 一 常见Android自动

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

技术不再多,知道一些常用的.不错的就够了.下面就是最近整理的“性价比”比较高的Android开源框架,应该是相对实用的. 1.volley 项目地址 https://github.com/smanikandan14/Volley-demo JSON,图像等的异步下载: 网络请求的排序(scheduling) 网络请求的优先级处理 缓存 多级别取消请求 和Activity和生命周期的联动(Activity结束时同时取消所有网络请求) 2.android-async-http 项目地址:https:

Android自动化框架

Android自动化框架 已有 2085 次阅读2014-8-26 12:19 | Android 几种常见的Android自动化测试框架及其应用 随着Android应用得越来越广,越来越多的公司推出了自己移动应用测试平台.例如,百度的MTC.东软易测云.Testin云测试平台…….由于自己所在项目组就是做终端测试工具的,故抽空了解了下几种常见的基于UI层面的自动化测试工具.趁晚上有空总结下,好记心不如烂笔头呀! 一 常见Android自动化测试框架及其应用 目前,Android基于UI层面的自

Android Xutils 框架

Android Xutils 框架 (转) 目录(?)[-] xUtils简介 目前xUtils主要有四大模块 使用xUtils快速开发框架需要有以下权限 混淆时注意事项 DbUtils使用方法 ViewUtils使用方法 HttpUtils使用方法 普通get方法 使用HttpUtils上传文件 或者 提交数据 到服务器post方法 使用HttpUtils下载文件 BitmapUtils 使用方法 其他更多示例代码见sample文件夹中的代码 输出日志 LogUtils xUtils简介 xU