由于Android系統(tǒng)的開放性,許多手機(jī)廠商都專注于制造自己的品牌杯聚,造成Android的手機(jī)屏幕無論是大小還是分辨率都是五花八門臼婆,這就造成了我們在Android中進(jìn)行繪圖時難以保證繪圖在不同手機(jī)上的視覺一致性,通過下面的知識總結(jié)就可以很方便地幫助我們解決這些問題械媒。
一目锭、屏幕參數(shù)
一塊手機(jī)屏幕我們一般關(guān)注這幾個參數(shù)
1 . 屏幕大小
這個參數(shù)指的是我們手機(jī)的對角線長度,它的單位一般是寸纷捞。
2 . 分辨率
這個參數(shù)指的是手機(jī)屏幕上的像素點(diǎn)的個數(shù)痢虹,比如長和寬方向上的像素點(diǎn)個數(shù),例如
720×1280
就是指手機(jī)分辨率。
3 . PPI
PPI(Pixels Per Inch)指每英寸的像素?cái)?shù)目主儡,又被成為DPI(Dot Per Inch),它的計(jì)算方法是
對角線的像素點(diǎn)數(shù) ÷ 屏幕的大小(寸)
二奖唯、系統(tǒng)屏幕密度
由于每個Android手機(jī)廠商的手機(jī)都存在各種大小尺寸和像素密度的屏幕,所以我們不可能讓Android系統(tǒng)都滿足各種DPI的屏幕糜值,因此丰捷,Android系統(tǒng)定義了幾個標(biāo)準(zhǔn)的DPI值,作為手機(jī)的固定DPI寂汇。如下表:
密度 | ldpi | mdpi | hdpi | xhdpi | xxhdpi |
---|---|---|---|---|---|
密度值 | 120 | 160 | 240 | 320 | 480 |
分辨率 | 240×320 | 320×480 | 480×800 | 720×1280 | 1080×1920 |
三病往、獨(dú)立像素密度dp
由于各種屏幕密度不同,從而導(dǎo)致同樣的像素大小在不同密度的手機(jī)上顯示長度不同骄瓣,為此Android系統(tǒng)提供了一種解決方案停巷。
使用mdpi及密度為160的屏幕作為標(biāo)準(zhǔn),在該密度屏幕上榕栏,1dp = 1px畔勤,對于其他密度的屏幕則進(jìn)行按比例換算,比如320密度的屏幕上1dp = 2px扒磁,因此我們可以得到各個分辨率的換算比例為3 : 4 : 6 : 8 : 12
庆揪。這樣解決了不同密度手機(jī)屏幕的顯示問題。
四妨托、單位轉(zhuǎn)換函數(shù)封裝
在程序中我們需要對單位
dp
缸榛、sp
和px
之間進(jìn)行轉(zhuǎn)換,下面我們寫一個工具類來實(shí)現(xiàn)這些轉(zhuǎn)換兰伤。
/**
* Created by szh on 2017/2/3.
* Android中顯示相關(guān)的工具類
*/
public class DisplayUtil {
/**
* 將px轉(zhuǎn)換為dp
* @param px
* @return
*/
public static int pxTodp(Context context, float px){
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (px / scale + 0.5);
}
/**
* 將dp轉(zhuǎn)換為px
* @param context
* @param dp
* @return
*/
public static int dpTopx(Context context, float dp){
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dp * scale + 0.5);
}
/**
* 將px轉(zhuǎn)換為sp
* @param context
* @param px
* @return
*/
public static int pxTosp(Context context, float px){
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (px / fontScale + 0.5);
}
/**
* 將sp轉(zhuǎn)換為px
* @param context
* @param sp
* @return
*/
public static int spTopx(Context context, float sp){
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (sp * fontScale + 0.5);
}
/**
* 將dp轉(zhuǎn)換為px
* @param dp
* @return
*/
public static int dpTopx(float dp, Context context){
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp,
context.getResources().getDisplayMetrics());
}
public static int spTopx(float sp, Context context){
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, context.getResources().getDisplayMetrics());
}
}
看上面代碼内颗,前四個方法實(shí)現(xiàn)了
dp
、sp
與px
之間的轉(zhuǎn)換医清,后面的兩個方法重載起暮,使用TypedValue
的applyDimension()
方法實(shí)現(xiàn)了dp
和sp
向px
的轉(zhuǎn)化卖氨。
1 . 先解釋一下前四個個方法的原理:
通過
context.getResources().getDisplayMetrics().density;
獲得的是當(dāng)前屏幕的密度值與160
這個值的一個比例会烙,比如屏幕當(dāng)前密度值為320负懦,則得到的值為2
。通過context.getResources().getDisplayMetrics().scaledDensity;
得到的也是一個比例值柏腻,但是該比例用于字體的縮放上纸厉。
2 . 再說說最后兩個方法中的applyDimension()
方法,這個尤其要注意五嫂。
applyDimension()
該方法的第一個參數(shù)是要轉(zhuǎn)化的值的單位颗品,而它轉(zhuǎn)換后的結(jié)果都是像素值,也就是說它可以把一些其它單位的值轉(zhuǎn)換為Android內(nèi)部使用的像素值沃缘。
以上就是Android屏幕的相關(guān)知識點(diǎn)的總結(jié)躯枢,希望可以幫助到需要的人。