因为一个效果中的图片设置了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+"\n屏幕dp: "+widthdp+"*"+heightdp+"" +
"\n屏幕像素:"+width+"x"+height+"" +
"\n原始像素:256*256\n测试显示:" + 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);
}
}

  

Android中的dp,px以及wrap_content的实际展示效果的更多相关文章

  1. Android中dip, dp, px,pt, sp之间的区别:

    Android中dip.dp.sp.pt和px的区别   1.概述 过去,程序员通常以像素为单位设计计算机用户界面.例如:图片大小为80×32像素.这样处理的问题在于,如果在一个每英寸点数(dpi)更 ...

  2. Android中的dp, px, pt

    定义: px是像素,表示屏幕显示的最小元素单位 pt是磅数,一磅等于1/72英寸,一般用来作为字体的单位使用 问题: px和pt不使用于手机,因为同样的px在高低分辨率的手机上显示的比例不同 解决办法 ...

  3. 【转】Android中dip(dp)与px之间单位转换

    Android中dip(dp)与px之间单位转换 dp这个单位可能对web开发的人比较陌生,因为一般都是使用px(像素)但是,现在在开始android应用和游戏后,基本上都转换成用dp作用为单位了,因 ...

  4. Android中sp和px之间关系探究

    记得当时在刚接触Android时都在说不要用px,要用sp,所以在实际工作当中当然就按照这个规则,所以都要将px换算成sp,而我在实际工作中的换算规则是dp=px * 1.5,而且用这种规则到现在基本 ...

  5. Android中使用ImageViewSwitcher实现图片切换轮播导航效果

    前面写过了使用ViewFlipper和ViewPager实现屏幕中视图切换的效果(ViewPager未实现轮播)附链接: Android中使用ViewFlipper实现屏幕切换 Android中使用V ...

  6. Android中TextView不获取焦点可以实现跑马灯的效果

    之前在网上找了很多关于TextView的跑马灯效果实现的例子,实现起来都存在一些问题,例如一种是完全重画一个跑马灯,还有就是只设置TextView的相关属性使其具有跑马灯的效果,总的来说这两种方法都是 ...

  7. android中选择控件与选择界面自然过度效果的实现--一种新的交互设计

    转载请标明出处: http://blog.csdn.net/jianghejie123/article/details/40648931 在安卓中经常遇到须要选择一个东西的功能,比方选择日期.选择文件 ...

  8. android中通过自定义xml实现你需要的shape效果 xml属性配置

    在Android开发过程中,经常需要改变控件的默认样式, 那么通常会使用多个图片来解决.不过这种方式可能需要多个图片,比如一个按钮,需要点击时的式样图片,默认的式样图片,然后在写一个selector的 ...

  9. Android中常用单位dp,px,sp之间的相互转换

    MainActivity如下: package cc.testunitswitch; import android.os.Bundle; import android.util.DisplayMetr ...

随机推荐

  1. ZOJ3605-Find the Marble(可能性DP)

    Find the Marble Time Limit: 2 Seconds      Memory Limit: 65536 KB Alice and Bob are playing a game. ...

  2. SRM 587 Div II L3:ThreeColorabilityEasyy

    题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=12699 这道题目是第一次在比赛的时候做出来的,开始还想用bru ...

  3. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(21)-用户角色权限基本的实现说明

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(21)-用户角色权限基本的实现说明     ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框 ...

  4. WPF 辅助开发工具

    原文:WPF 辅助开发工具 以下介绍的工具均为免费版,有些是源代码开放,希望对大家有用. Kaxaml 轻量级XAML 编辑器,可以同时进行图像和XAML 代码的编辑.最终生成开发人员想要的XAML ...

  5. javascript权威指南(6) - 对象

    JavaScript对象可以从一个称为原型的对象继承属性,这种"原型式继承"(prototypal inheritance)是JavaScript的核心特征.除了字符串.数字.tr ...

  6. F4107Usart数据处理程序

    解决:Cortex-M4上,usart自己主动发送数据计划. 1. usart快速突破.数据还没有被处理.usart中断会把盖掉的数据不被处理. 数据丢失. 2.此过程需要main处理4一个usart ...

  7. MVC使用Bootstrap

    ASP.NET MVC使用Bootstrap系列(5)——创建ASP.NET MVC Bootstrap Helpers 摘要: 序言ASP.NET MVC允许开发者创建自定义的HTML Helper ...

  8. GitFlow使用说明

    ———————安装--------------- $ git clone --recursive git://github.com/nvie/gitflow.git $ cd gitflow $ [s ...

  9. EF 事物

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...

  10. iOS开发---转换坐标系

    - (void)viewDidLoad { [super viewDidLoad]; // 蓝色 UIView *blue = [[UIView alloc] init]; blue.backgrou ...