亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android自定義View之酷炫數字圓環

2020-04-11 11:01:48
字體:
來源:轉載
供稿:網友

先看下最終的效果

一、開始實現
新建一個DoughnutView繼承View

  public class DoughnutView extends View {  }

先重寫onMeasure方法。  

 /**   * 當布局為wrap_content時設置默認長寬   *   * @param widthMeasureSpec   * @param heightMeasureSpec   */  @Override  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {    setMeasuredDimension(measure(widthMeasureSpec), measure(heightMeasureSpec));  }  private int measure(int origin) {    int result = DEFAULT_MIN_WIDTH;    int specMode = MeasureSpec.getMode(origin);    int specSize = MeasureSpec.getSize(origin);    if (specMode == MeasureSpec.EXACTLY) {      result = specSize;    } else {      if (specMode == MeasureSpec.AT_MOST) {        result = Math.min(result, specSize);      }    }    return result;  }

下面就是最重要的重寫onDraw方法,大致流程如下
1、畫白色圓環(背景),記得改下Activity背景色不然白色圓環看不出來。

 //畫背景白色圓環 initPaint(); float doughnutWidth = Math.min(width, height) / 2 * 0.15f; paint.setStrokeWidth(doughnutWidth); paint.setStyle(Paint.Style.STROKE); paint.setColor(Color.WHITE); paint.setAntiAlias(true); RectF rectF = new RectF((width > height ? Math.abs(width - height) / 2 : 0) + doughnutWidth / 2, (height > width ? Math.abs(height - width) / 2 : 0) + doughnutWidth / 2, width - (width > height ? Math.abs(width - height) / 2 : 0) - doughnutWidth / 2, height - (height > width ? Math.abs(height - width) / 2 : 0) - doughnutWidth / 2); canvas.drawArc(rectF, 0, 360, false, paint);

2、畫彩色圓環

使用SweepGradient來實現圓環漸變的效果,這里有個判斷當設置的顏色數組只有一個顏色的時候,直接'setColor',有多個顏色才使用SweepGradient實現漸變色。這樣就能既支持漸變色又支持單色。

這里還有一點要注意,SweepGradient默認是從3點鐘位置開始漸變的,為了能讓它從12點鐘位置開始漸變所以將畫布旋轉了-90°。

 //畫彩色圓環 initPaint(); canvas.rotate(-90, width / 2, height / 2); paint.setStrokeWidth(doughnutWidth); paint.setStyle(Paint.Style.STROKE); if (doughnutColors.length > 1) {   paint.setShader(new SweepGradient(width / 2, height / 2, doughnutColors, null)); } else {   paint.setColor(doughnutColors[0]); } canvas.drawArc(rectF, 0, currentValue, false, paint);

3、畫中間數值的白色背景(只是為了讓數值顯示更明顯一些)

 //畫中間數值的背景 int fontSize = 50; initPaint(); paint.setStyle(Paint.Style.FILL); paint.setColor(Color.WHITE); canvas.drawCircle(width / 2, height / 2, fontSize * 2, paint);}

4、畫中間數值

 //畫中間數值 canvas.rotate(90, width / 2, height / 2); initPaint(); paint.setColor(ColorUtils.getCurrentColor(currentValue / 360f, doughnutColors)); paint.setTextSize(fontSize); paint.setTextAlign(Paint.Align.CENTER); float baseLine = height / 2 - (paint.getFontMetrics().descent + paint.getFontMetrics().ascent) / 2; canvas.drawText((int) (currentValue / 360f * 100) + "%", width / 2, baseLine, paint);

這里有兩點比較坑:

1、數值的顏色

要實現的效果是讓數值的顏色是跟彩色圓環終點的顏色是一樣的。尋尋覓覓很久也沒有找到獲取SweepGradient渲染到某一個角度時顏色的方法=_=

最終花了差不多半天時間寫了個顏色漸變算法,代碼如下:

 /** * 顏色漸變算法 * 獲取某個百分比下的漸變顏色值 * * @param percent * @param colors * @return */ public static int getCurrentColor(float percent, int[] colors) {   float[][] f = new float[colors.length][3];   for (int i = 0; i < colors.length; i++) {     f[i][0] = (colors[i] & 0xff0000) >> 16;     f[i][1] = (colors[i] & 0x00ff00) >> 8;     f[i][2] = (colors[i] & 0x0000ff);   }   float[] result = new float[3];   for (int i = 0; i < 3; i++) {     for (int j = 0; j < f.length; j++) {       if (f.length == 1 || percent == j / (f.length - 1f)) {         result = f[j];       } else {         if (percent > j / (f.length - 1f) && percent < (j + 1f) / (f.length - 1)) {           result[i] = f[j][i] - (f[j][i] - f[j + 1][i]) * (percent - j / (f.length - 1f)) * (f.length - 1f);         }       }     }   }   return Color.rgb((int) result[0], (int) result[1], (int) result[2]); }

2、數值居中對齊問題

drawText是根據baseLine來定位的。具體可以看下下面兩篇文章的分析:文章一、文章二。數字跟文字字母的居中方式可能還略有不同。

二、動畫效果的實現
先上代碼:

public void setValue(float value) {ValueAnimator valueAnimator = ValueAnimator.ofFloat(currentValue, value);valueAnimator.setDuration(300);valueAnimator.setInterpolator(new Interpolator() {  @Override  public float getInterpolation(float v) {    return 1-(1-v)*(1-v)*(1-v);  }});valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {  @Override  public void onAnimationUpdate(ValueAnimator valueAnimator) {    currentValue = (float) valueAnimator.getAnimatedValue();    invalidate();  }});valueAnimator.start();}

使用ValueAnimator來實現動畫效果。還可以設置不同的插值器來實現不同的動畫效果:

 valueAnimator.setInterpolator(new AccelerateInterpolator());//加速  valueAnimator.setInterpolator(new DecelerateInterpolator());//減速  valueAnimator.setInterpolator(new AccelerateDecelerateInterpolator());//加速減速  valueAnimator.setInterpolator(new LinearInterpolator());//云速

常用插值器介紹可以看這篇文章。

當然也可以自己實現一個簡單的插值器:

valueAnimator.setInterpolator(new Interpolator() {  @Override  public float getInterpolation(float v) {    return 1-(1-v)*(1-v)*(1-v);  }});

以上就是本文的全部內容,希望對大家的學習有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品视频自在线| 福利二区91精品bt7086| 九九九热精品免费视频观看网站| 日韩在线播放视频| 久久香蕉国产线看观看网| 精品视频久久久久久久| 91九色国产在线| 伦伦影院午夜日韩欧美限制| 九九久久久久久久久激情| 国产亚洲精品91在线| 亚洲精品久久久久久久久久久| 狠狠躁夜夜躁久久躁别揉| 国产精品免费久久久久久| 久久精品美女视频网站| 亚洲男人天堂2024| 色综合久久悠悠| 久久久久久高潮国产精品视| 精品女同一区二区三区在线播放| 88xx成人精品| 国产精品久久久久av免费| 日韩激情在线视频| 国产美女精彩久久| 亚洲国产精品99| 亚洲黄色av网站| 久久久久久久久久久国产| 国产精品第100页| 国产精品第一页在线| 高清日韩电视剧大全免费播放在线观看| 成人黄色在线播放| 亚洲欧美中文日韩v在线观看| 亚洲国产另类久久精品| www.日韩系列| 久久久久久尹人网香蕉| 日韩美女中文字幕| 亚洲tv在线观看| 亚洲xxxxx性| 91精品国产高清久久久久久| 国产精品69精品一区二区三区| 亚洲一区二区自拍| 国产在线999| 欧美性猛交丰臀xxxxx网站| 91热福利电影| 久久99精品久久久久久青青91| 国产日韩欧美在线视频观看| 97视频免费观看| 亚洲国产成人精品久久久国产成人一区| 成人妇女淫片aaaa视频| 国产成人精品综合| 亚洲精品黄网在线观看| 亚洲欧美另类人妖| 国产精品自拍视频| 欧美一级片在线播放| 中文字幕亚洲综合| 深夜精品寂寞黄网站在线观看| 亚洲激情第一页| 国产精品免费久久久| 亚洲第一精品福利| 欧美成人中文字幕| 亚洲国内高清视频| 国产自产女人91一区在线观看| 久久久久亚洲精品| 精品视频在线观看日韩| 欧美大片第1页| 欧美成人免费在线视频| 欧美电影免费观看大全| 亚洲国产精久久久久久| 欧美激情精品久久久久久免费印度| 欧美极品少妇xxxxx| 精品动漫一区二区| 色午夜这里只有精品| 精品久久久精品| 中文字幕精品www乱入免费视频| 中文字幕亚洲天堂| 精品久久久久久久中文字幕| 久久99热精品| 亚洲视频视频在线| 国产精品久久久久久久9999| 最新91在线视频| 欧美疯狂性受xxxxx另类| 亚洲3p在线观看| 欧美最顶级丰满的aⅴ艳星| 欧美日韩国产专区| 亚洲视频网站在线观看| 欧美成人午夜视频| 久久精品视频亚洲| 91日本在线视频| 久久久精品国产亚洲| 国产黑人绿帽在线第一区| 亚洲精品中文字幕有码专区| 亚洲精品美女在线观看| 久久久精品视频成人| 日韩av免费在线看| 国产精品精品视频一区二区三区| 亚洲最大的免费| 日韩女优人人人人射在线视频| 国产91精品久久久久久| 亚洲激情 国产| 国产日韩在线免费| 一区二区三区视频在线| 92国产精品久久久久首页| 欧美日韩精品在线观看| 免费91麻豆精品国产自产在线观看| 裸体女人亚洲精品一区| 色婷婷综合成人| www.久久色.com| 国产精品观看在线亚洲人成网| 国产精品久久久久久久一区探花| 亚洲人成亚洲人成在线观看| 97视频在线看| 北条麻妃在线一区二区| 国产精品国产自产拍高清av水多| 精品动漫一区二区三区| 色香阁99久久精品久久久| 精品国产网站地址| 国产欧美日韩高清| 欧美一区二粉嫩精品国产一线天| 国产成人涩涩涩视频在线观看| 在线亚洲欧美视频| 亚洲一区二区中文| 久久手机精品视频| 亚洲久久久久久久久久| 亚洲国产婷婷香蕉久久久久久| 国产一区二区黄| 久久av资源网站| 日韩欧美国产激情| 欧美精品在线网站| 国产欧美在线观看| 精品性高朝久久久久久久| 久久影院免费观看| 亚洲国产毛片完整版| 久青草国产97香蕉在线视频| 国产精品视频最多的网站| 亚洲激情 国产| 日韩av一区在线观看| 成人欧美在线视频| 亚洲天堂av综合网| 1769国产精品| 成人在线视频网| 九九热精品在线| 亚洲欧美日韩中文在线制服| 久久亚洲精品毛片| 精品久久久一区| 亚洲永久免费观看| 久久人人爽人人爽爽久久| 欧美成人一区在线| 日韩视频精品在线| 国产精品h片在线播放| 91精品国产一区| 亚洲一区二区三区成人在线视频精品| 麻豆精品精华液| 国产91亚洲精品| 欧美性色19p| 欧美性极品少妇精品网站| 亚洲女人天堂成人av在线| 久久久久久久久国产精品| 992tv成人免费影院| 国产一区二区av| 精品久久久久久久久久ntr影视| 久久久女女女女999久久| 欧美黄色片在线观看| 国产欧美日韩免费| 91在线高清视频| **欧美日韩vr在线| 国产在线精品播放|