Flutter自定義Color賦值方法

先上自定義方法:

/// 顏色創(chuàng)建方法
  /// - [colorString] 顏色值
  /// - [alpha] 透明度(默認(rèn)1,0-1)
  /// 
  /// 可以輸入多種格式的顏色代碼,如: 0x000000,0xff000000,#000000
  static Color ADColor(String colorString, {double alpha = 1.0}) {
    String colorStr = colorString;
    // colorString未帶0xff前綴并且長度為6
    if (!colorStr.startsWith('0xff') && colorStr.length == 6) {
      colorStr = '0xff' + colorStr;
    }
    // colorString為8位,如0x000000
    if(colorStr.startsWith('0x') && colorStr.length == 8) {
      colorStr = colorStr.replaceRange(0, 2, '0xff');
    }
    // colorString為7位,如#000000
    if(colorStr.startsWith('#') && colorStr.length == 7) {
      colorStr = colorStr.replaceRange(0, 1, '0xff');
    }
    // 先分別獲取色值的RGB通道
    Color color = Color(int.parse(colorStr));
    int red = color.red;
    int green = color.green;
    int blue = color.blue;
    // 通過fromRGBO返回帶透明度和RGB值的顏色
    return Color.fromRGBO(red, green, blue, alpha);
  }

使用:

Color myolor = 方法定義的類名.ADColor('0xfffa5956');

=========================================
以下是遇到的問題,感興趣的朋友可以繼續(xù)看看:

最近學(xué)習(xí)Flutter開發(fā),想根據(jù)后臺返回的16進(jìn)制顏色值來生成Color對象。
Flutter提供的方法:

Color(int value);

可以看到,值必須是int類型, 如果拿到的色值是String,可以通過以下方法String轉(zhuǎn)int:

Color(int.parse(colorStr));

這個方法可以滿足簡單的顏色需求,但是如果你要再加個透明度,就比較復(fù)雜了。
官方方法提供了兩個:

Color.fromARGB(int a, int r, int g, int b)
Color.fromRGBO(int r, int g, int b, double opacity)

居然要我們把一個簡單的色值去反推出他的RGB通道?
在往下看,有沒有單獨(dú)設(shè)置透明度的方法呢?
答案是有的,也有兩個:

withAlpha(int a)
withOpacity(double opacity)

測試了一下,比如這樣寫:

//  1、先隨便賦一個色值
Color color = Color(int.parse('0xfffa5956'));
// 2、設(shè)置他的透明度
color.withOpacity(0.1);

然而并沒有什么效果,顏色還是不透明的,查了一下了解到,0x后面跟著前2個ff一般代表透明度,而ff本身就代表不透明,參照表:
00%=FF(不透明)
5%=F2
10%=E5
15%=D8
20%=CC
25%=BF
30%=B2
35%=A5
40%=99
45%=8c
50%=7F
55%=72
60%=66
65%=59
70%=4c
75%=3F
80%=33
85%=21
90%=19
95%=0c
100%=00(全透明)

可能是Flutter根據(jù)你的色值,就設(shè)定了他的透明度,于是你再單獨(dú)設(shè)置透明度就沒有了效果。

那么我們要實(shí)現(xiàn)色值加透明度的控制的話,就必須要知道他的RGB通道了,然后再通過fromARGB或者fromRGBO方法去實(shí)現(xiàn)。
而Color對象里是有RGB通道的get方法的:

/// The red channel of this color in an 8 bit value.
  int get red => (0x00ff0000 & value) >> 16;

  /// The green channel of this color in an 8 bit value.
  int get green => (0x0000ff00 & value) >> 8;

  /// The blue channel of this color in an 8 bit value.
  int get blue => (0x000000ff & value) >> 0;

于是就有了上面自定義的方法。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容