Android中的不同drawable文件夹所带来的思考

来源:互联网 发布:阿里云服务器怎样使用 编辑:程序博客网 时间:2024/05/17 03:10


今天模拟手Q的发送图片界面做一个toolBar,布局如下:

    <RelativeLayout    android:id="@+id/tool_bar"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:background="@drawable/photo_select_bottom_bg"    android:layout_alignParentBottom="true" >    <Button        android:id="@+id/preview_btn"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginLeft="15dp"        android:layout_alignParentLeft="true"        android:layout_centerVertical="true"        android:text="@string/preview"        android:textColor="@color/photopreview_btn_text"        android:textSize="14dp"        android:paddingLeft="15dp"        android:paddingRight="15dp"        android:background="@drawable/photopreview_bottom_left_btn_selector" />    <Button        android:id="@+id/magic_stick"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_centerInParent="true"        android:layout_centerVertical="true"        android:background="@drawable/pic_icon_edit" />    <Button        android:id="@+id/send_btn"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginRight="15dp"        android:layout_centerVertical="true"        android:layout_alignParentRight="true"        android:text="@string/photo_send"         android:textColor="@color/photopreview_btn_text"        android:textSize="14dp"        android:paddingLeft="15dp"        android:paddingRight="15dp"        android:background="@drawable/photo_select_preview_btn" /></RelativeLayout>

所有的元素都设置了一个backgroundDrawable,但是运行后得出的界面非常奇怪,

仔细检查了各项设置参数,均正常,无奈之下各种求助google,度娘,终于解决,现记录笔记如下:

相关知识


  • dip

device independent pixels(设备独立像素),与屏幕密度无关的像素,这是一个基于屏幕物理的抽象单位。密度可以理解为每英寸所包含的像素个数,而1dp实际上相当于160dpi(即密度)上的一个点,也就是说,当密度为160时,1dp和1px是等价的。由于android手机的分辨率千差万别,为了让同一个高度/宽度值在不同分辨率的手机上看上去一致,android官方推出了dip的概念。

  • dip和px之间的区别和联系

dp和px的转换公式为px=dip*(density/160)。px就是像素,打个比方,要画一条240px的横线,在480宽的屏幕上看是1半屏款,而在320宽的屏幕上看是2/3(同一个尺寸的屏幕)。而画一条160dip的横线,无论在320还是480宽的屏幕上,长度都是一样的。

  • 关于density

上面给出了dip和px之间的转化公式,其中涉及到了density,注意,这里的density并非设备实际的density,而是归一化后的density。google将所有的设备分为四种120(low),160(medium),240(high),320(xhigh)。可以使用getResources().getDisplayMetrics().densityDpi查看自己设备的dpi。依照这四种dpi,android4.0时代,新建android工程,会自动生成drawable,drawalbe-ldpi,drawable-mdpi,drawable-hdpi,drawable-xhdpi五个目录,系统会根据设备dpi的大小区相应的文件夹拉取相应的资源文件。

得出结论


根据上面的知识,终于发现了问题所在,我的手机屏幕分辨率是240,因此,图片文件应该放在drawable-xhdpi下,但是我却错误的将文件放在了drawable-mdpi,这里又涉及到了几个问题,当资源文件放在了错误的文件夹下,会造成什么样的影响呢,这么多资源文件夹,系统到底是按照什么顺序来加载呢?通过各种资料查询加上试验,终于得出结论如下:

  1. 当图片资源放在了错误的资源文件夹下时,图片会根据相应dpi做缩放,拿本例来说,图片原始大小高度95,当将其放在了drawable-mdpi下时,会通过下列公式计算出大致新的高度95*(240/160) = 142,等于说是在纵向拉伸了图片,这就是为什么我们在上图中看到的元素都大了一号,其实是被背景图给撑大的。

  2. 加载顺序。如果我在drawable-(xdpi,hdpi,mdpi,ldpi)以及drawable这几个文件夹下放置同一个图片,那么系统是按照什么顺序来加载的呢。其实它会先到对应dpi的文件夹下找,找不到就会往比自己高的dpi文件夹下找,然后才会往比自己低的dpi文件夹下找。

至此,问题解决,正常界面:


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 年龄改了学籍怎么办 结婚证信息错误怎么办 六级身份证过期怎么办 身份号泄露了怎么办 身体证信息泄露怎么办 手机号被泄漏了怎么办 姓名和电话泄露怎么办 个人身份证信息泄露怎么办 身份号码泄露了怎么办 我身份证泄露了怎么办 身份证信息泄漏了怎么办 无锡身份证丢了怎么办 人在外地怎么办身份证 欠空放公司不还怎么办 兼职要身份证照片怎么办 身份证刷不了磁怎么办 身份证不能刷了怎么办 身份证指纹错了怎么办 指纹手机丢了怎么办 异地办理临时身份证怎么办 杭州办理外地身份证怎么办 办理身份证没有户口本怎么办 2018身份证掉了怎么办 双户口注销社保怎么办 常用户口被注销怎么办 刚到厦门怎么办身份证 新疆身份证丢了怎么办 技能证书丢了怎么办 16岁拍身份证怎么办 16岁以下怎么办身份证 办身份证要证明怎么办 15岁怎么办银行卡淘宝 满16岁怎么办银行卡 电脑最小化后不见了怎么办 满16周岁怎么办银行卡 给儿童办身份证怎么办 当兵前身份证号码不符怎么办 身份证后六位密码x怎么办 借了贷款人死了怎么办 贷款实在还不起怎么办 个人贷款还不起怎么办