Drawable表示一种可以在Canvas上进行绘制的抽象的概念。 有很多种, 不全是图片,也可以通过颜色构造出各式各样的图样的效果。
在实际开发中, Drawable长用来作为View的背景使用。
Drwable的使用范围很单一: 一个是作为ImageView中的图片显示, 另外一个是作为View的背景。
Drwable的工作原理很简单, 其核心方法就是draw();
当自定义的drawable有固定大小时, 最好重写getIntrinsicWidth和getIntrinsicHeight方法。(来源: Android开发艺术探索一书)
Drawable Resources 可绘制的图片资源介绍。
Drawable有很多子类, 继承关系如下图:
LayerDrawable对应的XML标签是<layer-list>, 表示一种层次化的Drawable集合。 layer-list的基本使用介绍
StateListDrawable对应的XML标签是<selector>, 也是一种Drawable集合, 每个Drawable对应一种状态, 系统会根据View的状态来选择合适的Drawable.
LevelListDrawable对应于<level-list>标签, 也是一种Drawable集合, 集合中的每个Drawable都有一个等级(level)的概念。 根据不同的等级, LevleListDrawable会切换为对应的Drawable.
Drawable Resource 详解(一):BitmapDrawable 介绍
可参考: Drawable家族的前世今生
获取Drawable
1. 从资源文件目录获取图片:
Drawable drawable = ContextCompat.getDrawable(this, R.mipmap.ic_launcher);
给ImageView设置图片, 也是通过转换成Drawable之后,进行设置的。
private void resolveUri() { if (mDrawable != null) { return; } if (getResources() == null) { return; } Drawable d = null; if (mResource != 0) { try { d = mContext.getDrawable(mResource); } catch (Exception e) { Log.w(LOG_TAG, "Unable to find resource: " + mResource, e); // Don't try again. mUri = null; } } else if (mUri != null) { d = getDrawableFromUri(mUri); if (d == null) { Log.w(LOG_TAG, "resolveUri failed on bad bitmap uri: " + mUri); // Don't try again. mUri = null; } } else { return; } updateDrawable(d); }
2. 从本地通过输入流中获取到Drawable
private Drawable getDrawableFromUri(Uri uri) { final String scheme = uri.getScheme(); if (ContentResolver.SCHEME_ANDROID_RESOURCE.equals(scheme)) { try { // Load drawable through Resources, to get the source density information ContentResolver.OpenResourceIdResult r = mContext.getContentResolver().getResourceId(uri); return r.r.getDrawable(r.id, mContext.getTheme()); } catch (Exception e) { Log.w(LOG_TAG, "Unable to open content: " + uri, e); } } else if (ContentResolver.SCHEME_CONTENT.equals(scheme) || ContentResolver.SCHEME_FILE.equals(scheme)) { InputStream stream = null; try { stream = mContext.getContentResolver().openInputStream(uri); return Drawable.createFromResourceStream(sCompatUseCorrectStreamDensity ? getResources() : null, null, stream, null); } catch (Exception e) { Log.w(LOG_TAG, "Unable to open content: " + uri, e); } finally { if (stream != null) { try { stream.close(); } catch (IOException e) { Log.w(LOG_TAG, "Unable to close content: " + uri, e); } } } } else { return Drawable.createFromPath(uri.toString()); } return null; }