最近在做项目是有遇到让做一个饼状图,耗费了一段时间去自定义,偶尔发现这个MPAndroidChart,感觉很有必要学习一下。然后就做了一个简单的demo,希望对正在研究他的有所帮助。只是实现了一下简单的功能。
先看效果图:
activity_main的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.view.ViewPager
android:id="@+id/vp_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Hello World!" />
</RelativeLayout>
package com.example.administrator.mpandroidchart;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private ViewPager vp_main;
private String mJson = "[{\"date\":\"2016年5月\",\"obj\":[{\"title\":\"外卖\",\"value\":34},{\"title\":\"娱乐\",\"value\":21},{\"title\":\"其他\",\"value\":45}]},{\"date\":\"2016年6月\",\"obj\":[{\"title\":\"外卖\",\"value\":34},{\"title\":\"娱乐\",\"value\":21},{\"title\":\"其他\",\"value\":45}]},{\"date\":\"2016年7月\",\"obj\":[{\"title\":\"外卖\",\"value\":34},{\"title\":\"娱乐\",\"value\":21},{\"title\":\"其他\",\"value\":45}]},{\"date\":\"2016年8月\",\"obj\":[{\"title\":\"外卖\",\"value\":34},{\"title\":\"娱乐\",\"value\":21},{\"title\":\"其他\",\"value\":45}]}]";
private ArrayList<CtityBean> mData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
vp_main = (ViewPager) findViewById(R.id.vp_main);
initData();
initView();
}
private void initData() {
Gson gson = new Gson();
mData = gson.fromJson(mJson,new TypeToken<ArrayList<CtityBean>>(){}.getType());
}
private void initView() {
vp_main.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
@Override
public Fragment getItem(int position) {
return Fragment1.newInstance(mData.get(position));
}
@Override
public int getCount() {
return mData.size();
}
});
}
}
javabean:
package com.example.administrator.mpandroidchart;
import java.io.Serializable;
import java.util.List;
/**
* Created by Administrator on 2016/11/22.
*/
public class CtityBean implements Serializable {
private String date;
private List<ContentBean> obj;
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public List<ContentBean> getObj() {
return obj;
}
public void setObj(List<ContentBean> obj) {
this.obj = obj;
}
@Override
public String toString() {
return "CtityBean{" +
"date='" + date + '\'' +
", obj=" + obj.toString() +
'}';
}
public float getSunm() {
float sum=0;
for (ContentBean bean:obj){
sum+=bean.getValue();
}
return sum;
}
public float getSunm(int xIndex) {
float sum=0;
for (int i = 0; i < xIndex; i++) {
sum+=obj.get(i).getValue();
}
return sum;
}
class ContentBean {
private String title;
private float value;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public float getValue() {
return value;
}
public void setValue(float value) {
this.value = value;
}
@Override
public String toString() {
return "ContentBean{" +
"title='" + title + '\'' +
", value=" + value +
'}';
}
}
}
fragment布局文件:
<?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/pc_chart"
android:layout_width="match_parent"
android:layout_height="match_parent"></com.github.mikephil.charting.charts.PieChart>
</LinearLayout>
fragment:
package com.example.administrator.mpandroidchart;
import android.graphics.Color;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.github.mikephil.charting.charts.PieChart;
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.listener.OnChartValueSelectedListener;
import com.github.mikephil.charting.utils.Highlight;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Administrator on 2016/11/22.
*/
public class Fragment1 extends Fragment implements OnChartValueSelectedListener {
private CtityBean mData;
private PieChart pc_chart;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle arguments = getArguments();
mData = (CtityBean) arguments.getSerializable("DATA_KEY");
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment1,null);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
pc_chart = (PieChart) view.findViewById(R.id.pc_chart);
initData();
}
private void initData() {
setData();
pc_chart.getLegend().setEnabled(false);
pc_chart.setDescription("");
pc_chart.setRotationEnabled(true);
pc_chart.setOnChartValueSelectedListener(this);
}
private void setData() {
List<String> titles=new ArrayList<>();
List<Entry> entry=new ArrayList<>();
for (int i = 0; i <mData.getObj().size() ; i++) {
CtityBean.ContentBean contentBean = mData.getObj().get(i);
titles.add(contentBean.getTitle());
entry.add(new Entry(contentBean.getValue(),i));
}
PieDataSet dataSet=new PieDataSet(entry,"");
dataSet.setColors(new int[]{Color.rgb(216,1,1),Color.rgb(1,216,1),Color.rgb(1,1,216)});
PieData data=new PieData(titles,dataSet);
data.setValueTextSize(22);
pc_chart.setData(data);
}
public static Fragment1 newInstance(CtityBean mData) {
Bundle args = new Bundle();
args.putSerializable("DATA_KEY",mData);
Fragment1 fragment = new Fragment1();
fragment.setArguments(args);
return fragment;
}
@Override
public void onValueSelected(Entry entry, int i, Highlight highlight) {
float proportion=360f/mData.getSunm();
float angle=90f-mData.getObj().get(entry.getXIndex()).getValue()*proportion/2-mData.getSunm(entry.getXIndex())*proportion;
pc_chart.setRotationAngle(angle);
}
@Override
public void onNothingSelected() {
}
}