MPAndroidChart实在好用,简单学习了下相关知识,并进行了实践。画出了雷达图、饼图、气泡图、散点图、柱状图等。使用起来还是有套路的,应该找到规律再去画就不会混乱了。
一.效果
图1 饼图 图2 柱状图 图3 柱状图2
图4 折线图 图5 散点图 图6 气泡图
图7 雷达图
二.MPAndroid的使用准备(基于Android Studio):
1.在build.gradle(Project)中加入如下代码:
2.在build.gradle(Module)中加入如下代码:
compile 'com.github.PhilJay:MPAndroidChart:v2.2.5'
3.注意这里引的不是最新的版本,因为最新的版本X轴配置太复杂,不如旧版本的方便。
三.以饼图为例进行说明(详细的注释请见代码):
1.Mainctivity.java
package com.example.leidong.androidcharts;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button button1, button2, button3, button4, button5, button6, button7;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initWigits();
initAction();
}
/**
* 初始化事件
*/
private void initAction() {
button1.setOnClickListener(this);
button2.setOnClickListener(this);
button3.setOnClickListener(this);
button4.setOnClickListener(this);
button5.setOnClickListener(this);
button6.setOnClickListener(this);
button7.setOnClickListener(this);
}
/**
* 初始化控件
*/
private void initWigits() {
button1 = (Button) findViewById(R.id.button1);
button2 = (Button) findViewById(R.id.button2);
button3 = (Button) findViewById(R.id.button3);
button4 = (Button) findViewById(R.id.button4);
button5 = (Button) findViewById(R.id.button5);
button6 = (Button) findViewById(R.id.button6);
button7 = (Button) findViewById(R.id.button7);
}
/**
* 按钮点击事件监听
* @param v
*/
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.button1:
Intent intent1 = new Intent(MainActivity.this, PieActivity.class);
startActivity(intent1);
break;
case R.id.button2:
Intent intent2 = new Intent(MainActivity.this, BarActivity.class);
startActivity(intent2);
break;
case R.id.button3:
Intent intent3 = new Intent(MainActivity.this, LineActivity.class);
startActivity(intent3);
break;
case R.id.button4:
Intent intent4 = new Intent(MainActivity.this, ScatterActivity.class);
startActivity(intent4);
break;
case R.id.button5:
Intent intent5 = new Intent(MainActivity.this, BubbleActivity.class);
startActivity(intent5);
break;
case R.id.button6:
Intent intent6 = new Intent(MainActivity.this, RadarActivity.class);
startActivity(intent6);
break;
case R.id.button7:
Intent intent7 = new Intent(MainActivity.this, HalfPieActivity.class);
startActivity(intent7);
break;
default:
break;
}
}
}
2.PieActivity.java
package com.example.leidong.androidcharts;
import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import com.example.leidong.androidcharts.fragments.PieFragment;
/**
* Created by leidong on 2017/5/12.
*/
public class PieActivity extends AppCompatActivity implements View.OnClickListener {
private Button button;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pie);
initWidgets();
initAction();
}
/**
* 初始化动作
*/
private void initAction() {
button.setOnClickListener(this);
}
/**
* 获取组件
*/
private void initWidgets() {
button = (Button) findViewById(R.id.button);
}
/**
* 按钮点击
* @param v
*/
@Override
public void onClick(View v) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
switch (v.getId()){
case R.id.button:
PieFragment pieFragment = new PieFragment();
transaction.replace(R.id.piechart, pieFragment);
transaction.commit();
break;
default:
break;
}
}
}
3.BarFragment.java
package com.example.leidong.androidcharts.fragments;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.example.leidong.androidcharts.R;
import com.github.mikephil.charting.animation.Easing;
import com.github.mikephil.charting.charts.PieChart;
import com.github.mikephil.charting.components.Legend;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.PieData;
import com.github.mikephil.charting.data.PieDataSet;
import com.github.mikephil.charting.formatter.PercentFormatter;
import com.github.mikephil.charting.utils.ColorTemplate;
import java.util.ArrayList;
/**
* Created by leidong on 2017/5/14.
*/
public class PieFragment extends Fragment {
private PieChart pieChart;
private PieData pieData;
//X轴数据
private ArrayList<String> names = new ArrayList<>();
//Y轴数据
private ArrayList<Entry> counts = new ArrayList<>();
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
names.add("五毒");
names.add("天香");
names.add("真武");
names.add("神刀");
names.add("唐门");
names.add("太白");
names.add("丐帮");
names.add("神威");
counts.add(new Entry(12,0));
counts.add(new Entry(4, 1));
counts.add(new Entry(8, 2));
counts.add(new Entry(16, 3));
counts.add(new Entry(22, 4));
counts.add(new Entry(18, 5));
counts.add(new Entry(9, 6));
counts.add(new Entry(11, 7));
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
super.onCreateView(inflater, container, savedInstanceState);
View view = inflater.inflate(R.layout.pie_fragment, container, false);
pieChart = (PieChart) view.findViewById(R.id.piechart_f);
pieData = getPieData();
showPieChart(pieChart, pieData);
return view;
}
@Override
public void onDestroy(){
super.onDestroy();
}
/**
* 显示饼图
* @param pieChart
* @param pieData
*/
private void showPieChart(PieChart pieChart, PieData pieData) {
pieChart.setData(pieData);
pieChart.animateY(1400, Easing.EasingOption.EaseInOutQuad);//设置显示动画,转一圈
}
/**
* 得到饼图数据
* @return
*/
public PieData getPieData() {
//Configure pie chart
pieChart.setUsePercentValues(true);//显示百分比格式
pieChart.setDescription("饼图");//Description内容
pieChart.setDescriptionPosition(750, 70);//Description位置
pieChart.setDescriptionTextSize(40);//Description字体
//饼图中间的小圆配置
pieChart.setDrawHoleEnabled(true);//允许饼图中间有小圆
pieChart.setHoleColor(Color.TRANSPARENT);//饼图中间小圆透明
pieChart.setHoleRadius(20);//中间小圆的半径
pieChart.setTransparentCircleRadius(23);//这个自己试,是中间小圆套着的外面一层圆
pieChart.setCenterText("八荒门派");//中间文字
//允许旋转
pieChart.setRotationEnabled(true);
pieChart.setRotationAngle(0);
//配置图例
Legend legend = pieChart.getLegend();
legend.setPosition(Legend.LegendPosition.LEFT_OF_CHART_INSIDE);//图例位置
legend.setForm(Legend.LegendForm.CIRCLE);//设置图例颜色块形状
legend.setTextSize(12);//设置图例字体
PieDataSet pieDataSet = new PieDataSet(counts, "");
pieDataSet.setSliceSpace(3);//扇形间距
pieDataSet.setSelectionShift(15);//设置点击突出距离
//添加颜色
ArrayList<Integer> cs = new ArrayList<>();
for (int c : ColorTemplate.VORDIPLOM_COLORS) {
cs.add(c);
}
for (int c : ColorTemplate.JOYFUL_COLORS) {
cs.add(c);
}
for (int c : ColorTemplate.COLORFUL_COLORS) {
cs.add(c);
}
for (int c : ColorTemplate.LIBERTY_COLORS) {
cs.add(c);
}
for (int c : ColorTemplate.PASTEL_COLORS) {
cs.add(c);
}
cs.add(ColorTemplate.getHoloBlue());
pieDataSet.setColors(cs);
PieData pieData = new PieData(names, pieDataSet);
pieData.setValueFormatter(new PercentFormatter());
pieData.setValueTextSize(14f);//PieData字体
pieData.setValueTextColor(Color.BLACK);//PieData字体颜色
pieData.setHighlightEnabled(true);//高亮显示
return pieData;
}
}
4.activity_pie.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="16dp">
<LinearLayout
android:id="@+id/piechart"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="饼图"
android:layout_gravity="center_horizontal"/>
</LinearLayout>
5.pie_fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.github.mikephil.charting.charts.PieChart
android:id="@+id/piechart_f"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
完整的工程下载:
https://github.com/leidongld/AndroidCharts