Android drawable资源源码分析

本文深入探讨了Android中图片资源的处理,特别是Drawable资源。通过源码分析,揭示了资源读取的过程,包括对ColoredDrawable和其他Drawable类型的区分,以及系统进程的缓存策略。Drawable利用ConstantState进行缓存,并通过mutate()方法实现可变性,确保在修改属性时能生成独立的对象。此外,还关注了BitmapFactory.decodeBitmap()方法中实用参数的应用。
摘要由CSDN通过智能技术生成

这篇小文主要是介绍图片资源的处理,其他类型资源 读取大同小异。

这部分的源码各版本之间略有不同,但获取图片资源整体流程相似。首先获取TypedValue属性加锁保护起来了,应该是支持异步调用(有待研究)。主要区分colordrawable和其他类型drawable。系统进程读取的资源缓存策略也不一样,跟着源码走走,脉络还是很清晰。

    
    @Nullable
    public Drawable getDrawable(@DrawableRes int id, @Nullable Theme theme) throws NotFoundException {
        TypedValue value;
        synchronized (mAccessLock) {
            value = mTmpValue;
            if (value == null) {
                value = new TypedValue();
            } else {
                mTmpValue = null;
            }
            //获得该资源ID所对应的资源值,并且保存在类型为TypedValue的变量value
            getValue(id, value, true);
        }
        final Drawable res = loadDrawable(value, id, theme);
        synchronized (mAccessLock) {
            if (mTmpValue == null) {
                mTmpValue = value;
            }
        }
        return res;
    }



    @Nullable
    Drawable loadDrawable(TypedValue value, int id, Theme theme) throws NotFoundException {
        if (TRACE_FOR_PRELOAD) {
            // Log only framework resources
            //id小于0x1000 0000时表示访问系统资源
            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;
        if (value.type >= TypedValue.TYPE_FIRST_COLOR_INT
                && value.type <= TypedValue.TYPE_LAST_COLOR_INT) {
            isColorDrawable = true;
            caches = mColorDrawableCache;
            key = va
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值