傲嬌Android二三事之詭詭異異的圖片載入

來源:互聯網
上載者:User

話說春天就像裝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

                 
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.