參考
- https://blog.csdn.net/harvic880925/article/details/51818489
- https://blog.csdn.net/harvic880925/article/details/51615221
昨天看了一些博主的QQ仿紅點(diǎn)拖動效果百拓。寫的相當(dāng)不錯(cuò)作媚,最好自己去實(shí)踐一下舟陆;原理其實(shí)比較簡單,也就是組合各種基礎(chǔ)技術(shù)撩匕,形成效果,不得不說茶凳,基礎(chǔ)知識是多么重要豆赏;
路必須一步一步走;
Paint.setShadowLayer陰影效果
Paint中有一個(gè)專門用來實(shí)現(xiàn)陰影效果的函數(shù)setShadowLayer
public void setShadowLayer(float radius, float dx, float dy, int shadowColor)
參數(shù):
- radius:模糊半徑晒旅,radius越大越模糊,越小越清晰汪诉,但是如果radius設(shè)置為0废恋,則陰影消失不見;
- dx:陰影的橫向偏移距離扒寄,正值向右偏移鱼鼓,負(fù)值向左偏移;
- dy:陰影的縱向偏移距離该编,正值向下偏移迄本,負(fù)值向上偏移;
- color:繪制陰影的畫筆顏色课竣,即陰影的顏色(對圖片陰影無效);
模糊半徑:
setShadowLayer使用的是高斯模糊算法嘉赎,高斯模糊的具體算法是:對于正在處理的每一個(gè)像素置媳,取周圍若干個(gè)像素的RGB值并且平均,然后這個(gè)平均值就是模糊處理過的像素公条;
取周圍像素的半徑就是模糊半徑
,模糊半徑越大,所得平均像素與原始像素相差就越大,也就越模糊拇囊;
注意:setShadowLayer 不支持硬件加速;
val paint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
strokeWidth = 2f
color = Color.GREEN
}
val bmp = BitmapFactory.decodeResource(resources, R.mipmap.juntuan)
init {
// 需禁用硬件加速
setLayerType(LAYER_TYPE_SOFTWARE, null)
}
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
paint.apply {
setShadowLayer(10f, 50f, 50f, Color.GREEN)
}
canvas.drawBitmap(bmp, 100f, 100f, paint)
}
效果圖
Paint. clearShadowLayer清除陰影
TextView 陰影效果
直接調(diào)用 setShadowLayer()
方法進(jìn)行設(shè)置靶橱;也可以在xml中進(jìn)行設(shè)置寥袭;
root_container.addView(TextView(this@PaintShadowLayerActivity).apply {
setShadowLayer(10f, 10f, 10f, Color.GRAY)
textColor = Color.BLACK
text = "非常感謝啟艦提供這么好的教程"
textSize = 20f
})
<TextView
android:shadowRadius="3"
android:shadowDx="5"
android:shadowDy="5"
android:shadowColor="@android:color/darker_gray">
陰影文字效果
SetMaskFilter之BlurMaskFilter實(shí)現(xiàn)發(fā)光效果
- 與setShadowLayer一樣,發(fā)光效果也是使用的高斯模糊关霸,并且只會影響邊緣部分圖像传黄,內(nèi)部圖像是不受影響的;
- 發(fā)光效果是
無法指定發(fā)光顏色的
队寇,采用邊緣部分的顏色取樣來進(jìn)行模糊發(fā)光膘掰。所以邊緣是什么顏色,發(fā)出的光也就是什么顏色的英上。
SetMaskFilter之BlurMaskFilter
Paint的setMaskFilter函數(shù):
public MaskFilter setMaskFilter(MaskFilter maskfilter)
與setColorFilter顏色濾鏡類似炭序,setMaskFilter中的MaskFilter也是沒有具體實(shí)現(xiàn)的,也是通過派生子類來實(shí)現(xiàn)具體的不同功能的苍日,其有2個(gè)子類:
- BlurMaskFilter 實(shí)現(xiàn)發(fā)光效果
- EmbossMaskFilter 實(shí)現(xiàn)浮雕效果
maskFilter也是不支持硬件加速的惭聂,BlurMaskFilter 的構(gòu)造如下:
public BlurMaskFilter(float radius, Blur style)
- radius: 模糊半徑;
- style:發(fā)光樣式;
- Blur.INNER 內(nèi)發(fā)光;
- Blur.SOLID 外發(fā)光相恃;
- Blur.NORMAL 內(nèi)外發(fā)光辜纲;
- Blur.OUTER 僅發(fā)光部分可見;
示例代碼:
val paint = Paint().apply {
color = Color.RED
maskFilter = BlurMaskFilter(100f, BlurMaskFilter.Blur.INNER)
}
val bmp = BitmapFactory.decodeResource(resources, R.mipmap.juntuan)
init {
// 需禁用硬件加速
setLayerType(LAYER_TYPE_SOFTWARE, null)
}
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
canvas.drawCircle(200f, 200f, 100f, paint)
canvas.translate(350f, 0f)
paint.maskFilter = BlurMaskFilter(100f, BlurMaskFilter.Blur.SOLID)
canvas.drawCircle(200f, 200f, 100f, paint)
canvas.translate(-350f, 350f)
paint.maskFilter = BlurMaskFilter(100f, BlurMaskFilter.Blur.NORMAL)
canvas.drawCircle(200f, 200f, 100f, paint)
canvas.translate(350f, 0f)
paint.maskFilter = BlurMaskFilter(100f, BlurMaskFilter.Blur.OUTER)
canvas.drawCircle(200f, 200f, 100f, paint)
canvas.translate(-350f, 350f)
paint.maskFilter = BlurMaskFilter(50f, BlurMaskFilter.Blur.SOLID)
canvas.drawBitmap(bmp, 200f,200f, paint)
}
效果圖
- 上左:內(nèi)發(fā)光(INNER)
- 上右:外發(fā)光(SOLID)
- 下左:內(nèi)外發(fā)光(NORMAL)
- 下右:僅顯示發(fā)光效果(OUTER),該模式下僅會顯示發(fā)光效果拦耐,會把原圖像中除了發(fā)光部分耕腾,全部變?yōu)橥该鳎?/li>