zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    一个例子说明如何在DataSnap中使用FireDAC
    DataSnap Demo:TFDConnection、最大连接数、客户端回叫功能、多线程模拟、压力测试等
    DataSnap Demo:TFDConnection、最大连接数、客户端回叫功能、多线程模拟、压力测试等
    Delphi2010中DataSnap技术网摘
    Delphi2010中DataSnap技术网摘
    推荐大家使用的CSS书写规范、顺序
    Windows autoKeras的下载与安装连接
    vscode Python 运行环境配置
    react框架
    关于k Line Chart (k线图)
  • 原文地址:https://www.cnblogs.com/llguanli/p/8602477.html
Copyright © 2011-2022 走看看