依赖
compile 'org.xclcharts:lib:2.4'
自定义view1
/** * @ClassName DemoView * @Description 各个例子view的view基类 */ public class DemoView extends ChartView{public DemoView(Context context) {super(context); // TODO Auto-generated constructor stub }public DemoView(Context context, AttributeSet attrs){super(context, attrs); }public DemoView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle); }//Demo中bar chart所使用的默认偏移值。 //偏移出来的空间用于显示tick,axistitle.... protected int[] getBarLnDefaultSpadding(){int [] ltrb = new int[4]; ltrb[0] = DensityUtil.dip2px(getContext(), 40); //left ltrb[1] = DensityUtil.dip2px(getContext(), 60); //top ltrb[2] = DensityUtil.dip2px(getContext(), 20); //right ltrb[3] = DensityUtil.dip2px(getContext(), 40); //bottom return ltrb; }protected int[] getPieDefaultSpadding(){int [] ltrb = new int[4]; ltrb[0] = DensityUtil.dip2px(getContext(), 20); //left ltrb[1] = DensityUtil.dip2px(getContext(), 65); //top ltrb[2] = DensityUtil.dip2px(getContext(), 20); //right ltrb[3] = DensityUtil.dip2px(getContext(), 20); //bottom return ltrb; }@Override protected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh); }}
自定义view2
/** * @ClassName SpinnerBarChart01View * @Description 柱形图同数据源不同柱形图切换的例子 */ public class SpinnerBarChart01View extends DemoView {private String TAG = "SpinnerBarChart01View"; private int mChartStyle = 0; private int mOffsetHeight = 0; private BarChart mChart = null; //标签轴 private List<String> chartLabels = new LinkedList<String>(); private List<BarData> chartData = new LinkedList<BarData>(); public SpinnerBarChart01View(Context context, int chartStyle, int offsetHeight) {//主要构造方法 super(context); // TODO Auto-generated constructor stub mChartStyle = chartStyle; mOffsetHeight = offsetHeight; chartLabels(); chartDataSet(); chartRender(); }private void initChart(int chartStyle){switch(chartStyle){case 0: //竖向柱形图 mChart = new BarChart(); //图例 mChart.getAxisTitle().setLeftTitle("百分比"); break; case 1: //横向柱形图 mChart = new BarChart(); mChart.setChartDirection(XEnum.Direction.HORIZONTAL); break; case 2: //竖向3D柱形图 mChart = new BarChart3D(); break; case 3: //横向3D柱形图 mChart = new BarChart3D(); mChart.setChartDirection(XEnum.Direction.HORIZONTAL); break; case 4: //竖向堆叠柱形图 mChart = new StackBarChart(); ((StackBarChart) mChart).setTotalLabelVisible(false); break; case 5: //横向堆叠柱形图 mChart = new StackBarChart(); mChart.setChartDirection(XEnum.Direction.HORIZONTAL); ((StackBarChart) mChart).setTotalLabelVisible(false); break; }}@Override protected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh); //图所占范围大小 //mChart.setChartRange(w,h); }public void chartRender(){try {initChart(mChartStyle); //设置绘图区默认缩进px值,留置空间显示Axis,Axistitle.... int [] ltrb = getBarLnDefaultSpadding(); mChart.setPadding(DensityUtil.dip2px(getContext(), 50),ltrb[1], ltrb[2], ltrb[3]); //主图缩进left, float top, float right,float bottom //数据源 mChart.setDataSource(chartData);//图形数据 mChart.setCategories(chartLabels);//底部标签 //数据轴 mChart.getDataAxis().setAxisMax(100); mChart.getDataAxis().setAxisMin(0); mChart.getDataAxis().setAxisSteps(20); //定义数据轴标签显示格式 mChart.getDataAxis().setLabelFormatter(new IFormatterTextCallBack(){@Override public String textFormatter(String value) {// TODO Auto-generated method stub Double tmp = Double.parseDouble(value); DecimalFormat df = new DecimalFormat("#0"); String label = df.format(tmp).toString(); return label+"%"; }}); //定义柱形上标签显示格式 mChart.getBar().setItemLabelVisible(true); mChart.getBar().getItemLabelPaint().setColor(Color.rgb(72, 61, 139)); mChart.getBar().getItemLabelPaint().setFakeBoldText(true); mChart.setItemLabelFormatter(new IFormatterDoubleCallBack() {@Override public String doubleFormatter(Double value) {// TODO Auto-generated method stub DecimalFormat df=new DecimalFormat("#0"); String label = df.format(value).toString(); return label+"%"; }}); mChart.DeactiveListenItemClick(); } catch (Exception e) {// TODO Auto-generated catch block Log.e(TAG, e.toString()); }}private void chartDataSet(){//标签对应的柱形数据集 List<Double> dataSeriesA= new LinkedList<Double>();//一组一类 dataSeriesA.add(50d); dataSeriesA.add(25d); dataSeriesA.add(20d); BarData BarDataA = new BarData("Google",dataSeriesA,Color.rgb(73, 135, 218)); List<Double> dataSeriesB= new LinkedList<Double>(); dataSeriesB.add(35d); dataSeriesB.add(65d); dataSeriesB.add(75d); BarData BarDataB = new BarData("Baidu",dataSeriesB,Color.rgb(224, 4, 0)); List<Double> dataSeriesC= new LinkedList<Double>(); dataSeriesC.add(15d); dataSeriesC.add(10d); dataSeriesC.add(5d); BarData BarDataC = new BarData("Bing",dataSeriesC,Color.rgb(255, 185, 0)); chartData.add(BarDataA); chartData.add(BarDataB); chartData.add(BarDataC); }private void chartLabels(){chartLabels.add("路人甲"); chartLabels.add("路人乙"); chartLabels.add("路人丙"); }@Override public void render(Canvas canvas) {try{mChart.setChartRange(0.0f, mOffsetHeight, this.getWidth(),this.getHeight() - mOffsetHeight); //mChart.setChartRange(this.getMeasuredWidth(), this.getMeasuredHeight()); mChart.render(canvas); } catch (Exception e){Log.e(TAG, e.toString()); }} }
类型
<string-array name="spinnerbarstyle"> <item>竖向柱形图</item> <item>横向柱形图</item> <item>竖向3D柱形图 </item> <item>横向3D柱形图</item> <item>竖向堆积柱形图 </item> <item>横向堆积柱形图 </item> </string-array>
layout
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:background="@color/white" tools:context=".Myzhuxin" > <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:id="@+id/tv_label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="huangyihuang" /> <Spinner android:id="@+id/spinner1" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> <!-- android:layout_width="match_parent" android:layout_height="wrap_content" --> <LinearLayout android:id="@+id/lay_chart" android:layout_width="500dip" android:layout_height="500dip" android:orientation="vertical"> </LinearLayout> </LinearLayout> </RelativeLayout>
java代码
public class Myzhuxin extends Activity {private Spinner mSpinner = null; private LinearLayout mLaychart = null; private int mSelected = 0; private int mMoveHeight = 0; @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); setContentView(R.layout.myzhuxingtu); mLaychart = (LinearLayout) this.findViewById(R.id.lay_chart); mSpinner = (Spinner) findViewById(R.id.spinner1); mMoveHeight = mSpinner.getHeight(); String[] mItems = null; // 建立数据源 mItems = getResources().getStringArray(R.array.spinnerbarstyle); ArrayAdapter<String> _Adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, mItems); mSpinner.setAdapter(_Adapter); mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {@Override public void onNothingSelected(AdapterView<?> parent) {// TODO Auto-generated method stub }@Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {// TODO Auto-generated method stub renderChart(position); }}); renderChart(0); }private void renderChart(int position) {int width = DensityUtil.dip2px(getApplicationContext(), 300); int height = DensityUtil.dip2px(getApplicationContext(), 400); RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(width, height); layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT); mLaychart.removeAllViews(); SpinnerBarChart01View barChart01 = new SpinnerBarChart01View(this, position, mMoveHeight); mLaychart.addView(barChart01, layoutParams); }}