国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

android自定義進(jìn)度條漸變色View的實(shí)例代碼

2020-04-11 11:57:55
字體:
供稿:網(wǎng)友

最近在公司,項目不是很忙了,偶爾看見一個兄臺在CSDN求助,幫忙要一個自定義的漸變色進(jìn)度條,我當(dāng)時看了一下進(jìn)度條,感覺挺漂亮的,就嘗試的去自定義view實(shí)現(xiàn)了一個,廢話不說,先上圖吧!

 

這個自定義的view,完全脫離了android自帶的ProgressView,并且沒使用一張圖片,這樣就能更好的降低程序代碼上的耦合性!

下面我貼出代碼  ,大概講解一下實(shí)現(xiàn)思路吧!

復(fù)制代碼 代碼如下:

package com.spring.progressview;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Shader;
import android.util.AttributeSet;
import android.view.View;

/***
 * 自定義進(jìn)度條
 * @author spring sky
 * Email:vipa1888@163.com
 * 創(chuàng)建時間:2014-1-6下午3:28:51
 */
public class SpringProgressView extends View {

 /**分段顏色*/
 private static final int[] SECTION_COLORS = {Color.GREEN,Color.YELLOW,Color.RED};
 /**進(jìn)度條最大值*/
 private float maxCount;
 /**進(jìn)度條當(dāng)前值*/
 private float currentCount;
 /**畫筆*/
 private Paint mPaint;
 private int mWidth,mHeight;

 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) {
 }

 @Override
 protected void onDraw(Canvas canvas) {
  super.onDraw(canvas);
  mPaint = new Paint();
  mPaint.setAntiAlias(true);
  int round = mHeight/2;
  System.out.println("max="+maxCount + "  current="+currentCount);
  mPaint.setColor(Color.rgb(71, 76, 80));
  RectF rectBg = new RectF(0, 0, mWidth, mHeight);
  canvas.drawRoundRect(rectBg, round, round, mPaint);
  mPaint.setColor(Color.BLACK);
  RectF rectBlackBg = new RectF(2, 2, mWidth-2, mHeight-2);
  canvas.drawRoundRect(rectBlackBg, round, round, mPaint);

  float section = currentCount/maxCount;
  RectF rectProgressBg = new RectF(3, 3, (mWidth-3)*section, mHeight-3);
  if(section <= 1.0f/3.0f){
   if(section != 0.0f){
    mPaint.setColor(SECTION_COLORS[0]);
   }else{
    mPaint.setColor(Color.TRANSPARENT);
   }
  }else{
   int count = (section <= 1.0f/3.0f*2 ) ? 2 : 3;
   int[] colors = new int[count];
   System.arraycopy(SECTION_COLORS, 0, colors, 0, count);
   float[] positions = new float[count];
   if(count == 2){
    positions[0] = 0.0f;
    positions[1] = 1.0f-positions[0];
   }else{
    positions[0] = 0.0f;
    positions[1] = (maxCount/3)/currentCount;
    positions[2] = 1.0f-positions[0]*2;
   }
   positions[positions.length-1] = 1.0f;
   LinearGradient shader = new LinearGradient(3, 3, (mWidth-3)*section, mHeight-3, colors,null, Shader.TileMode.MIRROR);
   mPaint.setShader(shader);
  }
  canvas.drawRoundRect(rectProgressBg, round, round, mPaint);
 }

 private int dipToPx(int dip) {
  float scale = getContext().getResources().getDisplayMetrics().density;
  return (int) (dip * scale + 0.5f * (dip >= 0 ? 1 : -1));
 }

 /***
  * 設(shè)置最大的進(jìn)度值
  * @param maxCount
  */
 public void setMaxCount(float maxCount) {
  this.maxCount = maxCount;
 }

 /***
  * 設(shè)置當(dāng)前的進(jìn)度值
  * @param currentCount
  */
 public void setCurrentCount(float currentCount) {
  this.currentCount = currentCount > maxCount ? maxCount : currentCount;
  invalidate();
 }

 public float getMaxCount() {
  return maxCount;
 }

 public float getCurrentCount() {
  return currentCount;
 }

 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
  int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);
  int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
  int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec);
  if (widthSpecMode == MeasureSpec.EXACTLY || widthSpecMode == MeasureSpec.AT_MOST) {
   mWidth = widthSpecSize;
  } else {
   mWidth = 0;
  }
  if (heightSpecMode == MeasureSpec.AT_MOST || heightSpecMode == MeasureSpec.UNSPECIFIED) {
   mHeight = dipToPx(15);
  } else {
   mHeight = heightSpecSize;
  }
  setMeasuredDimension(mWidth, mHeight);
 }
 


}


以上代碼就是該控件的全部核心代碼了
具體思路:
1.進(jìn)度條,其實(shí)就是一個最大值和最小值的比例值,這個比例就是 當(dāng)前值/最大值;
2.自定義的圓角問題,只要還是用到了Canvar的畫板的drawRoundRect ;
3.漸變色:LinearGradient對象渲染,具體渲染的比例要自己計算,目前我的程序提供3中顏色渲染,具體規(guī)則是:
(1)當(dāng)進(jìn)度條占最大值的三分之一以下,則提供一種顏色
   (2)當(dāng)最大值超過三分之一話,就區(qū)分是否超過三分之二,如果超過則用三種,否則用兩種顏色,因為三種顏色各占總進(jìn)度條的三分之一,這是一個初中數(shù)據(jù)的問題,自己慢慢畫圖吧!
4.怎么把進(jìn)度條放在一個有圓角背景的上面,這個就是繪制兩個圓角長方形:第一個作為背景,第二個作為進(jìn)度條的實(shí)體,具體第二個進(jìn)度的實(shí)體占多長,就是當(dāng)前 currentCount/maxCount*自定義View的長度   ;


其他的,沒啥技術(shù)難點(diǎn)了,做這種自定義控件,最重要的是,自定要根據(jù)人家的效果圖,看懂實(shí)現(xiàn)思路,具體代碼簡歷在思路上的,否則只會紙上談兵!如果看不懂,就要多畫圖,具體的一步步計算,天長地久,也就能“練”出來了!

下面提供一個demo下載地址:http://xiazai.VeVB.COm/201401/yuanma/SpringProgressDemo(VeVB.COm).zip

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 确山县| 台山市| 绥棱县| 玛沁县| 车险| 新河县| 托克托县| 阿城市| 勐海县| 朔州市| 射阳县| 高邮市| 荥阳市| 蒙城县| 阿拉善右旗| 四平市| 抚宁县| 麟游县| 巨鹿县| 小金县| 凤阳县| 宕昌县| 济南市| 桃园县| 常熟市| 昌图县| 津市市| 勃利县| 文成县| 拜泉县| 三河市| 玉林市| 清新县| 城口县| 大厂| 泸水县| 济南市| 延安市| 固原市| 曲周县| 兴义市|