ShadowViewDrawable.java
3.22 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/*
* Copyright (c) 2016 wugian
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.xgimi.gimicinema.view.shadow;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
/**
* <code>
* if (Build.VERSION.SDK_INT > Build.VERSION_CODES.HONEYCOMB) {
* view.setLayerType(View.LAYER_TYPE_SOFTWARE, drawable.getPaint());
* }
* </code>
* <p/>
* Author: wangjie
* Email: tiantian.china.2@gmail.com
* Date: 5/2/15.
*/
public class ShadowViewDrawable extends Drawable {
private Paint paint;
private RectF bounds = new RectF();
private int width;
private int height;
private ShadowProperty shadowProperty;
private int shadowOffset;
private RectF drawRect;
private float rx;
private float ry;
public ShadowViewDrawable(ShadowProperty shadowProperty, int color, float rx, float ry) {
this.shadowProperty = shadowProperty;
shadowOffset = this.shadowProperty.getShadowOffset();
this.rx = rx;
this.ry = ry;
paint = new Paint();
paint.setAntiAlias(true);
/**
* 解决旋转时的锯齿问题
*/
paint.setFilterBitmap(true);
paint.setDither(true);
paint.setStyle(Paint.Style.FILL);
paint.setColor(color);
/**
* 设置阴影
*/
paint.setShadowLayer(shadowProperty.getShadowRadius(), shadowProperty.getShadowDx(), shadowProperty.getShadowDy(), shadowProperty.getShadowColor());
drawRect = new RectF();
}
@Override
protected void onBoundsChange(Rect bounds) {
super.onBoundsChange(bounds);
if (bounds.right - bounds.left > 0 && bounds.bottom - bounds.top > 0) {
this.bounds.left = bounds.left;
this.bounds.right = bounds.right;
this.bounds.top = bounds.top;
this.bounds.bottom = bounds.bottom;
width = (int) (this.bounds.right - this.bounds.left);
height = (int) (this.bounds.bottom - this.bounds.top);
drawRect = new RectF(shadowOffset, shadowOffset, width - shadowOffset, height - shadowOffset);
invalidateSelf();
}
}
@Override
public void draw(Canvas canvas) {
canvas.drawRoundRect(
drawRect,
rx, ry,
paint
);
}
public ShadowViewDrawable setColor(int color) {
paint.setColor(color);
return this;
}
@Override
public void setAlpha(int alpha) {
}
@Override
public void setColorFilter(ColorFilter cf) {
}
@Override
public int getOpacity() {
return 0;
}
}