[关闭]
@act262 2017-05-26T16:08:46.000000Z 字数 1530 阅读 2272

在xml文件中使用自定义Drawable

Android


API 24以前,只能在xml文件中使用framework中自带的那些Drawable类,要用自定义的Drawable只能在java代码中使用。 在API 24+开始可以在xml文件中使用我们自定义的Drawable了。

  1. * <p>
  2. * All versions of Android allow the Drawable class to be extended and used at
  3. * run time in place of framework-provided drawable classes. Starting in
  4. * {@link android.os.Build.VERSION_CODES#N API 24}, custom drawables classes
  5. * may also be used in XML.

创建一个自定义Drawable

创建一个CustomDrawable继承自Drawable

  1. public class CustomDrawable extends Drawable {
  2. private Paint paint = new Paint();
  3. public CustomDrawable() {
  4. paint.setColor(Color.RED);
  5. }
  6. @Override
  7. public void draw(@NonNull Canvas canvas) {
  8. // 自定义实现功能
  9. canvas.drawCircle(100, 100, 100, paint);
  10. }
  11. @Override
  12. public void setAlpha(@IntRange(from = 0, to = 255) int alpha) {}
  13. @Override
  14. public void setColorFilter(@Nullable ColorFilter colorFilter) {}
  15. @Override
  16. public int getOpacity() {
  17. return 0;
  18. }
  19. }

创建drawable下的xml文件

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <drawable class="io.microact.drawablesample.CustomDrawable" color="#f00" />
该方式对应的CustomDrawable类只能是public顶层类或者public的静态内部类
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <io.microact.drawablesample.CustomDrawable xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:color="#ffff0000" />
该方式对应的CustomDrawable类只能是public顶层类,不能是内部类,因为xml中tag不能包含`$`符号

使用Drawwable


注意:在xml文件中使用自定义Drawable时,IDE会报错,没有预览效果,实际运行OK。

源码解析

具体实现在DrawableInflater.java

  1. // 解析系统自带的Drawable
  2. private Drawable inflateFromTag(@NonNull String name) {
  3. // ...
  4. }
  5. // 解析自定义的Drawable
  6. private Drawable inflateFromClass(@NonNull String className) {
  7. // 解析我们的class
  8. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注