生活随笔
收集整理的這篇文章主要介紹了
关于着色器LinearGradient的使用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
LinearGradient我們可以將之譯為線型漸變、線型渲染等,譯成什么不重要,重要的是它的顯示效果是什么樣子,今天我們就一起來看看。
先來看看LinearGradient的構造方法:
[java] view plaincopy print?
????????public?LinearGradient(float?x0,?float?y0,?float?x1,?float?y1,?int?colors[],?float?positions[],??????????????TileMode?tile)?{??.........??.....??......??????????}??
LinearGradient的構造方法共有七個參數,分別表示:
x0表示渲染起始位置的x坐標,y0表示渲染起始位置的y坐標,x1表示渲染結束位置的x坐標,y1表示渲染結束位置的y坐標,colors表示渲染的顏色,它是一個顏色數組,數組長度必須大于等于2,positions表示colors數組中幾個顏色的相對位置,是一個float類型的數組,該數組的長度必須與colors數組的長度相同。如果這個參數使用null也可以,這時系統會按照梯度線來均勻分配colors數組中的顏色,最后一個參數則表示平鋪方式,有三種,我們分別來看:
為了給大家演示不同平鋪方式下使用著色器的不同效果,我自定義了一個View,叫做AboutShaderView,我重寫了該View中的兩個方法,分別是onMeasure以及onDraw,在onMeasure方法中,我把該控件的寬高固定為256dp,代碼如下:
[java] view plaincopy print?
@Override??protected?void?onMeasure(int?widthMeasureSpec,?int?heightMeasureSpec)?{??????super.onMeasure(widthMeasureSpec,?heightMeasureSpec);??????setMeasuredDimension((int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,?256,?getResources().getDisplayMetrics()),?(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,?256,?getResources().getDisplayMetrics()));??}??
然后在onDraw方法中通過使用著色器的不同模式,來讓它顯示不同的效果,最后,我在布局文件中引用自定義View:
[java] view plaincopy print?
<?xml?version="1.0"?encoding="utf-8"?>??<LinearLayout??????xmlns:android="http://schemas.android.com/apk/res/android"??????xmlns:tools="http://schemas.android.com/tools"??????android:layout_width="match_parent"??????android:layout_height="match_parent"??????android:orientation="vertical"??????tools:context="lenve.customtextview.MainActivity">??????<lenve.customtextview.AboutShaderView??????????android:layout_width="256dp"??????????android:layout_height="256dp"/>??</LinearLayout>?? ?
OK,下面我們一起來看看這幾種不同模式的顯示效果:
1.LinearGradient.TileMode.CLAMP
這種模式表示重復最后一種顏色直到該View結束的地方,如果我設置著色器開始的位置為(0,0),結束位置為(getMeasuredWidth(), 0)表示我的著色器要給整個View在水平方向上渲染不同的顏色,代碼如下:
[java] view plaincopy print?
@Override??protected?void?onDraw(Canvas?canvas)?{??????super.onDraw(canvas);??????Paint?paint?=?new?Paint();??????paint.setColor(Color.GREEN);??????LinearGradient?linearGradient?=?new?LinearGradient(0,?0,?getMeasuredWidth(),?0,new?int[]{Color.RED,?Color.WHITE,?Color.BLUE},?null,?LinearGradient.TileMode.CLAMP);??????paint.setShader(linearGradient);??????canvas.drawRect(0,0,getMeasuredWidth(),getMeasuredHeight(),paint);??}??
顯示效果如下:
水平方向上依次是紅白藍,沒問題,那我如果變換一下需求,我想把渲染的方向修改為從左上角到右下角,那么該怎么辦?很簡單,只需要修改渲染結束的位置為getMeasuredHeight()即可,代碼如下:
[java] view plaincopy print?
@Override??protected?void?onDraw(Canvas?canvas)?{??????super.onDraw(canvas);??????Paint?paint?=?new?Paint();??????paint.setColor(Color.GREEN);??????LinearGradient?linearGradient?=?new?LinearGradient(0,?0,?getMeasuredWidth(),?getMeasuredHeight(),new?int[]{Color.RED,?Color.WHITE,?Color.BLUE},?null,?LinearGradient.TileMode.CLAMP);??????paint.setShader(linearGradient);??????canvas.drawRect(0,0,getMeasuredWidth(),getMeasuredHeight(),paint);??}??
顯示效果如下:
OK,兩個小Demo讓大家先感受下Shader,下面我繼續變換的我的需求,如果我希望我的著色器的渲染位置變為從(0,0)到(getMeasuredWidth()/2, 0),那么這時候的渲染區域是什么呢?如下圖:
OK,也就是說控件只有一半會被渲染,那么剩下的一半怎么辦呢?這時候就得看我們的最后一個參數了,我們已經說過,LinearGradient.TileMode.CLAMP模式表示重復最后一種顏色直到該View結束的地方,也就是說從View寬度的1/2處直到View結束的地方都將是藍色(因為View1/2處的顏色是藍色),那么究竟是不是呢,我們看代碼:
[java] view plaincopy print?
@Override??protected?void?onDraw(Canvas?canvas)?{??????super.onDraw(canvas);??????Paint?paint?=?new?Paint();??????paint.setColor(Color.GREEN);??????LinearGradient?linearGradient?=?new?LinearGradient(0,?0,?getMeasuredWidth()/2,?0,new?int[]{Color.RED,?Color.WHITE,?Color.BLUE},?null,?LinearGradient.TileMode.CLAMP);??????paint.setShader(linearGradient);??????canvas.drawRect(0,0,getMeasuredWidth(),getMeasuredHeight(),paint);??}??
再看效果圖:
和我們想的一樣,這就是LinearGradient.TileMode.CLAMP模式的特點。
2.LinearGradient.TileMode.REPEAT
LinearGradient.TileMode.REPEAT表示著色器在水平或者垂直方向上對控件進行重復著色,類似于windows系統桌面背景中的“平鋪”,那么接下來我們來看看著色器對這種模式的處理方式,假如我希望著色器開始渲染的位置為(0,0),結束渲染的位置為(getMeasuredWidth()/2, getMeasuredHeight()/2),但與之前不同的是這次的平鋪方式變為LinearGradient.TileMode.REPEAT,我們來看看代碼:
[java] view plaincopy print?
@Override??protected?void?onDraw(Canvas?canvas)?{??????super.onDraw(canvas);??????Paint?paint?=?new?Paint();??????paint.setColor(Color.GREEN);??????LinearGradient?linearGradient?=?new?LinearGradient(0,?0,?getMeasuredWidth()/2,?getMeasuredHeight()/2,new?int[]{Color.RED,?Color.WHITE,?Color.BLUE},?null,?LinearGradient.TileMode.REPEAT);??????paint.setShader(linearGradient);??????canvas.drawRect(0,0,getMeasuredWidth(),getMeasuredHeight(),paint);??}??
效果圖如下:
OK,沿著舉行對角線,著色器對View進行了重復渲染,為了大家更好的理解LinearGradient.TileMode.REPEAT模式,這次我把我的需求該一下,我希望從(0,0)處開始渲染,到(0, getMeasuredHeight()/2)處結束,這時系統會在垂直方向上重復渲染,代碼如下:
[java] view plaincopy print?
@Override??protected?void?onDraw(Canvas?canvas)?{??????super.onDraw(canvas);??????Paint?paint?=?new?Paint();??????paint.setColor(Color.GREEN);??????LinearGradient?linearGradient?=?new?LinearGradient(0,?0,?0,?getMeasuredHeight()/2,new?int[]{Color.RED,?Color.WHITE,?Color.BLUE},?null,?LinearGradient.TileMode.REPEAT);??????paint.setShader(linearGradient);??????canvas.drawRect(0,0,getMeasuredWidth(),getMeasuredHeight(),paint);??}??
效果圖如下:
OK,沒問題,如我們所預料的那樣。
3.LinearGradient.TileMode.MIRROR
LinearGradient.TileMode.MIRROR模式會在水平方向或者垂直方向上以鏡像的方式進行渲染,這種渲染方式的一個特征就是具有翻轉的效果,比如我希望我的著色器開始渲染的位置為(0,0),結束渲染的位置為(getMeasuredWidth()/2, 0),那么效果圖是什么樣子呢?我們先來看看代碼:
[java] view plaincopy print?
@Override??protected?void?onDraw(Canvas?canvas)?{??????super.onDraw(canvas);??????Paint?paint?=?new?Paint();??????paint.setColor(Color.GREEN);??????LinearGradient?linearGradient?=?new?LinearGradient(0,?0,?getMeasuredWidth()/2,?0,new?int[]{Color.RED,?Color.WHITE,?Color.BLUE},?null,?LinearGradient.TileMode.MIRROR);??????paint.setShader(linearGradient);??????canvas.drawRect(0,0,getMeasuredWidth(),getMeasuredHeight(),paint);??}??
效果圖如下:
OK,剩下的一部分依然被渲染,但是渲染的前后兩部分是對稱的,這就是LinearGradient.TileMode.MIRROR模式,很簡單吧!
OK,以上就是LinearGradient的用法,有問題歡迎討論。
轉載于:https://www.cnblogs.com/Free-Thinker/p/6544064.html
總結
以上是生活随笔為你收集整理的关于着色器LinearGradient的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。