drawable介绍

 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家族的前世今生

 Android中的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;
    }
原文地址:https://www.cnblogs.com/huyang011/p/7667009.html