1. android繪圖之RadialGradient 放射漸變(11)
LinearGradient 和 SweepGradient,這次講解RadialGradient;
RadialGradient被稱為放射漸變,就是從中心向外圓形漸變。
兩個構造函數,第一個構造函數可以實現兩種顏色的漸變,第二個構造函數可以實現多個顏色的漸變。
參數說明:
centerX ,centerY:shader的中心坐標,開始漸變的坐標。
radius:漸變的半徑,
centerColor,edgeColor:中心點漸變顏色,邊界的漸變顏色,
colors:漸變顏色數組,
stoops:漸變位置數組,類似掃描漸變的positions數組,取值[0,1],中心點為0,半徑到達位置為1.0f,
tileMode:shader未覆蓋以外的填充模式。
構造函數:
RadialGradient(float centerX, float centerY, float radius, @ColorInt int centerColor, @ColorInt int edgeColor, @NonNull TileMode tileMode);
提供中心坐標,半徑,顏色值,TileMode
Stops數組取值為[0-1],一般為從小到大,表示每個位置對應的顏色值,如果stops不為null,colors必須和stops一一對應,否則可能導致崩潰,如果stops為null,各顏色從中心到邊界線性漸變。
stops數組為null,四種顏色線性漸變:
stops數組不為null:
如果數組多餘顏色個數:
大致做個小例子,如果需要線上使用需要考慮很多問題,類似ondraw最好不要聲明對象等:
替換為多顏色 private int[] colors = {Color.YELLOW, Color.RED, Color.BLUE, Color.GREEN};
android繪圖之Paint(1)
android繪圖之Canvas基礎(2)
Android繪圖之Path(3)
Android繪圖之drawText繪制文本相關(4)
Android繪圖之Canvas概念理解(5)
Android繪圖之Canvas變換(6)
Android繪圖之Canvas狀態保存和恢復(7)
Android繪圖之PathEffect (8)
Android繪圖之LinearGradient線性漸變(9)
Android繪圖之SweepGradient(10)
Android繪圖之RadialGradient 放射漸變(11)
Android繪制之BitmapShader(12)
Android繪圖之ComposeShader,PorterDuff.mode及Xfermode(13)
Android繪圖之drawText,getTextBounds,measureText,FontMetrics,基線(14)
Android繪圖之貝塞爾曲線簡介(15)
Android繪圖之PathMeasure(16)
Android 動態修改漸變 GradientDrawable
2. android怎樣自定義color文件
Android開發中顏色的自定義方法
1、使用Color類的常量,如:
int color = Color.BLUE; // 創建一個藍色 是使用Android提供的顏色 int color = Color.RED; int color = Color.WHITE; 2、通過ARGB構建,如:
int color = Color.argb ( 127, 255, 0, 255 ); // 半透明的紫色
其中第一個參數表示透明,0表示完全透明,255(ff)表示完全不透明;後三位分別代表RGB的值了。 3、使用XML資源文件來定義顏色
該方法擴展性好,便於修改和共享,如在values目錄下創建一個color.xml: <?xml version=」 1.0」 encoding=」utf -8」> <resources>
<color name=」mycolor」> #7fff00ff</color> </resources>
定義了一個名為mycolor的顏色,在別的地方就可以通過引用mycolor來獲取該顏色值,如textView定義中:
android:textColor= "@drawable/mycolor"
java代碼中可以使用ResourceManager類中的getColor來獲取該顏色: int color = getResources().getColor(R.color.mycolor);
這與第二種方法得到的值是一樣的,getResources()方法返回當前活動Activity的ResourceManager類實例。
說明:XML定義方法接受6位和8位兩種表示法,而且開頭必須是#,8位定義時前兩位表示透明。 4、直接定義色值,如: int color = 0xff00ff00;
這種方法必須使用0x開頭,而不是用我們常用的#。與方法3不一樣,值也必須用8位表示 ,不接受6位的顏色表示。分組一下0x|ff|ff00ff,0x是代表顏色整數的標記,ff是表示透明度,ff00ff表示RGB顏色值。
=======================
補充一點Android布局中背景圖片的設置(編輯LinearLayout):
* 可以使用純色:android:background="@drawable/mycolor" (XML資源文件中定義的顏色)
* 也可使用圖片:android:background="@drawable/bg" (需要將一個名為bg.jpg或png的圖片拷貝到res/drawable-hdpi目錄下)
3. android第三方庫修改顏色
1、首先直接在布局文件中設置:android:backgound="#FFFFFFFF",android:textcolor="#00000000"。
2、其次把顏色提取出來形成資源,放在資源文件下面(values/drawable/color.xml):#FFFFFFFF
3、最後在布局文件中用android:backgound="@drawable/white"android:textcolor="@drawable/black"或者在java文件中通過setBackgroundColor(int color), setBackgroundResource(int resid),setTextColor(int color)即可。
4. android 判斷資源id是color還是drawable
findViewById是我們獲取layout中各種View 對象比如按鈕、標簽、ListView和ImageView的便利方法。顧名思義,它需要一個int參數:資源id。
資源id非常有用。Android回自動為每個位於res目錄下的資源分配id,包括各種圖片文件、xml文中的」@+id」對象。res的子目錄幾乎總是固定的,比如每次都能見到的:drawable-xxxx、layout、values,以及不常見的:anim、xml、row、color。
Android教科書上告訴你:
res/drawable/用來存放圖片文件;
res/layout/用來存放布局定義文件;
res/values/用來存放一些變數、參數等文件。
這都是我們已經知道的。此外,Android會為res目錄下的所有資源分配id,其主要的分配原則是:
drawable中的圖片文件總是每個文件一個資源id。
Xml文件中每個使用android:id=」@+id/xxx」的view都會被分配一個未用的資源id。
其他更復雜的規則也許每個人都會補充一些。
在 ADK 的API 中,有許多方法其實都會使用資源id作為參數,比如 getDrawable 方法 :
getResources().getDrawable(R.drawable.sendsms_bk));
從字面上看,getResouces方法返回一個android.content.res.Resources對象。
getDrawalbe方法返回一個Drawable對象,我們知道這就是一張圖片。
getDrawable方法使用的參數就是資源id。
但是,這些int型的資源id到底是些什麼數字?或者它們都放在哪裡。如果你夠細心,你可以在gen目錄的R.java文件中找到它們。每個16進制整型id都有一個很O-O 的屬性名字,它們都是public static final的,建議你不要手動去修改它們。這些資源id位於不同類層次結構中,你仔細看一看,會發現其中的一些規律,比如,drawable類中包含資源id其實代表了res/drawable目錄中的圖片文件;layout類中包含的資源id其實是代表了在res/layout目錄中的xml文件 ;id類中包含的資源id其實是代表了布局xml文件中使用了 android:id=」@+id/xxx」的widget對象——當然如果你使用的是」@+Tyre/xxx」,則Android編譯時會在R.java 中創建一個叫做 Tyre 的類。
通過上面的了解,我們發現資源id就是以「R.」開頭的變數或屬性——因為它都定義在R類中——這個類跟android.R不是同一個R,它們不在同一個包層次中。前者是定義了android框架自己的資源,比如:android.R.layout.simple_expandable_list_item_1、android.R.layout.simple_expandable_list_item_2。這些資源你使用過嗎?有時間不妨試試。而另一個R就是我們自己的R了,定義了我們自己的資源id。我們可以用面向對象的R.xxx.yyy的方式使用資源id,當然也可以直接用16進制數來使用它們。
資源id在Android中是如此重要,因此我們只要獲得了資源id,即可獲得資源。因為某些情況下,我們不能使用某個常量作為資源id(因為我們想用一個變數代替它),所以只能採用兩種方式動態獲取資源id:
1、反射
java的反射是如此強大,以至於我們在走投無路時總是想起它。我們來看一段代碼:
try{
Field field=R.drawable.class.getField(type);
int i= field.getInt(new R.drawable());
Log.d(tag,i+"");
return i;
}catch(Exception e){
Log.e(tag,e.toString());
return R.drawable.unknow;
}
type是一個變數,他的可能值會是「close」、「edit」、「icon」等。我們通過java的反射類Field 去訪問 R.drawable 類下面的某個欄位。實際上,我們知道在R.drawable 下的欄位就是 res.drawable-xxxx 目錄下的圖片文件的資源id。因此運行上面的這段代碼,其實就是通過一個字元串去獲取對應圖片文件的資源id。比如,當 type 的值為「icon」時,上面的代碼會獲得res.drawable-xxxx目錄下的 icon.png 圖片文件的資源id並返回給我們。我們通過資源 id 來把圖片顯示在ImageView中就是順理成章的事了。
2、使用Resources 類的 getIdentifier方法
使用反射畢竟還是麻煩。如果同樣的事情用 android.content.res.Resources 類來干,就是兩句話而已:
Resources res=getResources();
return res.getIdentifier(type,"drawable",getPackageName());
getResources方法是來自於contenxt(也就是Activity類),它直接可以返回一個Resouces對象。而Resouces的getIdentifier方法可以返回R.java中的任何資源id,當然,你必須指定3個參數:欄位名,類名,包名。包名指定了的 全限定名的包名部分,如果R 的全限定名為 android.R 或者 com.company.R,則包名在這里就是「android」或「com.company」。getPackageName其實是this.getPackageName(),它直接返回本類的包名。
類名則是資源所屬的類。比如我們知道的,在R.java 類中的幾個固定的類:drawable、id、string、layout等,在它們下邊又定義了許多資源id。
欄位名則是資源id的名字。比如這個資源id定義: public static final int del=0x7f020002;
del就是一個資源id的名字,0x7f020002則是它的16進制值。
通過3個參數,getIdentifier 方法就可以通過比較動態的方式獲得資源id。
5. android 顏色過渡
Android平台下實現漸變效果。在android.graphics中我們可以找到有關Gradient字樣的類,比如LinearGradient 線性漸變、RadialGradient徑向漸變和 角度漸變SweepGradient 三種,他們的基類為android.graphics.Shader。為了顯示出效果,使用一個簡單的例子來說明。
一、LinearGradient線性漸變
在android平台中提供了兩種重載方式來實例化該類分別為,他們的不同之處為參數中第一種方法可以用顏色數組,和位置來實現更細膩的過渡效果,比如顏色采樣int[] colors數組中存放20種顏色,則漸變將會逐一處理。而第二種方法參數僅為起初顏色color0和最終顏色color1。
LinearGradient(float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode tile)
LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1, Shader.TileMode tile)
使用實例如下:
Paint p=new Paint();
LinearGradient lg=new LinearGradient(0,0,100,100,Color.RED,Color.BLUE,Shader.TileMode.MIRROR); //
參數一為漸變起初點坐標x位置,參數二為y軸位置,參數三和四分辨對應漸變終點,最後參數為平鋪方式,這里設置為鏡像.
剛才Android開發網已經講到Gradient是基於Shader類,所以我們通過Paint的setShader方法來設置這個漸變,代碼
6. Android下通過Canvas類和Paint類畫一個表格的方法的問題
Paint和Canvas類:
Paint:畫筆,使用之前首先要調整好畫筆,然後就可以在畫布上繪圖了,這樣就可以顯示在手機屏幕上。
主要方法有:setColor()
設置畫筆的顏色
setTextSize()
設置字體大小
setStyle()
設置畫筆的風格,空心還是實心
setStrokWidth()
設置空心的邊框寬度
setTextAlign()
設置文字的對齊方式
setTypeface()
設置字體,如粗細、傾斜
在設置畫筆顏色的時候,使用到了Color類,這個類定義了一些顏色常量和顏色轉換。如Color.RED、Color.GRENN等,還可以通過Color類的靜態方法rgb(int,int,int)
來定一個顏色,這三個參數的的值范圍是0~255。
Canvas:是一個畫布,可以在上面畫想要的任何東西,也可以設置畫布的一些的屬性,比如背景顏色,尺寸等。Canvas提供了一下一些方法:
方法:Canvas(),創建一個空的畫布,可以使用setBitmap()方法來設置繪制的具體畫布;
Canvas(Bitmap
bitmap),以bitmap對象創建一個畫布,此時則將內容繪制在bitmap上,bitmap不得為null.
drawColor(),設置畫布的背景顏色。
drawRect(left,top,right,bottom,paint);畫矩形,前四個是float,後一個是Paint類型。
drawLine(startX,startY,stopX,stopY,paint),畫線,前四個參數是float,後一個是Paint類型。
drawText(text,x,y,paint);在畫布上畫指定的文本,x,y兩個參數是float,後一個是Paint類型。
7. Android中TextView中的文字顏色設置setTextColor的用法
原文鏈接http://blog.csdn.net/u012532559/article/details/44925285
Android 中設置TextView的顏色有方法setTextColor,這個方法被重載了,可以傳入兩種參數。一種方法是傳入int color值,要注意這個int不是R文件中自動分配的十六進制int值,這是Color類中的靜態方法構造出來的顏色int值。另一種方法是通過ColorStateList得到xml中的配置的顏色的。好多需要xml中配置的都要類似這樣的映射xml文件(比如一個按鈕事件的選擇器,默認狀態為顏色A,點擊時狀態為顏色B等等選擇效果)。
setTextColor的兩種重載方法如下:
[java] view plain
publicvoidsetTextColor(intcolor) {
mTextColor = ColorStateList.valueOf(color);
updateTextColors();
}
publicvoidsetTextColor(ColorStateList colors) {
if(colors ==null) {
thrownewNullPointerException();
}
mTextColor = colors;
updateTextColors();
}
第一種重載方法有以下實現方式:
方法一:通過ARGB值的方式
textview.setTextColor(Color.rgb(255,255, 255));
textview.setTextColor(Color.parseColor("#FFFFFF"));
方法二:通過資源引用
textview.setTextColor(mContext.getResources().getColor(R.drawable.contact_btn_text_red))
#f2497c
第二種重載方法的實現:
[java] view plain
textview.setTextColor(mContext.getResources().getColorStateList(R.drawable.big_btn_text_color));
選擇器big_btn_text_color.xml
[html] view plain