柱状图
来源:互联网 发布:修改身份证年龄软件 编辑:程序博客网 时间:2024/04/29 12:39
效果图:
柱状图的效果是从下往上逐渐增长,并且每个柱状图是可以响应点击事件的。
package com.example.wavedemo;import java.util.ArrayList;import java.util.List;import com.example.wavedemo.BarPic5.OnClickListener;import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.widget.Toast;public class MainActivity3 extends Activity {private BarPic5 barPic;private List<BarBean> lists;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main3);barPic=(BarPic5) findViewById(R.id.barpic);lists=new ArrayList<BarBean>();lists.add(new BarBean("高流动性","5%",100,5));lists.add(new BarBean("固定收益","1%",100,1));lists.add(new BarBean("浮动收益","50%",100,50));lists.add(new BarBean("另类投资","100%",100,100));barPic.setData(lists);new Thread(barPic).start();barPic.setOnClickListener(new OnClickListener() {@Overridepublic void onclick(int i) {Toast.makeText(MainActivity3.this, lists.get(i).getDescription()+(lists.get(i).isFlag()?"选中":"取消选中"), Toast.LENGTH_SHORT).show();}});}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {return super.onOptionsItemSelected(item);}}
package com.example.wavedemo;import java.util.List;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Paint.Align;import android.graphics.Paint.FontMetrics;import android.text.TextPaint;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;public class BarPic5 extends View implements Runnable {private Paint linePaint;// 线条画笔private int width;// 控件的宽高private int height;private int perWidth;// 每个柱状图的宽度private int space = 10;// 柱状图之间的间距private int num = 7;// 线的条数private int lineSpace;// 线条之间的间隔private int startX, startY, endX, endY;// 记录线条的位置private Paint barPaint;private int startPadding = 20;// 要绘制的柱状图距离边界起始结束距离private int endPadding = 20;private int lineStartX, lineEndX, lineStartY, lineEndY;// 记录柱状图位置private int maskStartX, maskEndX, maskStartY, maskEndY;// 记录遮罩位置private TextPaint textPaint;private Paint maskPaint;// 遮罩画笔private FontMetrics metrics;// 字体测量private FontMetrics dataMetrics;private int baseline;private TextPaint dataPaint;// 绘制数据画笔private int dataHeight;private List<BarBean> lists;private int maskHeight;//遮罩高度private OnClickListener listener;public BarPic5(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);init();}public BarPic5(Context context, AttributeSet attrs) {super(context, attrs);init();}public BarPic5(Context context) {super(context);init();}public void init() {linePaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);linePaint.setColor(Color.parseColor("#bebebe"));linePaint.setStrokeWidth(2);barPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);textPaint.setColor(Color.parseColor("#ffffff"));textPaint.setTextSize(50);textPaint.setTextAlign(Align.CENTER);metrics = textPaint.getFontMetrics();maskPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);dataPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);dataPaint.setTextSize(40);dataPaint.setTextAlign(Align.CENTER);dataMetrics = dataPaint.getFontMetrics();}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);width = w;height = h;maskHeight=(int) (7.0 / 8 * height);perWidth = (width - getPaddingLeft() - getPaddingRight() - 3 * space- startPadding - endPadding) / 4;if (num >= 2) {lineSpace = height / (num - 1);}barPaint.setStrokeWidth(perWidth);maskPaint.setStrokeWidth(perWidth);baseline = (int) ((-metrics.ascent + metrics.descent) / 2);dataHeight = (int) (-dataMetrics.ascent + dataMetrics.descent);lineEndY=maskHeight;if(lists!=null){for(int i=0;i<lists.size();i++){lists.get(i).setHeight(maskHeight-(lists.get(i).getActualHeight()*(maskHeight-dataHeight-dataHeight))/lists.get(i).getTotalHeight());}}}@Overrideprotected void onDraw(Canvas canvas) {canvas.drawColor(Color.parseColor("#efefef"));if (lineSpace > 0)// 需要画线,初始为0{startX = getPaddingLeft();endX = width - getPaddingRight();startY=0;endY=0;for (int i = 0; i < num; i++) {canvas.drawLine(startX, startY, endX, endY, linePaint);startY += lineSpace;endY += lineSpace;}}////////////////////////////////////////////////////lineStartX = lineEndX = getPaddingLeft() + startPadding + perWidth / 2;lineStartY = height;maskStartX = maskEndX = lineStartX;maskStartY = height;maskEndY = maskHeight;if(lists.get(0).isFlag()){barPaint.setColor(Color.parseColor("#089ae9"));}else{ barPaint.setColor(Color.parseColor("#6bc1f2"));}canvas.drawLine(lineStartX, lineStartY, lineEndX,lineEndY >= lists.get(0).getHeight() ? lineEndY : lists.get(0).getHeight(), barPaint);maskPaint.setColor(Color.parseColor("#089ae9"));canvas.drawLine(maskStartX, maskStartY, maskEndX, maskEndY, maskPaint);canvas.drawText(lists.get(0).getDescription(), lineStartX, lineStartY - baseline, textPaint);dataPaint.setColor(Color.parseColor("#6bc1f2"));canvas.drawText(lists.get(0).getData(), lineStartX, (lineEndY >= lists.get(0).getHeight() ? lineEndY : lists.get(0).getHeight()) - dataHeight, dataPaint);lists.get(0).setLeftX(lineStartX-perWidth/2);lists.get(0).setRightX(lineStartX+perWidth/2); ///////////////////////////////////lineStartX = lineEndX = getPaddingLeft() + startPadding + perWidth / 2+ space + perWidth;lineStartY = height;maskStartX = maskEndX = lineStartX;if(lists.get(1).isFlag()){barPaint.setColor(Color.parseColor("#63ae4e"));}else{ barPaint.setColor(Color.parseColor("#97d573"));}canvas.drawLine(lineStartX, lineStartY, lineEndX,lineEndY >= lists.get(1).getHeight() ? lineEndY : lists.get(1).getHeight(), barPaint);maskPaint.setColor(Color.parseColor("#63ae4e"));canvas.drawLine(maskStartX, maskStartY, maskEndX, maskEndY, maskPaint);canvas.drawText(lists.get(1).getDescription(), lineStartX, lineStartY - baseline, textPaint);dataPaint.setColor(Color.parseColor("#97d573"));canvas.drawText(lists.get(1).getData(), lineStartX, (lineEndY >= lists.get(1).getHeight() ? lineEndY : lists.get(1).getHeight()) - dataHeight, dataPaint);lists.get(1).setLeftX(lineStartX-perWidth/2);lists.get(1).setRightX(lineStartX+perWidth/2); ///////////////////////////////////lineStartX = lineEndX = getPaddingLeft() + startPadding + perWidth / 2+ space + perWidth + space + perWidth;lineStartY = height;maskStartX = maskEndX = lineStartX;if(lists.get(2).isFlag()){barPaint.setColor(Color.parseColor("#e99b39"));}else{ barPaint.setColor(Color.parseColor("#fec57b"));}canvas.drawLine(lineStartX, lineStartY, lineEndX,lineEndY >= lists.get(2).getHeight() ? lineEndY : lists.get(2).getHeight(), barPaint);maskPaint.setColor(Color.parseColor("#e99b39"));canvas.drawLine(maskStartX, maskStartY, maskEndX, maskEndY, maskPaint);canvas.drawText(lists.get(2).getDescription(), lineStartX, lineStartY - baseline, textPaint);dataPaint.setColor(Color.parseColor("#fec57b"));canvas.drawText(lists.get(2).getData(), lineStartX, (lineEndY >= lists.get(2).getHeight() ? lineEndY : lists.get(2).getHeight()) - dataHeight, dataPaint);lists.get(2).setLeftX(lineStartX-perWidth/2);lists.get(2).setRightX(lineStartX+perWidth/2); ///////////////////////////////////lineStartX = lineEndX = getPaddingLeft() + startPadding + perWidth / 2+ space + perWidth + space + perWidth + space + perWidth;lineStartY = height;maskStartX = maskEndX = lineStartX;if(lists.get(3).isFlag()){barPaint.setColor(Color.parseColor("#e65353"));}else{ barPaint.setColor(Color.parseColor("#ff8989"));}canvas.drawLine(lineStartX, lineStartY, lineEndX,lineEndY >= lists.get(3).getHeight() ? lineEndY : lists.get(3).getHeight(), barPaint);maskPaint.setColor(Color.parseColor("#e65353"));canvas.drawLine(maskStartX, maskStartY, maskEndX, maskEndY, maskPaint);canvas.drawText(lists.get(3).getDescription(), lineStartX, lineStartY - baseline, textPaint);dataPaint.setColor(Color.parseColor("#ff8989"));canvas.drawText(lists.get(3).getData(), lineStartX, (lineEndY >= lists.get(3).getHeight() ? lineEndY : lists.get(3).getHeight()) - dataHeight, dataPaint);lists.get(3).setLeftX(lineStartX-perWidth/2);lists.get(3).setRightX(lineStartX+perWidth/2);super.onDraw(canvas);}@Overridepublic void run() {while (true) {try {Thread.currentThread().sleep(10);lineEndY-=2;postInvalidate();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}/** * 传递数据,根据数据绘制柱状图 * @param lists */ public void setData(List<BarBean> lists) { if(lists.size()!=4) { throw new IllegalArgumentException("集合大小应该为4"); } this.lists=lists; init(); invalidate(); } @Overridepublic boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:int x=(int) event.getX();int y=(int) event.getY();if(lists!=null){for(int i=0;i<lists.size();i++){if(lists.get(i).getLeftX()<x&&x<lists.get(i).getRightX()&&y>lists.get(i).getHeight()&&y<maskHeight){lists.get(i).setFlag(!lists.get(i).isFlag());for(int j=0;j<lists.size();j++){if(j!=i){lists.get(j).setFlag(false);}}if(listener!=null){listener.onclick(i);}invalidate();break;}}}break;default:break;}return super.onTouchEvent(event);}public void setOnClickListener(OnClickListener listener){this.listener=listener;}public interface OnClickListener{void onclick(int i);}}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" > <com.example.wavedemo.BarPic5 android:id="@+id/barpic" android:paddingLeft="10dp" android:paddingRight="10dp" android:layout_width="match_parent" android:layout_height="270dp" /></RelativeLayout>
package com.example.wavedemo;import java.io.Serializable;public class BarBean implements Serializable {/** * */private static final long serialVersionUID = 1L;private String description;// 描述字体private String data;// 柱状图上面的数据private int totalHeight;// 控件height所对应的dataprivate int actualHeight;// 柱状图height所对应的dataprivate int height;//柱状图实际heightprivate boolean flag;//记录是不是点击状态private int leftX,rightX,topY;//记录左右上边距public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}public String getData() {return data;}public void setData(String data) {this.data = data;}public int getTotalHeight() {return totalHeight;}public void setTotalHeight(int totalHeight) {this.totalHeight = totalHeight;}public int getActualHeight() {return actualHeight;}public void setActualHeight(int actualHeight) {this.actualHeight = actualHeight;}public int getHeight() {return height;}public void setHeight(int height) {this.height = height;}public boolean isFlag() {return flag;}public void setFlag(boolean flag) {this.flag = flag;}public int getLeftX() {return leftX;}public void setLeftX(int leftX) {this.leftX = leftX;}public int getRightX() {return rightX;}public void setRightX(int rightX) {this.rightX = rightX;}public int getTopY() {return topY;}public void setTopY(int topY) {this.topY = topY;}@Overridepublic String toString() {return "BarBean [description=" + description + ", data=" + data+ ", totalHeight=" + totalHeight + ", actualHeight="+ actualHeight + ", height=" + height + ", flag=" + flag+ ", leftX=" + leftX + ", rightX=" + rightX + ", topY=" + topY+ "]";}public BarBean(String description, String data, int totalHeight,int actualHeight) {super();this.description = description;this.data = data;this.totalHeight = totalHeight;this.actualHeight = actualHeight;}}
如果需要自定义属性的话:
TypedArray types = context.obtainStyledAttributes(attrs, R.styleable.barPic); final int count = types.getIndexCount(); Log.e("abc", count+""); for (int i = 0; i < count; ++i) { int attr = types.getIndex(i); switch (attr) { case R.styleable.barPic_space: space = (int) types.getDimension(attr, 10); break; case R.styleable.barPic_num: num = types.getInteger(attr, 7); break; case R.styleable.barPic_startpadding: startPadding = (int) types.getDimension(attr, 20); break; case R.styleable.barPic_endpadding: endPadding = (int) types.getDimension(attr, 20); break; } } types.recycle(); init();
attrs.xml文件
<resources> <declare-styleable name="barPic"> <attr name="space" format="dimension" /> <attr name="num" format="integer" /> <attr name="startpadding" format="dimension" /> <attr name="endpadding" format="dimension" /> </declare-styleable></resources>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:haha="http://schemas.android.com/apk/res/com.example.wavedemo" android:layout_width="match_parent" android:layout_height="wrap_content" > <com.example.wavedemo.BarPic android:id="@+id/barpic" android:paddingLeft="10dp" android:paddingRight="10dp" android:layout_width="match_parent" android:layout_height="270dp" haha:num="3" haha:space="5dp" haha:startpadding="5dp" haha:endpadding="5dp" /></RelativeLayout>
0 0
- 柱状图
- 柱状图
- 柱状图
- 柱状图
- 柱状图
- 柱状图
- 柱状图
- 柱状图
- 柱状图
- 柱状图
- VML-柱状图
- JFreeChart -- 柱状图
- DotNetCharting >> 柱状图
- php 柱状图
- 饼图、柱状图
- JS柱状图
- jsp 柱状图
- IOS 柱状图
- 星级评定 swift
- 数据库范式真的很难吗?
- 《汇编语言(王爽)》第二章——寄存器(CPU工作原理)【总结】
- Java --- Executor
- C++ How to program 9E<10.9 hugeInt Class 函数运算符重载>
- 柱状图
- AD14的一些总结
- shareSDK 简单用法记录
- 资讯:主流视频codec(全)
- 守护进程简单实现
- iOS开发--OC篇--OC语言简介
- Java --- Guava Cache
- Android项目中的mipmap文件夹是什么?怎么用?和drawable文件夹有什么区别?
- LeetCode----Word Search