getDrawable的流程

本文探讨了Android系统中drawable从XML中加载的过程,详细分析了从`resource.java`的`getDrawable`方法开始的加载流程,包括`loadDrawable`、`loadDrawableForCookie`以及不同`inflateFromTag`方法的作用。在加载过程中,drawable通过XML属性生成不同类型的drawable,并利用文件名作为缓存键。文章还提及了`createFromXml`和`createFromXmlInnerForDensity`等关键步骤,揭示了Android在处理drawable时的优化策略。
摘要由CSDN通过智能技术生成

最近需要研究下drawable是如何从xml中倒入的,Android系统加载过程中是否有什么优化和优秀的点可以了解下,所以看了下相关的源码
首先大概的流程图如下:
从resource.java的getDrawable方法开始看起
drawable通过xml生成的主要流程
这里我们重点查看第三个流程的loadDrawable方法以及loadDrawableForCookie方法以及生成想对应的drawable的inflateFromTag方法。
总结起来,drawable 在加载的过程中会通过xml的属性生成对应的例如shapeDrawable等不同类型的drawable,同时通过文件名作为key值做缓冲。

@Nullable
    Drawable loadDrawable(@NonNull Resources wrapper, @NonNull TypedValue value, int id,
            int density, @Nullable Resources.Theme theme)
            throws NotFoundException {
        // If the drawable's XML lives in our current density qualifier,
        // it's okay to use a scaled version from the cache. Otherwise, we
        // need to actually load the drawable from XML.
        //若是图片的需要的分辨率和当前设备的分辨率相同,那么就用可以使用缓冲?
        final boolean useCache = density == 0 || value.density == mMetrics.densityDpi;

        // Pretend the requested density is actually the display density. If
        // the drawable returned is not the requested density, then force it
        // to be scaled later by dividing its density by the ratio of
        // requested density to actual device density. Drawables that have
        // undefined density or no density don't need to be handled here.
        //若是drawable没有设定分辨率,这里不用走,若是设定了分辨率,若是drawable设定了分辨率,并且图片的分辨率和想要的分辨率是一样的,那么就将图片的分辨率设置为设备的分辨率,若是不 一样,那么就要进行缩放,我理解的是这里若是在2x的分辨率手机上想要3x的图片,并且图片正好也是3x的图片,那么就只能给设备的分辨率的图片,也就是屏幕2x,给不了3x;若是图片不是3x,而是2x,那么就要进行缩放,也就是原图片分辨率的2x/3x质量??? 为什么这么算呢?
        if (density > 0 && value.density > 0 && value.density != TypedValue.DENSITY_NONE) {
            if (value.density == density) {
                value.density = mMetrics.densityDpi;
            } else {
                value.density = (value.density * mMetrics.densityDpi) / density;
            }
        }

        try {
            if (TRACE_FOR_PRELOAD) {
                // Log only framework resources
                if ((id >>> 24) == 0x1) {
                    final String name = getResourceName(id);
                    if (name != null) {
                        Log.d("PreloadDrawable", name);
                    }
                }
            }

            final boolean isColorDrawable;
            final DrawableCache caches;
            final long key;
            //判断背景是否是纯颜色,若是背景是纯颜色的&#x
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值