前段时间公司项目中用到了统计图,网上找了些资料和框架都不能满足我的需求,没办法,只有自己写了。
近来清闲,将其抽出一个demo了,欢迎大家交流指正。
效果图先行
实现方案有两个,一是自定义控件,二是使用属性动画。属性动画在api11以上版本才有,在11版本以下使用可以引入nineoldandroids框架。
由于属性动画比较简单,这里主要说下自定义控件
自定义控件源码如下:
/**
* 工程名: histogram
* 文件名: HistogramView.java
* 包名: com.style.histogram
* 日期: 2014-4-21下午8:23:38
* Copyright (c) 2014
*
*/
package com.style.histogram;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.RelativeLayout.LayoutParams;
/**
* 类名: HistogramView <br/>
* 功能: 柱状图. <br/>
* 日期: 2014-4-21 下午8:23:38 <br/>
*
* @author msl
* @version
*/
public class HistogramView extends View implements Runnable{
private static final String TAG = HistogramView.class.getSimpleName();
private int comWidth; //控件宽度
private int comHeight;//控件高度
private View rateView;//进度条
private View rateTopView; //进度条顶部View
private String rateBackgroundColor;//进图条背景颜色
private int rateBackgroundId; //进图条背景图片id
private Bitmap rataBackgroundBitmap;
private boolean isHasRateTopView; //进度条顶部View
private int rateHeight; //进度条的高
private int rateWidth; //进度条的宽
private int rateAnimValue;//进度条动画高度
private int orientation; //设置柱状图方向
private double progress;//设置进度 1为最大值
private boolean isAnim = true; //是否动画显示统计条
private Handler handler = new Handler();//动画handler
private int animRate = 1; //动画速度 以每1毫秒计
private int animTime = 1;//动画延迟执行时间
private Canvas canvas;//画布
public HistogramView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public HistogramView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public HistogramView(Context context) {
super(context);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
//初始化控件和进度的条相关参数
comWidth = w;
comHeight = h;
if(orientation==Li