话说春天就像装B人的脸,一会儿晴来一会儿雨。昨儿还是雨天,今天就放晴了。迎面阵阵微风吹来,听着阿牛哥的桃花朵朵开,不禁想起了某南宋文艺高富帅的约炮口号:"腰缠十万贯,骑鹤下扬州"。想到这贫道一阵鄙视,“当自己是种人吗,要泡遍整个扬州城?”再翻翻自己的皮夹子,虽然只有10元钱骑鹤去扬州是不行了,但是骑车吃碗白粥还是可以的。正当贫道起身准备进膳时,长相猥琐,貌比如花的QA大叔,唱着上学歌,一路蹦了过来。如果说上次那个图片在屏幕不同位置,图片尺寸不同是个奇迹,那么这次的就是个灵异事件了。在贫道测试平板上显示正常的图片(见图1),在Qa的平板上只显示了图片的中间部分(见图2)。此刻贫道突然有一种下一刻,贞子MM会从屏幕里爬出来的感觉。为了能检测到问题所在,贫道冒着贞子MM会爬出来的危险,强行把Qa的平板扣留了下来。
图1 图2
贫道迅速写了个测试代码,由于ImageView的大小是200x200像素,所设的图片也是200x200像素,正确的话应该是图能正好完全显示。
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <ImageView android:id="@+id/img" android:layout_width="200px" android:layout_height="200px" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:scaleType="center" /> </RelativeLayout>
MainActivity.java
package com.example.testimg; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.widget.ImageView; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ImageView imv = (ImageView)this.findViewById(R.id.img); imv.setImageResource(R.drawable.emp); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true; } }
测试程序在贫道的平板上还是没有问题,然后又在Qa的平板上运行了一下。这个每篇必出现的"但是"君,又是如约而至。图片真的只显示了一部分。贫道看了看自己的杂牌平板,又看了看Qa高贵冷艳的Nexus 7,难道Android也搞品牌歧视。高贵的看不上杂牌的?不是Android所在的希望国号称人人平等吗?看来平等不平等,只有贫道亲自去看一看了,当然希望国是去不了的,但调试到程序里看看还是可以的。
既然是图片显示不完整,说明ImageView控件或者加载图片的大小出了问题,所以贫道添加了获取ImageView和图片大小的代码。
MainActivity.java
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ImageView imv = (ImageView)this.findViewById(R.id.img); int w1 = imv.getWidth(); int h1 = imv.getHeight(); Bitmap img = BitmapFactory.decodeResource(this.getResources(),R.drawable.emp); int w2 = img.getWidth(); int h2 = img.getHeight(); imv.setImageBitmap(img); }
按下调试按钮后,只见图片的Width和Height都变成了266,而不是图片本身的大小(见图3)。希望国名为平等,实乃霸权的丑恶嘴脸再一次显现无疑。此时的天空又下起了阵阵细雨,仿佛是傻大木,卡上校内牛满面的泪水。
图3
是继续揭露其伪平等的黑幕吗?想到武装到牙齿的王师,贫道不禁打了个冷战,想可耻的匿了。就在这时太祖那抑扬顿挫的声音在贫道脑海中响起:"美帝国主义都是纸老虎"。远处天雷滚滚,而此时的贫道心中一种使命感油然而生,心中顿时出现了希曼那伟岸的身影,不禁间手握窗边的避雷针高喊道:"春哥,赐予我力量吧。"刹那间贫道浑身上下牛B闪闪,是在渡劫飞升吗?答案自然是否定的,只不过是电流经过人肉电阻产生的发热发光的自然现象。与此同时,一张写着篆字的黄色字条,缓缓飘落,只见上面写着:"安卓不决问谷歌,解铃还须系铃人。"
看到这,贫道不禁想起了,几天前参加了一个Google赞助的水陆大法会,会上碰巧一位道友在宣讲了一个关于Android UI布局的法事。在宣讲的过程中,很神奇的演示了下在不同分辨率下,界面的布局做到了一致性,没有因为分辨率的变化而导致控件大小和位置显示不同。待贫道想问个究竟时,此道友却洒下一大把所谓的讲义,然后得道飞升了。在一片众人羡慕的眼光中,贫道一阵黑线,难道开发Android也能攒飞升经验值。望着满天飞舞的讲义,贫道伸手抓了一张,只见在擦屁股都嫌硬的纸上,用老军医体歪歪扭扭的印着几个google专有网址。贫道很不屑的塞到了包里,就当草稿纸了。
拿出那张已经皱巴巴的讲义,点开了其中的一个链接。只见上面写道,Android为了能让程序适应不同平板的分辨率,以dpi为标准将平板分成了四个档次。dpi者,屏幕密度也。一英寸160个像素被称为中密度屏幕,也称基准密度屏幕(mdpi),低于此标准的为ldpi,高于此标准的为hdpi,再高的就为xhdpi。与此同时在res目录下生成了四个对等的目录(drawable-hdp,drawable-ldpi,drawable-mdpi,drawable-xhdpi)标准如下:
xhdpi:~320dpi
hdpi: ~240dpi
mdpi:~160dpi
ldpi:~120dpi
此时贫道恍然大悟,原来贫道的平板是中密度屏幕属于发展中国家水平,而QA的Nexus 7已经是高密度屏幕, 已达到发达国家水平。看来号称人类希望的米国,不仅不平等,还嫌贫爱富,为富不仁啊。 更令人发指的是,程序就是根据dpi从不同的目录里寻找相关的资源,如果在本目录里寻找不到,就会到其他的目录里寻找。找到后,并不是按照原来的大小载入图片,而是根据当前屏幕dpi/找到图片的目录所对应的dpi来确定图片的大小。以本文为例,Nexus 7的dpi为208dpi属于hdpi,如果图片只放在了drawable-mdpi中而没有放到drawable-hdpi里。这样当程序运行在Nexus 7上时,图片的width和height就为原图片的208/160倍,也就是1.3倍左右。贫道检查了下测试程序,果然只在drawable-mdpi目录里存放了图片,而在drawable-hdpi里没有存放,这就是造成为啥图片的width和height是266px的原因,因为被放大了1.3倍。
看到这贫道心中一片悲凉,原来在Android的世界中,高端人士也是拿着屌丝们的资源任意操作,造成系数膨胀,导致灾难的发生。贫道不禁仰天长叹,一生为之奋斗的清平世界何时才能重返人间。此时的贫道陷入了深深的沉思中。
<<上一篇: 傲娇Android二三事之古古怪怪的Margin