@act262
2017-05-26T16:08:46.000000Z
字数 1530
阅读 2628
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);}@Overridepublic void draw(@NonNull Canvas canvas) {// 自定义实现功能canvas.drawCircle(100, 100, 100, paint);}@Overridepublic void setAlpha(@IntRange(from = 0, to = 255) int alpha) {}@Overridepublic void setColorFilter(@Nullable ColorFilter colorFilter) {}@Overridepublic 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
// 解析系统自带的Drawableprivate Drawable inflateFromTag(@NonNull String name) {// ...}// 解析自定义的Drawableprivate Drawable inflateFromClass(@NonNull String className) {// 解析我们的class}