話說春天就像裝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,解鈴還須繫鈴人。"
看到這,貧道不禁想起了,幾天前參加了一個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