如何讓虛擬機器和真機顯示的一樣
原創文章,如有轉載,請註明出處:http://blog.csdn.net/yihui823/article/details/6734341
基本概念
1. px(pixels):像素
是繪圖的基本元素。我們說的螢幕解析度,就是指像素。如果手機的解析度是480*800,那麼手機寬有480個像素,長有800個像素。這個像素是固定的。如果畫一條直線,以像素為單位從0,0到240,400,那麼就是一條從左上方到螢幕中間的一條直線。
2. dpi(Dots Per Inch):像素密度
的縮寫。每英寸所列印的點數或線數。
DPI 原來是印刷上的記量單位,意思是每個英寸上,所能印刷的網點數(Dot Per Inch)。但隨著數字輸入,輸出裝置快速發展,大多數的人也將數字影像的解析度用DPI表示,但較為嚴謹的人可能注意到,印刷時計算的網點(Dot)和電腦顯示器的顯示像素(Pixel)並非相同,所以較專業的人士,會用PPI(Pixel Per Inch)表示數字影像的解析度,以區分二者。
簡單的就可以這麼理解,每個固定尺寸內,有多少個像素。例如相同的像素,在越小的尺寸內顯示,那麼像素密度就高。密度高的效果,就是畫面細膩。同樣的一條斜線,在密度高的裝置上顯示,就不容易出現鋸齒;在密度低的裝置上顯示,就容易出現鋸齒。
我們看下面這兩幅圖:
pix-001
pix-002
相同的圖片大小,第一副圖的像素密度大(50*50像素),第二副圖的像素密度小(5*5像素),是不是看上去完全不同啊。
在Android建立虛擬機器的時候,就有一個參數:density。這個和dpi應該是一個概念。
3. dip(device independent pixels):裝置獨立像素.
指一個抽象意義上的像素,程式用它來定義介面元素。它作為一個與實際密度無關的單位,協助程式員構建一個布局方案(介面元素的寬度,高度,位置)。
dip是android抽象出來的概念。他主要的目的是什嗎?google為什麼要推薦用dip來布置螢幕?
實驗一
相同dip顯示效果
我們用一個dip表示的按鈕來看看效果。
為了便於對比,我們在按鈕下面放置一個自己定製的View。
layout的xml檔案:
<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" ><com.study.about.dip.ViewForShow android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /><Button android:id="@+id/btn" android:layout_width="240dip" android:layout_height="320dip" android:text="Button"/></FrameLayout>
自己定製的View的代碼:
package com.study.about.dip; import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.util.AttributeSet;import android.util.Log;import android.util.TypedValue;import android.view.View; public class ViewForShow extends View { private Paint mPaint = new Paint(); public ViewForShow(Context context) { super(context); } public ViewForShow(Context context, AttributeSet attrs) { super(context, attrs); } public ViewForShow(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public void draw(Canvas canvas) { mPaint.setColor(Color.RED); canvas.drawLine(0, 0, 120, 160, mPaint); mPaint.setColor(Color.GREEN); canvas.drawLine(0, 320, 120, 160, mPaint); mPaint.setColor(Color.YELLOW); canvas.drawLine(240, 0, 120, 160, mPaint); mPaint.setColor(Color.BLUE); canvas.drawLine(240, 320, 120, 160, mPaint); }}
代碼的功能,就是畫4條直線,以絕對像素標識出來做對比。然後在直線上層,放置一個240 * 320 dpi的按鈕。我們看看dpi跟像素的關係。
我們通過啟動不同的虛擬機器來對比顯示效果。
對比1:
我們先比較,螢幕長寬比例相同,不同解析度的情況。
虛擬機器1:
pix-003
顯示的效果如下:
pix-004
虛擬機器2:
pix-005
顯示的效果如下:
pix-006
我們可以看出來,兩個顯示屏的按鈕,是同比例顯示在螢幕上的。四條彩色的直線是按絕對像素來畫的,按鈕是按dip來畫的。在density=120的時候,240dip = 180px;在density=160的時候,240dip = 240px。
基本上,我們可以得出一個結論:
相同的dip,在不同解析度的螢幕上,在螢幕的相對寬度是一樣的。所謂相對寬度,可以理解為是控制項佔有螢幕的百分比。
在density = 160的時候,1dip =1px
我們可以得到這麼一個公式:
density :160 = px : dip
不過,公式只是拿來演算用的。真正的用意應該是,如果用dip像素擺好了螢幕的控制項,無論螢幕大小變換,控制項的相對大小是不變的。這也就是google想的,“與裝置無關”的意義了。
待續...