@act262
2017-05-26T16:08:46.000000Z
字数 1530
阅读 2471
Android
在API 24以前,只能在xml文件中使用framework中自带的那些Drawable类,要用自定义的Drawable只能在java代码中使用。 在API 24+开始可以在xml文件中使用我们自定义的Drawable了。
* <p>
* All versions of Android allow the Drawable class to be extended and used at
* run time in place of framework-provided drawable classes. Starting in
* {@link android.os.Build.VERSION_CODES#N API 24}, custom drawables classes
* may also be used in XML.
创建一个CustomDrawable
继承自Drawable
类
public class CustomDrawable extends Drawable {
private Paint paint = new Paint();
public CustomDrawable() {
paint.setColor(Color.RED);
}
@Override
public void draw(@NonNull Canvas canvas) {
// 自定义实现功能
canvas.drawCircle(100, 100, 100, paint);
}
@Override
public void setAlpha(@IntRange(from = 0, to = 255) int alpha) {}
@Override
public void setColorFilter(@Nullable ColorFilter colorFilter) {}
@Override
public int getOpacity() {
return 0;
}
}
custom_drawable_1.xml
<?xml version="1.0" encoding="utf-8"?>
<drawable class="io.microact.drawablesample.CustomDrawable" color="#f00" />
该方式对应的CustomDrawable类只能是public顶层类或者public的静态内部类
custom_drawable_2.xml
<?xml version="1.0" encoding="utf-8"?>
<io.microact.drawablesample.CustomDrawable xmlns:android="http://schemas.android.com/apk/res/android"
android:color="#ffff0000" />
该方式对应的CustomDrawable类只能是public顶层类,不能是内部类,因为xml中tag不能包含`$`符号
CustomDrawable
注意:在xml文件中使用自定义Drawable时,IDE会报错,没有预览效果,实际运行OK。
具体实现在DrawableInflater.java
// 解析系统自带的Drawable
private Drawable inflateFromTag(@NonNull String name) {
// ...
}
// 解析自定义的Drawable
private Drawable inflateFromClass(@NonNull String className) {
// 解析我们的class
}