• 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;
        }
  • 相关阅读:
    初步使用redis
    redis配置文件介绍
    windows64位 redis安装 步骤
    敏感词过滤算法
    SpringBoot使用拦截器无效
    linux常用命令
    automation(一)
    JAVA的接口多态
    JAVA的多态(强制转换)
    JAVA的多态
  • 原文地址:https://www.cnblogs.com/huyang011/p/7667009.html
Copyright © 2020-2023  润新知