:)
**V~**
陰影繪制需要的知識點(diǎn)
- 硬件加速
- Paint對象的setShadowLayer方法
android硬件加速
- Application級別開啟硬件加速
<application android:hardwareAccelerated="true"/>
- Activity級別開啟硬件加速
<activity android:hardwareAccelerated="true">
- Window級別開啟硬件加速
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED
);
-
View級別開啟硬件加速
myView.setLayerType(View.LAYER_TYPE_*, null);
setShadowLayer
思路來自一個開源庫
https://github.com/yingLanNull/ShadowImageView
解析上面那個開源庫
- 這個庫的主要代碼就一個自定義的控件ShadowImageView(繼承RelativeLayout)
public class ShadowImageView extends RelativeLayout
- 實(shí)現(xiàn)思路就是先給這個控件繪制一個帶陰影的背景况芒,然后在給這個控件添加一個ImageView的子控件
- 構(gòu)造方法的實(shí)現(xiàn)
public ShadowImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
setPadding(80, 40, 80, 120); //設(shè)置一個padding用來繪制陰影背景
setGravity(Gravity.CENTER);
setLayerType(LAYER_TYPE_SOFTWARE, null); //開啟硬件加速
//添加一個imageView的子控件
RoundImageView roundImageView = new RoundImageView(context);
roundImageView.setScaleType(ImageView.ScaleType.FIT_XY);
if (imageresource == -1) {
roundImageView.setImageResource(android.R.color.transparent);
} else {
roundImageView.setImageResource(imageresource);
}
addView(roundImageView);
}
- 背景的繪制方法dispatchDraw(簡化)
@Override
protected void dispatchDraw(Canvas canvas) {
//初始化一個繪制背景的畫筆
Paint shadowPaint = new Paint();
shadowPaint.setColor(Color.WHITE);
shadowPaint.setStyle(Paint.Style.FILL);
shadowPaint.setAntiAlias(true);
//計算陰影的偏移量 和 給畫筆設(shè)置陰影
int radius = view.getHeight() / 12 > 40 ? 40 : view.getHeight() / 12;
int shadowColor = view.getHeight() / 16 > 28 ? 28 : view.getHeight() / 16;
shadowPaint.setShadowLayer(radius, 0, shadowColor, getDarkerColor(rgb));
//確定陰影的的整個大小
RectF rectF = new RectF(view.getX() + (view.getWidth() / 20), view.getY(), view.getX() + view.getWidth() - (view.getWidth() / 20), view.getY() + view.getHeight() - ((view.getHeight() / 40)));
canvas.drawRoundRect(rectF, shadowRound, shadowRound, shadowPaint);
canvas.save();
super.dispatchDraw(canvas);
}
- 陰影顏色的獲嚷示堋(上面使用的是getDarkerColor方法,這里面有一個小技巧就是HSV模型)
public int getDarkerColor(int color) {
float[] hsv = new float[3];
Color.colorToHSV(color, hsv);
hsv[1] = hsv[1] + 0.1f;
hsv[2] = hsv[2] - 0.1f;
int darkerColor = Color.HSVToColor(hsv);
return darkerColor;
}
簡單說一下HSV
- 平時我們說顏色一般都是RGB线梗,R分量表示紅色缚俏,G綠色惊搏,、B藍(lán)色
- 而HSV也是用來表示顏色的忧换,只是H表示色調(diào)(0 ~ 360)恬惯,S表示飽和度(0 ~ 1),V表示明度(0 ~ 1)
Nothing is certain in this life. The only thing i know for sure is that. I love you and my life. That is the only thing i know. have a good day