Android像素轉換的研究(一)

來源:互聯網
上載者:User

如何讓虛擬機器和真機顯示的一樣

原創文章,如有轉載,請註明出處: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想的,“與裝置無關”的意義了。

待續...

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.