简书链接:追踪源码抄袭android的xml转drawable代码实现recyclerview分割线用代码是些shapeselector等等方案
文章字数:114,阅读全文大约需要1分钟
追踪源码找到了这句话,所以也可以理解为什么网上要那样写了.这其实官方就是这样写的。
那么我接下来就要手写一个recyclerview的shape分割线

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
public static Drawable createFromXmlInner(Resources r, XmlPullParser parser, AttributeSet attrs,
Theme theme) throws XmlPullParserException, IOException {
final Drawable drawable;

final String name = parser.getName();
switch (name) {
case "selector":
drawable = new StateListDrawable();
break;
case "animated-selector":
drawable = new AnimatedStateListDrawable();
break;
case "level-list":
drawable = new LevelListDrawable();
break;
case "layer-list":
drawable = new LayerDrawable();
break;
case "transition":
drawable = new TransitionDrawable();
break;
case "ripple":
drawable = new RippleDrawable();
break;
case "color":
drawable = new ColorDrawable();
break;
case "shape":
drawable = new GradientDrawable();
break;
case "vector":
drawable = new VectorDrawable();
break;
case "animated-vector":
drawable = new AnimatedVectorDrawable();
break;
case "scale":
drawable = new ScaleDrawable();
break;
case "clip":
drawable = new ClipDrawable();
break;
case "rotate":
drawable = new RotateDrawable();
break;
case "animated-rotate":
drawable = new AnimatedRotateDrawable();
break;
case "animation-list":
drawable = new AnimationDrawable();
break;
case "inset":
drawable = new InsetDrawable();
break;
case "bitmap":
drawable = new BitmapDrawable(r);
if (r != null) {
((BitmapDrawable) drawable).setTargetDensity(r.getDisplayMetrics());
}
break;
case "nine-patch":
drawable = new NinePatchDrawable();
if (r != null) {
((NinePatchDrawable) drawable).setTargetDensity(r.getDisplayMetrics());
}
break;
default:
throw new XmlPullParserException(parser.getPositionDescription() +
": invalid drawable tag " + name);

}
drawable.inflate(r, parser, attrs, theme);
return drawable;
}

实现shape

1
2
3
4
5
6
7
8
9
10
*/
//在这里我们传入作为Divider的Drawable对象

mDrawable = new GradientDrawable();

RectShape rectShape = new RectShape();
mDrawable.setGradientType(GradientDrawable.RECTANGLE);
int size = DensityUtil.dip2px(context, 0.5f);
mDrawable.setSize(size,size);
mDrawable.setColor(Color.parseColor(colorHex));

实现selector

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public static StateListDrawable genereateSelectorDrawable(Context context, int idNormal, int idPressed, int idFocused, int idUnable) {
StateListDrawable bg = new StateListDrawable();
Drawable normal = idNormal == -1 ? null : context.getResources().getDrawable(idNormal);
Drawable pressed = idPressed == -1 ? null : context.getResources().getDrawable(idPressed);
Drawable focused = idFocused == -1 ? null : context.getResources().getDrawable(idFocused);
Drawable unable = idUnable == -1 ? null : context.getResources().getDrawable(idUnable);
// View.PRESSED_ENABLED_STATE_SET
bg.addState(new int[]{android.R.attr.state_pressed, android.R.attr.state_enabled}, pressed);
// View.ENABLED_FOCUSED_STATE_SET
bg.addState(new int[]{android.R.attr.state_enabled, android.R.attr.state_focused}, focused);
// View.ENABLED_STATE_SET
bg.addState(new int[]{android.R.attr.state_enabled}, normal);
// View.FOCUSED_STATE_SET
bg.addState(new int[]{android.R.attr.state_focused}, focused);
// View.WINDOW_FOCUSED_STATE_SET
bg.addState(new int[]{android.R.attr.state_window_focused}, unable);
// View.EMPTY_STATE_SET
bg.addState(new int[]{}, normal);
return bg;
}

接下来如何创建可以自行百度。