Android開源圖表之樹狀圖和餅狀圖的官方示例的整理


  最近由於工作需要,所以就在github上搜了下關於chart的三方框架

  官方地址https://github.com/PhilJay/MPAndroidChart

  由於工作需要我這里整理了一份Eclipse版本的類庫.(有需要要的留下郵箱)

  

    這就是Code中的效果(樹狀圖)

    

  1 public class BarChartActivity extends Activity implements OnChartValueSelectedListener{
  2 
  3     private BarChart mChart;
  4     private Typeface mTfLight;
  5 
  6     @Override
  7     protected void onCreate(Bundle savedInstanceState) {
  8         // TODO Auto-generated method stub
  9         super.onCreate(savedInstanceState);
 10         setContentView(R.layout.activity_barchart);
 11         
 12         mTfLight = Typeface.createFromAsset(getAssets(), "OpenSans-Light.ttf");
 13         
 14         mChart = (BarChart) findViewById(R.id.chart1);
 15         mChart.setOnChartValueSelectedListener(this);
 16 
 17         mChart.setDrawBarShadow(false);//--繪制當前展示的內容頂部陰影
 18         mChart.setDrawValueAboveBar(true);//--繪制的圖形都在bar頂部
 19 
 20         mChart.setDescription("");
 21 
 22         // if more than 60 entries are displayed in the chart, no values will be
 23         // drawn
 24         mChart.setMaxVisibleValueCount(80); //Y方向的最大值.
 25 
 26         // scaling can now only be done on x- and y-axis separately
 27         mChart.setPinchZoom(false);  //--雙指縮放.
 28 
 29         mChart.setDrawGridBackground(false);//--繪制中心內容區域背景色.
 30         // mChart.setDrawYLabels(false);
 31 
 32         XAxis xAxis = mChart.getXAxis();
 33         xAxis.setPosition(XAxisPosition.BOTTOM);
 34         xAxis.setTypeface(mTfLight);
 35         xAxis.setDrawGridLines(false);//--是否繪制豎直分割線.
 36         xAxis.setGranularity(1f); // only intervals of 1 day  底部label的分割間隙
 37         xAxis.setLabelCount(5);  //--對應的當前繪制在底部的label數
 38         xAxis.setValueFormatter(new DayAxisValueFormatter(mChart));
 39 
 40         AxisValueFormatter custom = new MyAxisValueFormatter();
 41 
 42         YAxis leftAxis = mChart.getAxisLeft();
 43         leftAxis.setTypeface(mTfLight);
 44         leftAxis.setDrawGridLines(false); //-繪制水平分割線,按照當前Y方向的label點為起始點
 45         leftAxis.setLabelCount(8, false); //--繪制Y方向(應該)被顯示的數量,第二個參數表示label是否是精准變化,還是近似變化
 46         leftAxis.setValueFormatter(custom);
 47         leftAxis.setPosition(YAxisLabelPosition.OUTSIDE_CHART);//Y方向文字的位置,在線外側.(默認在外側)
 48         leftAxis.setSpaceTop(15f);  //分割線的間距百分比.
 49         leftAxis.setAxisMinValue(0f); // this replaces setStartAtZero(true)  Y方向的起始值.
 50 
 51         YAxis rightAxis = mChart.getAxisRight();
 52         rightAxis.setDrawGridLines(true); //-繪制水平分割線,按照當前Y方向的label點為起始點
 53         rightAxis.setTypeface(mTfLight);
 54         rightAxis.setLabelCount(8, false);
 55         rightAxis.setValueFormatter(custom);
 56         rightAxis.setSpaceTop(15f);
 57         rightAxis.setAxisMinValue(0f); // this replaces setStartAtZero(true)
 58 
 59         Legend l = mChart.getLegend();
 60         l.setForm(LegendForm.SQUARE); //--設置legend的形狀.
 61         l.setPosition(LegendPosition.BELOW_CHART_LEFT); //--設置legend的位置.
 62         l.setFormSize(12f);            //--設置legend的大小
 63         l.setTextSize(12f);               //--設置legend上的文字大小
 64 //        l.setXEntrySpace(100f);         
 65         l.setYOffset(30f);
 66         // l.setExtra(ColorTemplate.VORDIPLOM_COLORS, new String[] { "abc",
 67         // "def", "ghj", "ikl", "mno" });
 68         // l.setCustom(ColorTemplate.VORDIPLOM_COLORS, new String[] { "abc",
 69         // "def", "ghj", "ikl", "mno" });
 70         mChart.animateY(3000);
 71         mChart.setPinchZoom(true);
 72         setData(12, 80);
 73     }
 74     
 75     private void setData(int count, float range) {
 76 
 77         float start = 0f;
 78 
 79         mChart.getXAxis().setAxisMinValue(start);
 80         mChart.getXAxis().setAxisMaxValue(start + count + 2);
 81 
 82         ArrayList<BarEntry> yVals1 = new ArrayList<BarEntry>();
 83 
 84         for (int i = (int) start; i < start + count + 1; i++) {
 85             float mult = (range + 1);
 86             float val = (float) (Math.random() * mult);
 87             BarEntry barEntry = new BarEntry(i + 1f, val);
 88             
 89             yVals1.add(barEntry);
 90         }
 91 
 92         BarDataSet set1;
 93 
 94         if (mChart.getData() != null &&
 95                 mChart.getData().getDataSetCount() > 0) {
 96             set1 = (BarDataSet) mChart.getData().getDataSetByIndex(0);
 97             set1.setValues(yVals1);
 98             mChart.getData().notifyDataChanged();
 99             mChart.notifyDataSetChanged();
100         } else {
101             set1 = new BarDataSet(yVals1, "The year 2017");
102             set1.setBarBorderWidth(1);
103             set1.setColors(ColorTemplate.MATERIAL_COLORS);
104 
105             ArrayList<IBarDataSet> dataSets = new ArrayList<IBarDataSet>();
106             dataSets.add(set1);
107 
108             BarData data = new BarData(dataSets);
109             data.setValueTextSize(10f);
110             data.setValueTypeface(mTfLight);
111             
112             data.setBarWidth(0.8f);//--設置bar的寬度 ,取值(0-1).
113 
114             mChart.setData(data);
115         }
116     }
117 
118     protected RectF mOnValueSelectedRectF = new RectF();
119     
120     @Override
121     public void onValueSelected(Entry e, Highlight h) {
122         // TODO Auto-generated method stub
123          if (e == null)
124                 return;
125 
126             RectF bounds = mOnValueSelectedRectF;
127             mChart.getBarBounds((BarEntry) e, bounds);
128             MPPointF position = mChart.getPosition(e, AxisDependency.LEFT);
129 
130             Log.i("bounds", bounds.toString());
131             Log.i("position", position.toString());
132 
133             Log.i("x-index",
134                     "low: " + mChart.getLowestVisibleX() + ", high: "
135                             + mChart.getHighestVisibleX());
136 
137             MPPointF.recycleInstance(position);
138     }
139 
140     @Override
141     public void onNothingSelected() {
142         // TODO Auto-generated method stub
143         
144     }
145 
146     @Override
147     public boolean onCreateOptionsMenu(Menu menu) {
148         getMenuInflater().inflate(R.menu.bar, menu);
149         return true;
150     }
151 
152     @Override
153     public boolean onOptionsItemSelected(MenuItem item) {
154 
155         switch (item.getItemId()) {
156             case R.id.actionToggleValues: {
157                 for (IDataSet set : mChart.getData().getDataSets())
158                     set.setDrawValues(!set.isDrawValuesEnabled());
159 
160                 mChart.invalidate();
161                 break;
162             }
163             case R.id.actionToggleHighlight: {
164                 if (mChart.getData() != null) {
165                     mChart.getData().setHighlightEnabled(!mChart.getData().isHighlightEnabled());
166                     mChart.invalidate();
167                 }
168                 break;
169             }
170             case R.id.actionTogglePinch: {
171                 if (mChart.isPinchZoomEnabled())
172                     mChart.setPinchZoom(false);
173                 else
174                     mChart.setPinchZoom(true);
175 
176                 mChart.invalidate();
177                 break;
178             }
179             case R.id.actionToggleAutoScaleMinMax: {
180                 mChart.setAutoScaleMinMaxEnabled(!mChart.isAutoScaleMinMaxEnabled());
181                 mChart.notifyDataSetChanged();
182                 break;
183             }
184             case R.id.actionToggleBarBorders: {
185                 for (IBarDataSet set : mChart.getData().getDataSets())
186                     ((BarDataSet) set).setBarBorderWidth(set.getBarBorderWidth() == 1.f ? 0.f : 1.f);
187 
188                 mChart.invalidate();
189                 break;
190             }
191             case R.id.animateX: {
192                 mChart.animateX(3000);
193                 break;
194             }
195             case R.id.animateY: {
196                 mChart.animateY(3000);
197                 break;
198             }
199             case R.id.animateXY: {
200 
201                 mChart.animateXY(3000, 3000);
202                 break;
203             }
204             case R.id.actionSave: {
205                 if (mChart.saveToGallery("title" + System.currentTimeMillis(), 50)) {
206                     Toast.makeText(getApplicationContext(), "Saving SUCCESSFUL!",
207                             Toast.LENGTH_SHORT).show();
208                 } else
209                     Toast.makeText(getApplicationContext(), "Saving FAILED!", Toast.LENGTH_SHORT)
210                             .show();
211                 break;
212             }
213         }
214         return true;
215     }

 

    上述代碼中關鍵點已經加入注釋,純屬自己個個人研究理解,那里理解不對的地方,回應告知

   說完樹狀圖緊接着就是餅狀圖我這里分別實現了兩種,不過基本code都是一樣的

 

 

    不多說直接上代碼:

  

  1 public class PieChartActivity extends Activity implements OnChartValueSelectedListener {
  2 
  3     private PieChart mChart;
  4     private Typeface mTfRegular;
  5     private Typeface mTfLight;
  6     
  7     protected String[] mMonths = new String[] {
  8                 "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"
  9     };
 10 
 11     protected String[] mParties = new String[] {
 12             "Party A", "Party B", "Party C", "Party D", "Party E", "Party F", "Party G", "Party H",
 13             "Party I", "Party J", "Party K", "Party L", "Party M", "Party N", "Party O", "Party P",
 14             "Party Q", "Party R", "Party S", "Party T", "Party U", "Party V", "Party W", "Party X",
 15             "Party Y", "Party Z"
 16     };
 17 
 18     @Override
 19     protected void onCreate(Bundle savedInstanceState) {
 20         super.onCreate(savedInstanceState);
 21         setContentView(R.layout.activity_main);
 22         
 23         mTfRegular = Typeface.createFromAsset(getAssets(), "OpenSans-Regular.ttf");
 24         mTfLight = Typeface.createFromAsset(getAssets(), "OpenSans-Light.ttf");
 25         
 26         mChart = (PieChart) findViewById(R.id.chart1);
 27         mChart.setUsePercentValues(true);
 28         mChart.setDescription("描述內容");
 29         mChart.setDescriptionTextSize(20);
 30         
 31         mChart.setExtraOffsets(5, 5, 5, 5);
 32 
 33         mChart.setDragDecelerationFrictionCoef(0.95f);
 34 
 35         mChart.setCenterTextTypeface(mTfLight);
 36         mChart.setCenterText(generateCenterSpannableText());//--設置中心點文字
 37 
 38         mChart.setDrawHoleEnabled(true);
 39         mChart.setHoleColor(Color.RED);
 40 
 41         mChart.setTransparentCircleColor(Color.BLUE);//--內圓邊框色
 42         mChart.setTransparentCircleAlpha(110);       //--內圓邊框透明度
 43 
 44         mChart.setHoleRadius(58f); //--內院半徑
 45         mChart.setTransparentCircleRadius(61f); //--內圓邊框大小半徑
 46 
 47         mChart.setDrawCenterText(true);
 48 
 49         mChart.setRotationAngle(0); //--繪制的開始位置
 50         // enable rotation of the chart by touch
 51         mChart.setRotationEnabled(true);     //--允許旋轉
 52         mChart.setHighlightPerTapEnabled(true); //---允許點擊其中某個扇形區域.
 53 
 54         // add a selection listener
 55         mChart.setOnChartValueSelectedListener(this);
 56 
 57         setData(8, 100);
 58 
 59         mChart.animateY(1400, Easing.EasingOption.EaseInOutQuad);
 60 
 61         Legend l = mChart.getLegend();
 62         l.setPosition(LegendPosition.RIGHT_OF_CHART);
 63         l.setXEntrySpace(100f);
 64         l.setYEntrySpace(0f);
 65         l.setYOffset(0f);
 66 
 67         // entry label styling
 68         mChart.setEntryLabelColor(Color.RED); //--設置餅狀圖其中各個塊上的文字顏色
 69         mChart.setEntryLabelTypeface(mTfRegular);//---設置字體
 70         mChart.setEntryLabelTextSize(24f);    //--設置字體大小
 71     }
 72 
 73      private void setData(int count, float range) {
 74 
 75             float mult = range;
 76 
 77             ArrayList<PieEntry> entries = new ArrayList<PieEntry>();
 78 
 79             // NOTE: The order of the entries when being added to the entries array determines their position around the center of
 80             // the chart.
 81             for (int i = 0; i < count ; i++) {
 82                 entries.add(new PieEntry((float) ((Math.random() * mult) + mult / 5), mParties[i % mParties.length]));
 83             }
 84             
 85 //            PieEntry --參數說明:第一個參數代表半分比,第二個參數表示名字。
 86 
 87             PieDataSet dataSet = new PieDataSet(entries, "<一張圖>");
 88             dataSet.setSliceSpace(6f);//--餅狀圖
 89             dataSet.setSelectionShift(15f);//--選中餅狀圖時,向外擴張的大小.
 90 
 91             // add a lot of colors
 92 
 93             ArrayList<Integer> colors = new ArrayList<Integer>();
 94 
 95             for (int c : ColorTemplate.VORDIPLOM_COLORS)
 96                 colors.add(c);
 97 
 98             for (int c : ColorTemplate.JOYFUL_COLORS)
 99                 colors.add(c);
100 
101             for (int c : ColorTemplate.COLORFUL_COLORS)
102                 colors.add(c);
103 
104             for (int c : ColorTemplate.LIBERTY_COLORS)
105                 colors.add(c);
106 
107             for (int c : ColorTemplate.PASTEL_COLORS)
108                 colors.add(c);
109 
110             colors.add(ColorTemplate.getHoloBlue());
111 
112             dataSet.setColors(colors);
113 
114             PieData data = new PieData(dataSet);
115             data.setValueFormatter(new PercentFormatter());
116             data.setValueTextSize(20f);       //--設置字體大小
117             data.setValueTextColor(Color.RED);//--設置餅狀圖其中各個塊上的百分比顏色
118             data.setValueTypeface(mTfLight);  //--設置字體
119             mChart.setData(data);
120 
121             // undo all highlights
122             mChart.highlightValues(null);
123 
124             mChart.invalidate();
125         }
126 
127     
128     private SpannableString generateCenterSpannableText() {
129 
130         SpannableString s = new SpannableString("MPAndroidChart\ndeveloped by Philipp Jahoda");
131         s.setSpan(new RelativeSizeSpan(1.7f), 0, 14, 0);
132         s.setSpan(new StyleSpan(Typeface.NORMAL), 14, s.length() - 15, 0);
133         s.setSpan(new ForegroundColorSpan(Color.GRAY), 14, s.length() - 15, 0);
134         s.setSpan(new RelativeSizeSpan(.8f), 14, s.length() - 15, 0);
135         s.setSpan(new StyleSpan(Typeface.ITALIC), s.length() - 14, s.length(), 0);
136         s.setSpan(new ForegroundColorSpan(ColorTemplate.getHoloBlue()), s.length() - 14, s.length(), 0);
137         return s;
138     }
139     
140     @Override
141     public boolean onCreateOptionsMenu(Menu menu) {
142         getMenuInflater().inflate(R.menu.pie, menu);
143         return true;
144     }
145 
146     @Override
147     public boolean onOptionsItemSelected(MenuItem item) {
148 
149         switch (item.getItemId()) {
150             case R.id.actionToggleValues: {
151                 for (IDataSet<?> set : mChart.getData().getDataSets())
152                     set.setDrawValues(!set.isDrawValuesEnabled());
153 
154                 mChart.invalidate();
155                 break;
156             }
157             case R.id.actionToggleHole: {
158                 if (mChart.isDrawHoleEnabled())
159                     mChart.setDrawHoleEnabled(false);
160                 else
161                     mChart.setDrawHoleEnabled(true);
162                 mChart.invalidate();
163                 break;
164             }
165             case R.id.actionDrawCenter: {
166                 if (mChart.isDrawCenterTextEnabled())
167                     mChart.setDrawCenterText(false);
168                 else
169                     mChart.setDrawCenterText(true);
170                 mChart.invalidate();
171                 break;
172             }
173             case R.id.actionToggleXVals: {
174 
175                 mChart.setDrawEntryLabels(!mChart.isDrawEntryLabelsEnabled());
176                 mChart.invalidate();
177                 break;
178             }
179             case R.id.actionSave: {
180                 // mChart.saveToGallery("title"+System.currentTimeMillis());
181                 mChart.saveToPath("title" + System.currentTimeMillis(), "");
182                 break;
183             }
184             case R.id.actionTogglePercent:
185                 mChart.setUsePercentValues(!mChart.isUsePercentValuesEnabled());
186                 mChart.invalidate();
187                 break;
188             case R.id.animateX: {
189                 mChart.animateX(1400);
190                 break;
191             }
192             case R.id.animateY: {
193                 mChart.animateY(1400);
194                 break;
195             }
196             case R.id.animateXY: {
197                 mChart.animateXY(1400, 1400);
198                 break;
199             }
200             case R.id.actionToggleSpin: {
201                 mChart.spin(1000, mChart.getRotationAngle(), mChart.getRotationAngle() + 360, Easing.EasingOption
202                         .EaseInCubic);
203                 break;
204             }
205         }
206         return true;
207     }
208 
209 
210 
211     @Override
212     public void onValueSelected(Entry e, Highlight h) {
213         // TODO Auto-generated method stub
214          if (e == null)
215                 return;
216             Log.i("VAL SELECTED",
217                     "Value: " + e.getY() + ", index: " + h.getX()
218                             + ", DataSet index: " + h.getDataSetIndex());
219         
220     }
221 
222 
223     @Override
224     public void onNothingSelected() {
225         // TODO Auto-generated method stub
226         Log.i("PieChart", "nothing selected");
227     }
228     
229 }

 

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM