android自己定义渐变进度条

项目中须要用到一个弧形渐变的进度条,通过android自带是不能实现的。我是没有找到实现的方法,有大神知道的能够指点。效果图是以下这种

这是通过继承VIew来绘制出来的,网上也有相似的,可是代码那是相当的累赘,并且创建了非常多没用的对象,给内存管理带来负担    
我在这把自己定义的View代码贴出来了,用到的话能够加以參考
public class SpringProgressView extends View {

	/**
	 * 分段颜色
	 */

	private static final int[] SECTION_COLORS = {Color.RED, Color.parseColor("#ffa000"), Color.YELLOW};

	/**
	 * 进度条最大值
	 */
	private float maxCount;
	/**
	 * 进度条当前值
	 */
	private float currentCount;
	/**
	 * 画笔
	 */
	private Paint mPaint;
	private int mWidth, mHeight;

	private RectF rectBg = new RectF();
	private RectF rectProgressBg = new RectF();
	private LinearGradient shader;

	public SpringProgressView(Context context, AttributeSet attrs, int defStyleAttr) {
		super(context, attrs, defStyleAttr);
		initView(context);
	}

	public SpringProgressView(Context context, AttributeSet attrs) {
		super(context, attrs);
		initView(context);
	}

	public SpringProgressView(Context context) {
		super(context);
		initView(context);
	}

	private void initView(Context context) {
		mPaint = new Paint();
	}

	@Override
	protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
		super.onLayout(changed, left, top, right, bottom);
		mHeight = bottom - top;
		mWidth = right - left;
		rectBg.set(0, 0,mWidth, mHeight);
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		float section = currentCount / maxCount;
		if (shader == null) {
			shader = new LinearGradient(0, 0, mWidth, mHeight, SECTION_COLORS, null, Shader.TileMode.CLAMP);
		}
		mPaint.setShader(shader);
		mPaint.setAntiAlias(true);
		mPaint.setStyle(Paint.Style.STROKE);

		//绘制进度条外側边框
		int round = mHeight*2/3;
		canvas.drawRoundRect(rectBg, round, round, mPaint);

		//绘制进度条
		mPaint.setStyle(Paint.Style.FILL);
		int pl=(int)(mWidth*(1-section));
		rectProgressBg.set(pl, 0, mWidth, mHeight);
		canvas.drawRoundRect(rectProgressBg, round, round, mPaint);
	}

	/*
     * 设置最大的进度值
     */
	public void setMaxCount(float maxCount) {
		this.maxCount = maxCount;
	}

	/**
	 * 设置当前的进度值
	 */
	public void setCurrentCount(float currentCount) {
		this.currentCount = currentCount > maxCount ?

maxCount : currentCount; invalidate(); } public float getMaxCount() { return maxCount; } public float getCurrentCount() { return currentCount; } }

                                                               






    以上就是自己定义的view部分,直接在布局文件里引用就能够了。在Activity中设置该进度条的最大值和和当前进度值,就能够完美实现了

    我也把代码地址粘下来,能够下载http://download.csdn.net/detail/u013122144/9495668

posted @ 2018-03-19 15:30  llguanli  阅读(345)  评论(0编辑  收藏  举报