自定义画柱图统计

package com.cnmobile.beibei.utils;

import android.R;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.TextView;

public class ConfigurationView extends View {

	private Paint paint;
	private Paint font_Paint;
	// 数值显示的偏移量
	private int numWidth = 9;

	// 起始高度为 最大高度减去 80 【注意这里的高度是反的,也就是说,y轴是逐渐减少的】
	private float startHeight = 350;
	private float endHeight = startHeight;
	// 柱状图的宽度
	private int viewWidth = 50;

	// 组态图的高度 【显示的数值,100 为 100%】
	private int maxSize = 100;
	private int indexSize = 0;
	// 要显示的模式 【类型,比如:℃和百分比等】
	private String displayMode = "%";
	// 模式
	private boolean mode = false;
	// 线程控制
	private boolean display = true;
	// 是否开启动画效果
	private boolean animMode = true;

	/**
	 * 
	 * @param context
	 * @param maxSize
	 *            需要显示的数值
	 * @param displayMode
	 *            显示的类型
	 */
	public ConfigurationView(Context context, int maxSize, String displayMode) {
		super(context);
		this.maxSize = maxSize;
		this.displayMode = displayMode;
		init();
	}

	/**
	 * 
	 * @param context
	 * @param maxSize
	 *            需要显示的数值
	 * @param displayMode
	 *            显示的类型
	 * @param mode
	 *            显示的模式,默认为false,数值越高,颜色越偏向红色。为true反之
	 */
	public ConfigurationView(Context context, int maxSize, String displayMode,
			boolean mode) {
		super(context);
		this.maxSize = maxSize;
		this.displayMode = displayMode;
		this.mode = mode;
		init();
	}

	/**
	 * 
	 * @param context
	 * @param maxSize
	 *            需要显示的数值
	 * @param displayMode
	 *            显示的类型
	 * @param mode
	 *            显示的模式,默认为false,数值越高,颜色越偏向红色。为true反之
	 * @param animMode
	 *            是否显示动画加载效果,默认为true
	 */
	public ConfigurationView(Context context, int maxSize, String displayMode,
			boolean mode, boolean animMode) {
		super(context);
		this.maxSize = maxSize;
		this.displayMode = displayMode;
		this.mode = mode;
		this.animMode = animMode;
		init();
	}

	// 绘制界面
	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		canvas.drawRect(10, endHeight, 10 + viewWidth, startHeight, paint);
		if (!display) {
			if (!mode && indexSize >= 50) {
				paint.setARGB(255, 34, 147, 203);
//				if (!mode && indexSize >= 80) {
//					paint.setARGB(255,
//							(indexSize < 100) ? (110 + indexSize + 45) : 255,
//							(indexSize < 100) ? 210 - (indexSize + 45) : 0, 20);
//				}
			} else if (mode && indexSize <= 50) {
				paint.setARGB(255, 100, 108, 114);
//				if (mode && indexSize <= 30) {
//					paint.setARGB(255, 255 - indexSize, indexSize, 20);
//				}
			}
			canvas.drawRect(10, endHeight, 10 + viewWidth, startHeight, paint);
//			paint.setARGB(0, 255, 255, 255);
//			canvas.drawText("" + indexSize, numWidth, endHeight - 5, paint);
//			paint.setARGB(255, 100, 108, 114);
		}
		canvas.drawText(displayMode, 0, startHeight +30, font_Paint);
	}

	// 初始化
	private void init() {
		// 数值初始化
		paint = new Paint();
		paint.setARGB(255, 100, 108, 114);
		font_Paint = new Paint();
		font_Paint.setARGB(255, 255, 255, 255);
		font_Paint.setTextSize(21);
		font_Paint.setTypeface(Typeface.DEFAULT_BOLD);

		// 设置数值显示的偏移量,数值越小,偏移量越大
		numWidth = 9;
		if (maxSize < 10) {
			numWidth = 15;
		} else if (maxSize < 100) {
			numWidth = 12;
		}

		if (animMode) {
			// 启动一个线程来实现柱状图缓慢增高
			thread.start();
		} else {
			display = false;
			indexSize = maxSize;
			endHeight = startHeight - (float) (maxSize * 1.5);
			invalidate();
		}
	}

	private Handler handler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			if (msg.what == 1 && indexSize < maxSize && endHeight >= 20) {
				endHeight -= 1.5;
				indexSize += 1;
			} else {
				display = false;
			}
			invalidate();
		}
	};

	private Thread thread = new Thread() {
		@Override
		public void run() {
			while (!Thread.currentThread().isInterrupted() && display) {
				Message msg = new Message();
				msg.what = 1;
				handler.sendMessage(msg);
				try {
					Thread.sleep(15);
				} catch (InterruptedException e) {
					System.err.println("InterruptedException!线程关闭");
					this.interrupt();
				}
			}
		}
	};

	// 刷新View
	public void toInvalidate() {
		this.invalidate();
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值