自定義View (五) 陰影、漸變

漸變在使用自定義的XML,<gradient> </gradient> 也可以實現,下邊要記錄的是使用android提供的API完成的

一 、陰影

陰影在開發中一般使用與文字和圖形,在繪圖中又一個叫layer的層的概念,默認情況下,一般繪製都在叫main layer層上,當然,也可以繪製在新建的layer層上,實際上陰影就是在main layer層下面添加一個陰影層(shader layer) 層,可以爲陰影添加模糊程度、偏移量、陰影的顏色等,
在paint中,setShadowLayer()方法

方法名 作用
setShadowLayer(float radius, float dx, float dy,int shadowColor) radius 陰影的半徑,dx x 方向的編譯,shadowColor 陰影的顏色

陰影layer顯示陰影是shader layer 兩種類型

方法名 作用
View.LAYER_TYPE_SOFTWARE 陰影只能在這個環境下工作
View.LAYER_TYPE_HARDWARE 默認

調用View類中的setLayerType(int layerType,Paint paint) 爲paint對象指定層的類型,

/**
* Created by mr.kong on 2017/8/21.
*/

class ShaderView : View {

private var mPaint: Paint? = null
constructor(context: Context) : this(context,null) {}

constructor(context: Context, attrs: AttributeSet?) : this(context, attrs,0) {}

constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
    init()
}

private fun init() {
    mPaint = Paint(Paint.ANTI_ALIAS_FLAG) //抗鋸齒
    mPaint?.textSize = 100F

}

override fun onDraw(canvas: Canvas?) {
    super.onDraw(canvas)
    this.setLayerType(View.LAYER_TYPE_SOFTWARE,mPaint)
    /**
     * 定義的是一個半徑爲10,x軸和y軸偏移都爲1 的紅色陰影
     */
    mPaint?.setShadowLayer(10F,1F,1F,Color.RED)
    canvas?.drawText("我是紅色發光效果",100F,100F,mPaint)
    mPaint?.setShadowLayer(10F,5F,5F,Color.BLUE)
    canvas?.drawText("繪圖技術",100F,220F,mPaint)
}   

}
運行 效果
這裏寫圖片描述

二、漸變

漸變,用比較官方的解釋就是,繪圖的過程中顏色貨位圖一特定的規律進行變化,能增強物體的質感和審美的情趣,還可以,能理解哈,

種類 說明
LinerGradient 線性漸變
RadialGradient 徑向漸變
SweepGradient 掃描漸變
BitmapGradient 位圖漸變
ComposeShader 混合漸變

⚠️ 其中線性漸變、徑向漸變和掃描漸變屬於顏色的漸變,指定2��️或以上的顏色,根據顏色過渡算法自動計算出中間的過度顏色

漸變的分類

種類 說明
ABAB A、B兩種顏色重複變化,通過TileMode類的PEPEAT常量表示
ABBA A、B兩種顏色鏡像變化,通過TileMode類的MIRROR常量表示
AABB A、B兩種顏色只出現一次,通過TileMode類的CLAMP常量表示

這裏寫圖片描述
從左到右分別爲 CLAMP、MIRROR、PEPEAT

定義漸變的時候必須指定一個漸變區域,更具定義的漸變內容和漸變模式填滿該區域,調用setShader()指定一種簡便類型

2.1 線性漸變 LinearGradient

線性漸變更具指定的角度、顏色和模式使用漸變顏色填充繪圖區域,定義兩個點,漸變的方向線的方向垂直

LinearGradient 構造方法
public LinearGradient(float x0, float y0, float x1, float y1, int colors[], float positions[],TileMode tile)
public LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1, TileMode tile)

其他幾種就不一一記錄了,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章