日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于着色器LinearGradient的使用

發(fā)布時間:2024/4/14 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于着色器LinearGradient的使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

LinearGradient我們可以將之譯為線型漸變、線型渲染等,譯成什么不重要,重要的是它的顯示效果是什么樣子,今天我們就一起來看看。

先來看看LinearGradient的構(gòu)造方法:

[java] view plaincopy print?
  • ????/**?Create?a?shader?that?draws?a?linear?gradient?along?a?line.?
  • ????????@param?x0???????????The?x-coordinate?for?the?start?of?the?gradient?line?
  • ????????@param?y0???????????The?y-coordinate?for?the?start?of?the?gradient?line?
  • ????????@param?x1???????????The?x-coordinate?for?the?end?of?the?gradient?line?
  • ????????@param?y1???????????The?y-coordinate?for?the?end?of?the?gradient?line?
  • ????????@param??colors??????The?colors?to?be?distributed?along?the?gradient?line?
  • ????????@param??positions???May?be?null.?The?relative?positions?[0..1]?of?
  • ????????????????????????????each?corresponding?color?in?the?colors?array.?If?this?is?null,?
  • ????????????????????????????the?the?colors?are?distributed?evenly?along?the?gradient?line.?
  • ????????@param??tile????????The?Shader?tiling?mode?
  • ????*/??
  • ????public?LinearGradient(float?x0,?float?y0,?float?x1,?float?y1,?int?colors[],?float?positions[],??
  • ????????????TileMode?tile)?{??
  • .........??
  • .....??
  • ......??
  • ????????}??

  • LinearGradient的構(gòu)造方法共有七個參數(shù),分別表示:

    x0表示渲染起始位置的x坐標,y0表示渲染起始位置的y坐標,x1表示渲染結(jié)束位置的x坐標,y1表示渲染結(jié)束位置的y坐標,colors表示渲染的顏色,它是一個顏色數(shù)組,數(shù)組長度必須大于等于2,positions表示colors數(shù)組中幾個顏色的相對位置,是一個float類型的數(shù)組,該數(shù)組的長度必須與colors數(shù)組的長度相同。如果這個參數(shù)使用null也可以,這時系統(tǒng)會按照梯度線來均勻分配colors數(shù)組中的顏色,最后一個參數(shù)則表示平鋪方式,有三種,我們分別來看:

    為了給大家演示不同平鋪方式下使用著色器的不同效果,我自定義了一個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

    這種模式表示重復(fù)最后一種顏色直到該View結(jié)束的地方,如果我設(shè)置著色器開始的位置為(0,0),結(jié)束位置為(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);??
  • }??

  • 顯示效果如下:

    水平方向上依次是紅白藍,沒問題,那我如果變換一下需求,我想把渲染的方向修改為從左上角到右下角,那么該怎么辦?很簡單,只需要修改渲染結(jié)束的位置為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,下面我繼續(xù)變換的我的需求,如果我希望我的著色器的渲染位置變?yōu)閺?#xff08;0,0)到(getMeasuredWidth()/2, 0),那么這時候的渲染區(qū)域是什么呢?如下圖:

    OK,也就是說控件只有一半會被渲染,那么剩下的一半怎么辦呢?這時候就得看我們的最后一個參數(shù)了,我們已經(jīng)說過,LinearGradient.TileMode.CLAMP模式表示重復(fù)最后一種顏色直到該View結(jié)束的地方,也就是說從View寬度的1/2處直到View結(jié)束的地方都將是藍色(因為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表示著色器在水平或者垂直方向上對控件進行重復(fù)著色,類似于windows系統(tǒng)桌面背景中的“平鋪”,那么接下來我們來看看著色器對這種模式的處理方式,假如我希望著色器開始渲染的位置為(0,0),結(jié)束渲染的位置為(getMeasuredWidth()/2, getMeasuredHeight()/2),但與之前不同的是這次的平鋪方式變?yōu)長inearGradient.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進行了重復(fù)渲染,為了大家更好的理解LinearGradient.TileMode.REPEAT模式,這次我把我的需求該一下,我希望從(0,0)處開始渲染,到(0, getMeasuredHeight()/2)處結(jié)束,這時系統(tǒng)會在垂直方向上重復(fù)渲染,代碼如下:

    [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,沒問題,如我們所預(yù)料的那樣。

    3.LinearGradient.TileMode.MIRROR

    LinearGradient.TileMode.MIRROR模式會在水平方向或者垂直方向上以鏡像的方式進行渲染,這種渲染方式的一個特征就是具有翻轉(zhuǎn)的效果,比如我希望我的著色器開始渲染的位置為(0,0),結(jié)束渲染的位置為(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的用法,有問題歡迎討論。

    轉(zhuǎn)載于:https://www.cnblogs.com/Free-Thinker/p/6544064.html

    總結(jié)

    以上是生活随笔為你收集整理的关于着色器LinearGradient的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。