zoukankan      html  css  js  c++  java
  • Android中的dp,px以及wrap_content的实际展示效果

    因为一个效果中的图片设置了wrap_content的属性,但在720dp跟540dp上面显示不一致使老大非常恼火。跟他讲也讲不明白。于是乎让我们彼此测试来探个究竟。首先测试的是个图片:

    它的物理像素是256*256的。

    首先是个简单的测试布局,一个textview显示测试结果,一个imageview用来展示这张图片。

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <TextView
            android:id="@+id/test"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="top|center_horizontal"
            android:textColor="#009933"
            android:textSize="20sp" />
    
        <ImageView
            android:id="@+id/test_iv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="top|center_horizontal"
            android:background="@drawable/origami_colored_pencil_02" />
    
    </LinearLayout>
    

    首次测试时的宽高属性均为wrap_content,测试结果如下:

    可以看到,测试手机为nexus 5,屏幕密度为3.0,屏幕dp分辨率为360*592。图片的物理分辨率为256*256,而显示后的宽高为768*768,可见是物理分辨率乘以密度的结果。

    而将布局文件中的宽高属性都设为256dp之后,测试结果如下图:

    是的,你没有看错,跟属性均为wrap_content时的测试结果是一致的。由此可以看出,在将imageview的宽高设置为wrap_content时,系统实际上是将背景图片的实际物理分辨率以dp单位的形式来展现出来的。而显示的图片转化成bitmap之后获取的width跟height实际上是在手机设备屏幕的物理分辨率。这点有点意思~

    然后更有意思的在下面:

    接着将imageview的宽高属性都设置为fill_parent,此时的测试结果如下:

    在将imageview的属性宽设为fill_parent,高设为wrap_content后,测试结果如下:

    想到这种结果没有?对的,是获取的bitmap大小依然为768*768!!!可见系统虽然将图片的显示变了样子但其大小依然没有发生变化,是其物理属性的大小乘以屏幕密度所的大小!

    虽然亲眼看到出现这样的情况,但本人其实并不太明白这其中究竟是怎么回事,希望看到这篇博客的同行,了解其中原理的,能给个使人信服的解释。

    祝好!

    Ps:本人手机是LG Nexus 5,系统4.4.2,网站上介绍其屏幕物理分辨率为1920*1080,但实际上只有1776*1080,唉,最讨厌前台销售人员了,尽是忽悠~

    下面是两个测试文件:

    package com.peter.androidoverridedtest;
    
    import com.peter.androidoverridedtest.util.DensityManager;
    
    import android.app.Activity;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.drawable.BitmapDrawable;
    import android.os.Bundle;
    import android.util.DisplayMetrics;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    public class TestActivity extends Activity {
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		// TODO Auto-generated method stub
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.test);
    		ImageView iv = (ImageView) findViewById(R.id.test_iv);
    		BitmapDrawable bd=(BitmapDrawable) iv.getBackground();
    		Bitmap b=bd.getBitmap();
    		TextView tv = (TextView) findViewById(R.id.test);
    		DisplayMetrics dm = new DisplayMetrics();
    		getWindowManager().getDefaultDisplay().getMetrics(dm);
    		int width = dm.widthPixels;
    		int height = dm.heightPixels;
    		int widthdp=DensityManager.px2dip(this, width);
    		int heightdp=DensityManager.px2dip(this, height);
    		tv.setText("屏幕密度:"+getResources().getDisplayMetrics().density+"
    屏幕dp:  "+widthdp+"*"+heightdp+"" +
    				"
    屏幕像素:"+width+"x"+height+"" +
    						"
    原始像素:256*256
    测试显示:" + b.getWidth() + "*" + b.getHeight());
    	}
    }
    
    package com.peter.androidoverridedtest.util;
    
    import android.content.Context;
    import android.util.DisplayMetrics;
    
    /**
     * @class: DensityManager
     * @Description: TODO
     * @author: Peter Pan
     * @email: happychinapc@gmail.com
     * @date: 2014-1-10 上午10:31:09
     * @since: 1.0.0
     *
     */
    public class DensityManager {
    	/**
    	 * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
    	 */
    	public static int dip2px(Context context, float dpValue) {
    		final float scale = context.getResources().getDisplayMetrics().density;
    		return (int) (dpValue * scale + 0.5f);
    	}
    
    	/**
    	 * 根据手机的分辨率从 px(像素) 的单位 转成为 dp
    	 */
    	public static int px2dip(Context context, float pxValue) {
    		final float scale = context.getResources().getDisplayMetrics().density;
    		return (int) (pxValue / scale + 0.5f);
    	}
    }
    

      

    谢谢打赏!
    您的支持就是我的最大动力!


    支付宝

    微信


    Just remember: Half is worse than none at all.

    本文是由SilentKnight诚意发布, 欢迎转载! 但转载请注明出处: 【SilentKnight】
    如果觉得还有帮助的话,可以点一下右下角的【推荐】,希望能够持续的为大家带来更好的技术文章!
    想跟我一起进步么?那就【关注】我吧

    如果,想给予我更多的鼓励,求打

  • 相关阅读:
    Linux下截图工具
    Vue学习——router路由的实现原理
    Vue学习——vue的双向数据绑定原理
    JavaScript学习——面向对象(一)——创建对象(工厂模式和构造器模式)
    子组件给父组件的传值
    Vue组件
    JavaScript学习——事件对象Event
    JavaScript学习——事件处理程序
    JavaScript技巧——轮播图
    javascript——let关键字
  • 原文地址:https://www.cnblogs.com/littlepanpc/p/3513929.html
Copyright © 2011-2022 走看看