• 傲娇Android二三事之诡诡异异的图片加载


    话说春天就像装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

  • 相关阅读:
    Fiddler抓包使用教程-会话图标
    Fiddler抓包使用教程-安装配置
    Fiddler抓包使用教程-扫盲篇
    Java web 开发填坑记 2 -如何正确的创建一个Java Web 项目
    Java Web 开发填坑记- 如何正确的下载 Eclipse
    Android 监听 WiFi 开关状态
    Android 获取系统语言(兼容7.0)
    Android 监听手机GPS打开状态
    Android Monkey的使用
    Android 开源库和项目 3
  • 原文地址:https://www.cnblogs.com/andreitang/p/Display_image.html
Copyright © 2020-2023  润新知