前言
根據(jù)啟艦 的博客所學(xué)習(xí)的自定義View魁兼。
一、setShadowLayer構(gòu)造函數(shù)
public void setShadowLayer(float radius, float dx, float dy, int color)
- radius:模糊半徑漠嵌,radius越大越模糊咐汞,越小越清晰,但是如果radius設(shè)置為0儒鹿,則陰影消失不見
- dx:陰影的橫向偏移距離化撕,正值向右偏移,負值向左偏移
- dy:陰影的縱向偏移距離约炎,正值向下偏移侯谁,負值向上偏移
- color: 繪制陰影的畫筆顏色,即陰影的顏色(對圖片陰影無效)
注意:這里有一點需要非常注意的是setShadowLayer只有文字繪制陰影支持硬件加速章钾,其它都不支持硬件加速墙贱,所以為了方便起見,我們需要在自定義控件中禁用硬件加速贱傀。
二惨撇、實現(xiàn)對文本,圖形府寒,Image的陰影效果
void init(){
setLayerType(LAYER_TYPE_SOFTWARE, null);//對單獨的View在運行時階段禁用硬件加速
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
paint.setColor(Color.RED);
paint.setStrokeWidth(2);
paint.setAntiAlias(true);
paint.setTextSize(50);
paint.setShadowLayer(5, 15, 20, Color.GREEN);
canvas.drawText("demo", 100, 100, paint);
canvas.drawCircle(200, 200, 50, paint);
canvas.drawBitmap(bitmap, null, new RectF(200, 300, 200 + bitmap.getWidth(), 300 + bitmap.getHeight()), paint);
}
效果圖
三魁衙、 清除與顯示陰影
- 顯示陰影就調(diào)用paint.setShadowLayer方法
- 清除陰影就調(diào)用paint.clearShadowLayer()
四、TextView及其派生類使用ShadowLayer添加陰影效果
直接上代碼??
<TextView
…………
android:shadowRadius="3"
android:shadowDx="5"
android:shadowDy="5"
android:shadowColor="@android:color/darker_gray"/>
或者
TextView tv = (TextView)findViewById(R.id.tv);
tv.setShadowLayer(2,5,5, Color.GREEN);
五株搔、SetMaskFilter之BlurMaskFilter實現(xiàn)發(fā)光效果
與setShadowLayer一樣剖淀,發(fā)光效果也是使用的高斯模糊,并且只會影響邊緣部分圖像纤房,內(nèi)部圖像是不受影響的
發(fā)光效果是無法指定發(fā)光顏色的纵隔,采用邊緣部分的顏色取樣來進行模糊發(fā)光。所以邊緣是什么顏色炮姨,發(fā)出的光也就是什么顏色的捌刮。
1. 基本方法
public MaskFilter setMaskFilter(MaskFilter maskfilter)
public BlurMaskFilter(float radius, Blur style)
- float radius:用來定義模糊半徑,同樣是高斯模糊算法舒岸。
- Blur style:發(fā)光樣式绅作,有內(nèi)發(fā)光、外發(fā)光蛾派、和內(nèi)外發(fā)光俄认,分別對應(yīng):Blur.INNER(內(nèi)發(fā)光)个少、Blur.SOLID(外發(fā)光)、Blur.NORMAL(內(nèi)外發(fā)光)眯杏、Blur.OUTER(僅發(fā)光部分可見)夜焦,
void init(){
......
setLayerType(LAYER_TYPE_SOFTWARE, null);//對單獨的View在運行時階段禁用硬件加速
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.BLACK);
canvas.drawText("正常",30,100,paint);
Paint paint1 = new Paint();
paint1.setColor(Color.RED);
paint1.setStyle(Paint.Style.FILL);
canvas.drawCircle(300, 100, 50, paint1);
canvas.drawText("INNER",0,250,paint);
Paint paint2 = new Paint();
paint2.setColor(Color.RED);
paint2.setStyle(Paint.Style.FILL);
paint2.setMaskFilter(new BlurMaskFilter(50, BlurMaskFilter.Blur.INNER));
canvas.drawCircle(300, 250, 50, paint2);
canvas.drawText("OUTER",0,400,paint);
Paint paint3 = new Paint();
paint3.setColor(Color.RED);
paint3.setStyle(Paint.Style.FILL);
paint3.setMaskFilter(new BlurMaskFilter(50, BlurMaskFilter.Blur.OUTER));
canvas.drawCircle(300, 400, 50, paint3);
canvas.drawText("NORMAL",0,550,paint);
Paint paint4 = new Paint();
paint4.setColor(Color.RED);
paint4.setStyle(Paint.Style.FILL);
paint4.setMaskFilter(new BlurMaskFilter(50, BlurMaskFilter.Blur.NORMAL));
canvas.drawCircle(300, 550, 50, paint4);
}
效果圖
2. 圖片發(fā)光
其實實現(xiàn)方式和上邊的一樣的,不過,這里我們先說一個小知識** extraAlpha()函數(shù)**:
extractAlpha()新建一張僅具有Alpha值的空白圖像
這張圖像的顏色役拴,是由canvas.drawBitmap時的畫筆指定的糊探。
舉個栗子:
void init(){
......
setLayerType(LAYER_TYPE_SOFTWARE, null);//對單獨的View在運行時階段禁用硬件加速
}
//初始化
private void initBitmap() {
bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.bear);
mBitmap = bitmap.extractAlpha();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.BLACK);
paint.setColor(Color.GREEN);
canvas.drawBitmap(mBitmap, null, new RectF(100, 100, 100 + mBitmap.getWidth(), mBitmap.getHeight() + 100), paint);
canvas.drawBitmap(bitmap, null, new RectF(100, 300, 100 + bitmap.getWidth(), bitmap.getHeight() + 300), paint);
}
效果圖
那么钾埂,接下來我們就將這兩個圖發(fā)光吧河闰!
其實還是這兩句話,哈哈
mPaint.setColor(mShadowColor);//設(shè)置發(fā)光的顏色
mPaint.setMaskFilter(new BlurMaskFilter(mRadius, BlurMaskFilter.Blur.NORMAL));//設(shè)置發(fā)光樣式,NORMAL是內(nèi)外發(fā)光
具體源碼:
setLayerType(LAYER_TYPE_SOFTWARE, null);//對單獨的View在運行時階段禁用硬件加速
paint.setMaskFilter(new BlurMaskFilter(10, BlurMaskFilter.Blur.NORMAL));
paint.setColor(Color.GREEN);
canvas.drawBitmap(mBitmap, null, new RectF(100, 100, 100 + mBitmap.getWidth(), mBitmap.getHeight() + 100), paint);
paint.setMaskFilter(new BlurMaskFilter(10, BlurMaskFilter.Blur.NORMAL));
canvas.drawBitmap(bitmap, null, new RectF(100, 300, 100 + bitmap.getWidth(), bitmap.getHeight() + 300), paint);
效果圖為【可以對比上面未發(fā)光的效果圖】:
BlurMaskFilter
后記
由于作者君偷懶褥紫,所以paint的創(chuàng)建呀什么的姜性,全都放在onDraw里面了,大家寫代碼的時候髓考,要使onDraw輕量部念。不要直接放進去,在外面初始化哈~
感謝大家提出的問題氨菇,筆芯~