精华内容
下载资源
问答
  • 如果您这样做,您可以使用以下方法:假设你的res/drawable文件夹中有picture.png.在您的活动中,您可以在main.xml文件中设置图像资源在FirstActivity中//to retrieve image using id set in xml.String imageString = ...

    newbie..

    18

    您是否在XML文件中声明了图像的ID?如果您这样做,您可以使用以下方法:

    假设你的res/drawable文件夹中有picture.png.

    在您的活动中,您可以在main.xml文件中设置图像资源

    在FirstActivity中

    //to retrieve image using id set in xml.

    String imageString = "imageId"

    int resID = getResources().getIdentifier(imageString , "id", "package.name");

    ImageView image = (ImageView) findViewById(resID);

    imageString是动态名称.之后,您可以获取动态资源的标识符.

    另一种方法,你可以这样做:

    //to retrieve image in res/drawable and set image in ImageView

    String imageName = "picture"

    int resID = getResources().getIdentifier(imageName, "drawable", "package.name");

    ImageView image;

    image.setImageResource(resID );

    您将能够引用您的图像资源并将ImageView设置为它.

    展开全文
  • Android开发笔记(七)初识Drawable

    千次阅读 多人点赞 2015-12-01 17:35:36
    什么Drawable Android把所有显示出来的图形都抽象为Drawable(该单词意思就是“可绘制的”),这里的图形不只是图片,还包括色块、画板、背景等等。android.graphics.drawable源码目录下的drawable有十几种,博主...

    什么是Drawable

    Android把所有显示出来的图形都抽象为Drawable(该单词意思就是“可绘制的”),这里的图形不只是图片,还包括色块、画板、背景等等。android.graphics.drawable源码目录下的drawable有十几种,博主就不一一介绍了,只说说一些常见的用法,以及容易弄错的地方。


    Drawable资源目录

    drawable文件放在res目录的各个drawable目录下,\res\drawable一般放的是描述性的xml文件,图片文件一般放在具体分辨率的drawable目录下。例如
    drawable-ldpi里面主要放低分辨率的图片,如QVGA(240×320)
    drawable-mdpi里面主要放中等分辨率的图片,如HVGA(320×480)
    drawable-hdpi里面主要放高分辨率的图片,如WVGA(480×800),FWVGA(480×854)
    drawable-xhdpi里面主要放加高分辨率的图片,如Nexus(720×1280)以上分辨率
    drawable-xxhdpi里面主要放超高分辨率的图片,如Nexus(1080×1920)以上分辨率

    基本上分辨率每加大一级,宽度和高度就要加大二分之一像素。如果各目录存在同名图片,则Android会根据手机的分辨率来分别适配对应文件夹里的图片。所以在开发APP时,为了兼容不同的手机屏幕,根据需求在不同目录存放不同大小的图片,才能达到最合适的显示效果。

    比如说,我在drawable-hdpi放了一张背景图片bg.png(分辨率480×800),其他目录就没放,使用分辨率480×800的手机查看该APP是没有问题的,但是现在有一台分辨率高的手机如720×1280,在这个高分辨率手机上查看APP,就会发现背景图片有点模糊,原因是Android为了bg.png适配屏幕,把bg.png拉伸到了720×1280,拉伸的后果便是图片糊掉了。



    Drawable的状态

    简单的drawable都是静态的图形,现在我们让它动一下,根据不同的触摸情况来变更图形,这时就要用到Drawable的一个子类StateListDrawable。StateListDrawable是在一个xml文件中定义不同状态下呈现的图像。
    下面是一个例子btn_visit_selector.xml
    <?xml version="1.0" encoding="utf-8"?>
    <selector
      xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_pressed="true" android:drawable="@drawable/common_jia_selected" />
        <item android:drawable="@drawable/common_jia_normal" />
    </selector>

    该xml中关键点是state_pressed,该值为true表示按下时显示common_jia_selected图像,其余情况显示common_jia_normal图像。
    常用的状态位有:
    state_pressed:为true时表示按下,一般用于按钮Button,图形设置于android:background
    state_checked:为true时表示勾选,一般用于单选框RadioButton、复选框CheckBox,图形设置于android:drawableLeft
    state_selected:为true时表示选中,一般用于单选框RadioButton、复选框CheckBox,图形设置于android:background
    state_focused:为true时表示获取焦点,一般用于文本框EditText,图形设置于android:background



    展开全文
  • drawable文件夹详解

    2015-09-12 09:50:42
    最近在看官方training,发现确实是棒,如果英文够好绝对比所有...最近看了How Android Finds the Best-matching Resource这一篇,其中对于drawable的命名规则怎么也没看明白什么意思,这不查了一下分享给大家

    本文参考地址:  http://kunzhong1-yeah-net.iteye.com/blog/2090974

    最近在看官方training,发现确实是棒,如果英文够好绝对比所有教材都好。

    最近看了How Android Finds the Best-matching Resource这一篇,其中对于drawable的命名规则怎么也没看明白什么意思,这不查了一下分享给大家


    -finger 用于触摸屏的设备

    -hdpi 近似于240dpi的高级显示密度的屏幕

    -mdpi 近似于160dpi的中级显示密度的屏幕

    -ldpi 近似于120dpi的低级显示密度的屏幕

    -land 横屏显示

    -port 竖屏显示

    -long 比较长的屏幕,例如WQVGA(432×240), WVGA(800×480), FWVGA(854×480)

     

    图片缩放比列为 3 :4:6:8 ldpi,mdpi,hdip,xhdip

    具体计算方法为:

    ( (size * tdensity) + (sdensity >> 1) ) / sdensity;

    size:长/宽
    sdensity:原图密度;
    tdensity:终端密度;

    drawable-en:英文设置下的图片资料,drawable-zh中文设置下的图片资料。
    若是要为不合像素的手机筹办的话,须要(以drawable-en为例申明)
    :drawable-en-hdpi
    :drawable-en-ldpi
    :drawable-en-mdpi
    同理:为美式英语,
    :drawable-en-rUS-hdpi
    :drawable-en-rUS-ldpi
    :drawable-en-rUS-mdpi
    再错杂一点,为不合标的目标的筹办图片资料
    //竖直
    :drawable-en-rUS-port-hdpi
    :drawable-en-rUS-port-ldpi
    :drawable-en-rUS-port-mdpi
    //横屏
    :drawable-en-rUS-land-hdpi
    :drawable-en-rUS-land-ldpi
    :drawable-en-rUS-land-mdpi

     

    建树这些文件夹是有次序的。即按优先级别分列的,见下表。所以建树文件夹时一般从左到右的分列其优先级别如:drawable-en-rUS-land-mdpi
    如:drawable-en-rUS-port-160dpi-finger-qwerty-dpad-480 x320/

    限制符Qualifier

    &#20540;Values

    移动国度码MCC和移动收集码MNC

    手机设备SIM卡上的移动国度码和移动收集码。比如mcc310-mnc004美国,Verizon品牌); mcc208-mnc00法国,Orange品牌); mcc234-mnc00英国,BT品牌). 
    若是这个设备应用一个无线连接(GSM德律风),则MCC来自SIM卡,而MNC来自该设备将要附着的收集。你有时会仅应用MCC,例如包含特定国度合法资料在您的应用法度中。若是您的应用法度指定了MCC/MNC组合的资料,这些资料仅在MCCMNC都匹配的时辰才干应用。

    说话和区域Languageand region

    两个字母的ISO639-1说话码和ISO3166-1-alpha-2区域码"r"为前缀。比如en-rUS,fr-rFR,es-rES.这个代码是大小写敏感的:说话码是小写字母,国度码是大写字母。你不克不及零丁指定一个区域,然则你可以零丁指定一个说话,比如en,fr, es, zh.

    屏幕标的目标Screenorientation

    纵向,横向,正方形(port,land, square

    屏幕像素密度Screenpixel density

    92dpi,108dpiAndroid选择应用哪个资料时,它对屏幕像素密度的处理惩罚和其它限制符不合。在文章后面描述的步调1Android如何查找最匹配的目次中,屏幕密度总被认为是匹配的。在步调4中,若是被推敲的限制符是屏幕密度,Android将选择在那个地位的最佳匹配,而无需持续步调5

    触摸屏类型Touchscreentype

    非触摸式,触摸笔,手指(notouch,stylus, finger

    键盘可用体式格式Whetherthe keyboard is available to the user

    外在键盘,隐躲键盘,软键盘(keysexposed,keyshidden,keyssoft
    若是你的应用法度有一个特定的资料只能经由过程软件盘应用,则应用keyssoft&#20540;,若是没有keyssoft资料可用(只有keysexposedkeyshidden)并且该设备显示了一个软键盘,那么体系将应用keysexposed资料。

    首选文本输进办法Primarytext input method

    不支撑按键标准键盘,12(nokeys,qwerty, 12key)

    首选非触摸式导航办法Primarynon-touchscreen
    navigation method

    不支撑导航滑板跟踪球滚轮(nonav,dpad, trackball, wheel)

    屏幕辨别率Screendimensions

    320 x240,640 x480, 更大的辨别率必须先被指定。

    SDK版本SDKversion

    设备支撑的SDK版本,比如v3Android1.0SDKv11.1SDKv21.5SDKv3

    小版本(Minorversion)

    你今朝还不克不及指定小版本,它老是被设置为0


    表2.配置限定符名称

    配置 限定符值 说明
    MCC和MNC 例如:
    mcc310
    mcc310-mnc004
    mcc208-mnc00
    MCC是移动国家代码的英文首字母缩写(The mobile country code),它的后面可选择性的跟随来自设备内的SIM卡的移动网络代码(MNC:mobile network code)。如在任何载体上,mcc310代表美国,mcc310-mnc004代表美国的Venizon公司,mcc208-mnc00代表法国的Orange公司。
    如果设备使用音频连接(GSM 电话),那么MCC和MNC的值来自SIM卡。
    也可以单独使用MCC(例如,在应用程序中包含特殊国家合法的资源)。如果仅需要指定语言环境,那么可以使用language和region限定符来替代(稍后讨论)。如果决定要使用MCC和MNC限定符,就要仔细测试,使它能够满足你所期望的工作。
    还可以查看配置域mcc和mnc,它们分别指示了当前的移动国家代码和移动网络代码。
    mcc:http://developer.android.com/reference/android/content/res/Configuration.html#mcc
    mnc:http://developer.android.com/reference/android/content/res/Configuration.html#mnc
    语言和地区 例如:
    en
    fr
    en-rUS
    fr-rFR
    fr-rCA
    语言是用两个字母的ISO 639-1语言代码定义的,紧跟其后的是可选的两个ISO-3166-1-appha-2地区代码字母(前面是小写的“r”)。
    这个编码不区分大小写,r前缀被用于区分地区部分,不能够单独指定地区。
    如果用户改变了系统中的语言设置,那么在应用程序的运行期间也能够改变为对应的语言。
    最小宽度 sw<N>dp
    例如:
    sw320dp
    sw600dp
    sw720dp
    屏幕的基本尺寸,是指最短的可用屏幕区域。具体的说,设备的最小宽度是屏幕可用的宽度和高度中最短的那个(也可以把它看做是屏幕的最小可能的宽度)。这样就可以使用这个限定符来确保应用程序至少有<N>dp的宽度可用于UI界面,而不管屏幕的当前方向。
    例如,如果布局在任何时候都需要至少600dp的最小屏幕尺寸,那么就能够使用这个限定符,在res/layout-sw600dp/目录中创建布局资源。系统只会在可用屏幕的尺寸至少是600dp的时候才会使用这些资源,而不管600dp是否是被用户认知的高度或宽度。最小宽度是设备的固定屏幕尺寸特征,当屏幕的方向发生改变时,设备的最小宽度不改变。
    设备的最小宽度需要考虑屏幕的装饰和系统UI的占用。例如,如果设备有一些固定的UI元素要沿着最小宽度的轴向,占用一定的屏幕空间,那么系统声明的最小宽度要比实际的屏幕尺寸要小,因为被系统占用的像素部分对用户应用程序的UI无效。因此,这个值应该是应用程序布局所需要的最小的实际尺寸(通常,这个值是布局支持的最小宽度,而不管屏幕的当前方向)。
    以下是可以使用的通用屏幕尺寸的一些值:
    1.320,针对以下屏幕配置的设备:
    240x320ldpi(QVGA手持设备)
    320x480mdpi(手持设备)
    480x800hdpi(高分辨率手持设备)
    2.480,针对480x800mdpi的屏幕(平板或手持设备)
    3.600,针对600x1024mdip的屏幕(7英寸平板)
    4.720,针对720x1280mdip的屏幕(10英寸平板)
    当应用程序提供了多个带有不同值的最小宽度限定符资源目录时,系统会使用最接近(不超出)设备最小宽度的那个资源。
    这个限定符被添加在API级别13中。
    还要看android:requiresSmallestWidthDp属性,它声明了与你的应用程序兼容的最小的最小宽度,并且smallestScreenWidthDp配置字段会持有这个设备最小宽度的值。
    可用宽度 w<N>dp
    例如:
    w720dp
    w1024dp
    指定最小的可用屏幕宽度,在资源中应该以dp为单位来定义<N>的值。当方向在横向和纵向之间改变时,这个配置值会跟当前的实际的宽度相匹配。
    当应用程序给这个配置提供了多个不同值的资源目录时,系统会使用最接近(不超过)设备当前屏幕宽度的那个配置。这个值需要考虑屏幕装饰占据的空间,因此,如果设备在显示的左边或右边有一些固定的UI元素,那么使用的宽度值就要比实际的屏幕尺寸小,因为这些固定UI元素的占用,使得应用程序的可用空间减少。
    这个特性被添加在API级别13中
    还要看screenWidthDp配置字段,它持有当前的屏幕宽度。
    可用高度 h<N>dp
    例如:
    h720dp
    h1024dp
    指定最小的可用屏幕高度,在资源中应该以dp为单位来定义<N>的值,当方向在横向和纵向直接改变时,这个配置值应该跟当前的实际高度匹配。
    当应用程序给这个配置提供了不同值的多个资源目录时,系统会使用最接近(不超过)设备当前屏幕高度的那个配置。这个要考虑屏幕装饰的占用情况,因此,如果设备在显示的上方或底部有一些固定的UI元素,那么要使用的高度值要比实际的屏幕尺寸小,因为这些固定UI元素的占用,使得应用程序的可用空间减少。不固定的屏幕装饰(如电话的状态栏能够在全屏时被隐藏)是不考虑的,像标题栏或操作栏这样的窗口装饰也不考虑,因此应用必须准备处理比它们指定的空间要小的情况。
    这个限定符被添加在API级别13中。
    还要看screenHeightDp配置字段,它持有当前屏幕的高度。
    屏幕尺寸 small
    normal
    large
    xlarge
    small:这种屏类似低分辨率的QVGA屏幕。对于小屏的最小布局尺寸大约是320x426dp。例如QVGA低分辨率和VGA高分辨率。
    normal:这种屏类似中等分辨率的HVGA屏幕。对于普通屏幕的最小布局尺寸大约是320x470dp。如,WQVGA低分辨率屏、HVGA中等分辨率屏、WVGA高分辨率屏。
    large:这种屏类似中等分辨率的VGA屏幕,对于大屏幕的最小布局尺寸大约是480x640dp。例如VGA和WVGA的中等分辨率屏。
    xlarge:这种屏被认为比传统的中等分辨率的HVGA屏幕大。针对xlarge屏的最小布局尺寸大约是720x960dp。在大多数情况下,这种超大屏幕的设备因为太大而要放到背包中来携带,而且最有可能的是平板样式的设备。
    注意:使用尺寸限定符不意味着资源仅用于这个尺寸的屏幕。如果没有用限定符提供与当前设备配置相匹配的可选资源,那么系统会使用与配置最接近的资源。
    警告:如果所有使用尺寸限定符的资源都比当前屏幕大,那么系统将不会使用它们,并且应用程序会在运行时崩溃(例如,如果所有的布局都被标记了xlarge限定符,而设备却是一个普通尺寸的屏幕)。
    这个限定符被添加在API级别4以后的版本中。
    屏幕外观 long
    notlong
    long:长屏幕,如WQVGA、WVGA、FWVGA
    notlong:非长屏幕,如QVGA、HVGA、VGA
    这个限定符被添加在API级别4以后的版本中
    这个限定符完全是基于屏幕的外观比率,不相对屏幕的方向。
    还要看screenLayout配置字段,它指示了屏幕是否是长屏。
    屏幕方向 port
    land
    port:纵向设备(垂直)
    land:横向设备(水平)
    如果用户旋转屏幕,这个限定能够在应用程序运行期间改变。
    orientation配置字段指示当前设备的方向。
    泊位模式 car
    desk
    car:设备停靠在汽车中
    desk:设备停靠在书桌中
    这个限定符被添加在API级别8以后的版本中
    如果用户改变了设备的停靠地点,那么能够在应用程序的运行期间改变这个限定。可以使用UiModeManager对象来启用或禁止这种模式。
    夜间模式 night
    notnight
    night:夜间
    notnight:白天
    被添加在API级别8以后的版本中
    如果夜间模式被保留在自动模式中(默认),那么在应用程序运行期间,会基于白天的时间来进行模式的改变。可以使用UiModeManager对象来启用或禁止这种模式。
    屏幕像素密度(dpi) ldpi
    mdpi
    hdpi
    xhdpi
    nodpi
    tvdpi
    ldpi:针对大约120dpi的低分辨率屏幕;
    mdpi:针对大约160dpi的中等分辨率屏幕(在传统的HVGA上);
    hdpi:针对大约240dpi的高分辨率屏幕;
    xhdpi:针对大约320dpi的超高分辨率屏幕,被添加在API基本8以后的版本中;
    nodpi:这个限定被用于不想根据匹配的设备分辨率进行缩放的位图资源。
    tvdpi:在mdpi和hdpi之间的屏幕,大约是213dpi。这种分组不是主要的分辨率,大多数是为电视来考虑的,并且大多数应用不需要它---提供mdpi和hdpi资源就可以满足大多数应用程序需要了,并且系统会适当的缩放它们。这个限定符在API级别13以后被引入。
    四种主要的分辨率之间的缩放比例是:3:4:6:8(忽略tvdpi分辨率),因此一个9x9的ldpi位图,在mdpi中是12x12、在hdpi中是18x18、在xhdpi中是24x24。
    如果感觉在电视或其他某些设备上的图片资源不好看,并且想要试用tvdpi资源,那么缩放因子是1.33*mdpi。例如,一个100px x 100px的mdpi图片的图片应该被放大成133px x 133px的tvdpi图片。
    注意:使用分辨率限定符不意味着资源仅适用与对应分辨率的屏幕。如果没有提供与当前设备配置匹配的可选资源,那么系统会使用最接近的资源。
    触屏类型 notouch
    stylus
    finger
    notouch:非触屏设备
    stylus:有适用手写笔的电阻屏设备
    finger:触屏设备
    touchscreen配置字段,指示到了设备上的触屏类型。
    键盘可用性 keysexposed
    keyshidden
    keyssoft
    keysexposed:设备有可用的键盘。如果设备启用了软键盘,那么即使在硬键盘没有暴露给用户时也可以使用这个限定符。如果没有提供软键盘或者软键盘被禁用,那么只有在硬键盘被暴露给用户时才能够使用这个限定符。
    keyshidden:设备有可用的硬键盘,但是被隐藏了,并且设备没有可用的软键盘。
    keyssoft:设备有可用的软键盘,不管它是否可见。
    如果提供了keysexposed资源,但没有keyssoft资源,那么只要系统有可用的软键盘,系统就会使用keysexposed资源而不管键盘是否可见。
    如果用户打开了硬键盘,就可以在应用程序运行期间改变这个限定。
    hardKeyboardHidden和keyboardHidden配置字段分别指明硬键盘的可见性以及可见的键盘类型(包括软键盘)。
    主要文本输入法 nokeys
    qwerty
    l2key
    nokeys:设备没有用于文本输入的硬键盘;
    qwerty:设备有标准的硬键盘,不管用户是否可见;
    12key:设备有12个键的硬键盘,不管用户是否可见。
    keyboard配置字段指明可用的主要文本输入方法。
    导航键的有效性 navexposed
    navhidden
    navexposed:导航键对用户可用;
    navhidden:导航键不可用。
    如果用户能够看到导航键,那么在应用程序运行时就能够改变这个限定。
    navigationHidden配置字段,指示导航键是否隐藏。
    主要的非触屏导航方法 nonav
    dpad
    trackball
    wheel
    nonav:除了使用触屏以外,设备没有其他导航设施。
    dpad:设备有用于导航的定向板(d-pad)。
    trackball:设备有用于导航的轨迹球。
    wheel:设备有用于导航的定向滚轮(不常见)。
    navigation配置字段指明可用的导航方法类型。
    平台版本(API 级别) 例如:
    v3
    v4
    v7
    设备支持的API级别。如v1代表API级别1(带有Android1.0或更高版的设备),v4代表API级别4(带有Android1.6或更高版本的设备)
    警告:Android1.5和1.6只有在限定符跟平台版本完全匹配时,才能匹配资源

    展开全文
  • 使用简单方便, 编译也方便, 很多大公司都是用的这个库, 最近遇到了一个奇怪的bug, 踩中了UIL的一个坑, 虽然作者有在wiki上提醒我们, 但因为语焉不详, 所以直到我找到bug的出现原因才想明白那句话是什么意思....

    前言

    UniversalImageLoader是一个应用广泛的库, 使用简单方便, 编译也方便, 很多大公司都是用的这个库, 最近遇到了一个奇怪的bug, 踩中了UIL的一个坑, 虽然作者有在wiki上提醒我们, 但因为语焉不详, 所以直到我找到bug的出现原因才想明白那句话是什么意思.

    一个奇怪的bug

    项目里面有一个自绘控件, 是一个下载按钮, 点击之后可以显示当前下载进度, 最近我们发现在一台2.3.7和一台4.2.2上这个按钮显示的图片不正确, 其他手机正常, 但debug后发现按钮的onDraw方法调用是没有问题的. 而图片是res/drawable目录下的.png文件, 照理来说这种图片是不可能读错的.
    通过回滚commit, 定位到一次merge提交, 是从功能开发分支回主线的merge, 仔细review了提交, 发现这次commit根本没有改动按钮的代码, 按钮使用的图片资源也没有被篡改, 我们本地一个一个的提交更改, 发现只要res/drawable目录下新增一个xml文件, 按钮的图片就会错乱, 在所有的xml文件名上增加wtf_前缀, 那两台手机的上bug就消失了, 但其他所有正常的机器又开始出现bug了.
    随后我检查了R.java文件, 里面按钮所使用的图片都具有唯一的id. 反编译安装包, 在smali中出现的id和public.xml里面出现的id一致, 且没有id相同的情况. 我们一度以为是android的bug导致其加载了错误的图片.

    UIL的惊天bug

    之后在看自绘控件onDraw方法时, 我看到他使用了ImageLoader.loadImageSync方法获取他需要使用的图片, 使用的是类似drawable://[R.drawable.picname]这种ImageLoader自己定义的协议, 用于读取res/drawable目录下的非9patch图片, 我问他为什么要这么做, 他说这样可以利用ImageLoader的缓存机制减少读取图片时的文件IO, 嗯, 没问题.
    尽管我相信UIL使用了这么久, 不可能有读取错误图片这么严重的bug存在, 但出于排查bug的目的, 还是对其进行了测试, 测试方法很简单:
    四个ImageView, 两个使用原生apisetImageResource分别加载A图和B图, 另外两个使用ImageLoader.loadImageSync方法分别加载A图B图. 注意这俩图都是在res/drawable目录下的.
    结果令我吃惊, UIL加载的两张图竟然一模一样, UIL是bug的根源.
    那一刻我觉得自己好像发现了UIL一个惊天bug, 恨不得马上给UIL来个pull request. 不过我猜肯定是我们哪里用的不对, 我记得官方wiki上不建议用ImageLoader加载drawable, 建议我们用原生方法, 难道是我们踩到坑了?

    追查UIL

    回去debug, 发现那俩错乱的drawable在存储器上对应两个文件, 应该是ImageLoader缓存在磁盘上的, 我们给它的默认配置就是在内存和磁盘上都缓存图片, 我打开那俩文件, 发现他们是一张图, 我是奇怪怎么会这样.
    仔细看了ImageLoader的源码, 主要看它是如何处理drawable的, 并没有发现会导致它加载错误图片的异常, 只是它会把drawable缓存一份在存储器上, 文件名是用R.drawable.name做MD5算出来的.
    每次要获取一张图片, ImageLoader首先在memorycache中检查有没有这张图, 如果没有再到diskcache中检查, 在diskcache中标识这张图的方法就是对其URI进行MD5运算, 如果diskcache中存在这个文件名对应的文件, 那么就将这个文件decode成一个bitmap给app使用.
    当时我手机上上已经有被缓存的图片了, 我想看看ImageLoader是怎么把两个id对应的图片读成一个的, 清除数据再debug, 意外的是这次读取的图片是正确的. 我又想起我们要求ImageLoader在磁盘上缓存图片……

    我们的锅

    ImageLoader帮我们将图片缓存在磁盘上, 用drawable id的MD5值作文件名. 原来是这样.
    开发android的时候经常遇到R.java不能生成的情况, 这个R.java里记录了很多资源文件的id, 这都是eclipse帮我们做的, 这样android就能通过这些id找到对应的资源. 生成id的顺序是一致的, 所以当我们向res/drawable中添加一个xml文件, 那么drawable生成的id必然会有变化, 某些drawable对应的id会+1, 假如1.0版本A图的id是0x00000001, B图的id是0x00000002, 我们在2.0版本添加一个C图, 那么有可能之后生成的id为 A图0x00000002, B图0x00000003.
    假如我们忽略MD5过程, 直接认为ImageLoader使用id做文件名(原理上一样, 只不过用MD5更好), 使用过1.0版本的手机, diskcache上已经有了0x00000001.png(1.0版本A图)0x00000002.png(1.0版本B图)两个文件, 升级到2.0版本, app用ImageLoader加载A图时, 会用A图的最新id 0x00000002来查找, 此时磁盘上恰好有0x00000002.png(1.0版本B图), 于是ImageLoader就将B图加载到内存了, 于是bug就出现了.

    规避方法

    推荐: 在使用ImageLoader加载res/drawable时务必将cacheOnDisk设为false.
    当然你也可以修改UniversalImageLoader的源码, 毕竟drawable本身可以理解为在磁盘上有永久缓存的资源, 在遇到此类资源时, 如果memorycache中没有, 直接通过系统api请求, 而非读取自己管理的diskcache, 当然这种做法就会使代码显得有些不通用了, 不建议这么改.

    展开全文
  • android Drawable.mutate()的使用

    千次阅读 2018-03-27 08:32:03
    最近,我看到一个自定义控件里用到了Drawable的mutate(),但是自己不知道是什么意思,于是在网上查找了资料,最终解决了问题。这里记录一下。 摘录android的官方注释 /** * Make this drawable mutable...
  • 当我们在粘贴一张图片到AS的drawable目录下的时候,不知道你有没有注意到会让你选择具体的分辨率的文件夹.前段时间在写一个自绘VIew的时候用到了这个方法,发现返回值并不是...其效果就是mdpi,不知道老外什么意思........
  • 安卓学习 Drawable对象

    2015-06-09 20:27:00
    whie(!images[currentImage].endWith(".PNG")&&...这是什么意思啊? 要考我离散数学? 来试一试,,不对 while(!images[currentImage].endsWith(".png")&&!images[currentI...
  • clip_vertical文档上的意思是“裁剪子元素的上边界和/或下边界到容器的边界。top gravity会裁剪下边缘,bottom gravity会裁剪上边缘”。但是好像没什么效果啊 xmlns:android=...
  • getWindow().setBackgroundDrawableResource(R.drawable.splash_image); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_...
  • 我检查了一下没发现有什么错的。然后又一个标签一个标签的检查,也没发现错的。 后来才注意到最后面的正则表达式:意思是 文件名必须是"小写字母","0~9"的数字,下划线" —" 和"." [2011-04-07 22:24:57 - ...
  • 我想以一种灵活的方式显示评级星星,意思是使用wrap_content 高度,或者至少是dp,并且最好垂直居中,但是他们总是在顶部显示,剩余的空间充满了垂直线。 ![CSDN移动问答][1] [1]: ...
  •  首先,观察新建的项目res文件夹,大家估计都能找到drawable文件夹有很多个,如drawable-hdpi、drawable-ldpi、drawable-mdpi、drawable-xhdpi,这些文件夹是谷歌公司为屏幕自适应做的准备,意思说各位朋友在做屏幕...
  • public static final class drawable { public static final int icon=0x7f020000; 在HelloWorld中R.java中的这句是什么意思,什么作用啊,最后那个数字代表的什么!? 谢谢了!
  • Android 中dip,px,dp

    千次阅读 2011-11-02 15:26:23
    dip 是什么东西? 英文表达为device independent pixels.就是设备独立像素的意思。 不同的设备会有不同的显示效果。我们知道android 工程里有 drawable-hdpi、drawable-mdpi、drawable-ldpi. 之所以设置这3个默认的...
  • edit边框的设置

    2018-10-04 12:19:08
    layer-list 是什么意思? 百度了一下,顺便添加自己的理解,layer 是层,list 是列表,那么 layer-list 就是层列表的意思。但是,是什么层列表呢?其实 layer-list 是用来创建 LayerDrawable 的,LayerDrawable 是 ...
  • window.setBackgroundDrawable(new BitmapDrawable()); window.setAnimationStyle(R.style.PopAnimation);...pop窗口对象调用这三个方法是做什么用的呢,最好解释下里面的参数什么意思,怎么用,谢了
  • 简介参考layer-list 是啥简单理解,layer 是层,list 是列表,那么 layer-list 就是层列表的意思。但是,是什么层列表呢? 其实 layer-list 是用来创建 LayerDrawable 的,LayerDrawable 是 DrawableResource 的一种...
  • 总结:build工程时,message里有报错提示,但看不明白什么意思。可以到gradle console窗口里看详细信息。 /home/wangpan/workspaceeclipsenew/AndroidBaseDemo/AndroidManifest.xml:19:9-45 Error: Attribute ...
  • 1.常用的xml属性 XML属性 ...看不懂什么意思,这个是网上的解释 设置为False将阻止该布局管理器于他的子元素基线对其 android:divider setDividerDrawable(Drawable divider) ...
  • selector的介绍

    2016-04-12 23:10:26
    什么是Selector Selector就是背景选择器的意思。 它可以为一个控件定义不同状态下的背景图或者背景色。 比如某个控件默认有个背景图,获取焦点是另外一个背景,按下时又可以定义另一个背景。 该如何定义...
  • 报错如下: Error:Failed to run command: D:\Program Files\Android\android-sdk\build-tools\20.0.0\aapt.exe s -i C:\... 是什么意思?我删掉build文件夹,重新发布,依旧报这个错 哪位大神好心指导一下。。。
  • 在写布局文件的时候,我们经常用到@符号去引用资源,比如:@color/white @string/title_text @drawable/button_selector @mipmap/icon_launch ...,这是什么意思呢? 原来?一般是用来引用一个attr属性的,例
  • layer-list简介: 简单理解,layer 是层,list 是列表,那么 layer-list 就是层列表的意思。但是,是什么层列表呢? 其实 layer-list 是用来创建 LayerDrawable 的,LayerDrawable 是 DrawableResource...
  • layer-list -- layer-list的基本使用介绍

    万次阅读 多人点赞 2016-12-06 12:56:06
    1. layer-list 是啥?有啥作用?... layer-list 是啥?简单理解,layer 是层,list 是列表,那么 layer-list 就是层列表的... 其实 layer-list 是用来创建 LayerDrawable 的,LayerDrawable 是 DrawableResource 的一种,
  • layer-list的基本使用介绍

    千次阅读 2018-01-19 10:07:17
    1. layer-list 是啥?...简单理解,layer 是层,list 是列表,那么 layer-list 就是层列表的意思。但是,是什么层列表呢?? 其实 layer-list 是用来创建 LayerDrawable 的,LayerDrawable 是 DrawableResource 的一种
  • Android LayerList详解

    2018-05-07 14:23:09
    1. layer-list 是啥?有啥作用?... layer-list 是啥?简单理解,layer 是层,list 是列表,那么 layer-list 就是层列表的... 其实 layer-list 是用来创建 LayerDrawable 的,LayerDrawable 是 DrawableResource 的一种...
  • AS3语言:BitmapData类介绍

    千次阅读 2011-12-28 09:16:43
    Bitmapdata继承Object对象,实现IBitmapDrawable接口,这个接口有什么用,你可以理解为Drawable,能被画。官方介绍是:IBitmapDrawable 接口由可作为 BitmapData 类draw()方法的source参数传递的对象来实现。 这些...

空空如也

空空如也

1 2 3
收藏数 43
精华内容 17
关键字:

drawable什么意思