Android 屏幕分辯率相關問題
Android 屏幕分辯率相關問題:
對于surface的控制在SurfaceHolder類中進行
而Android 屏幕分辯率中已經有一個類DisplayMetics提供
Andorid.util 包下的DisplayMetrics 類提供了一種關于顯示的通用信息,如顯示大小,分辨率和字體。
為了獲取DisplayMetrics 成員,首先初始化一個對象如下:
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
String str = metrics.toString();
String str = "屏幕分辨率為:" + metrics.widthPixels
+" * "+metrics.heightPixels;
textview.setText(str); //顯示
在CTS中有如下一段代碼可以體現出不同的單位顯示情況:
public void testAccessTextSize() {
DisplayMetrics metrics = mActivity.getResources().getDisplayMetrics();
mTextView = new TextView(mActivity);
mTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 20f);
assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 20f, metrics),
mTextView.getTextSize(), 0.01f);
mTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20f);
assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20f, metrics),
mTextView.getTextSize(), 0.01f);
mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20f);
assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20f, metrics),
mTextView.getTextSize(), 0.01f);
// setTextSize by default unit "sp"
mTextView.setTextSize(20f);
assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20f, metrics),
mTextView.getTextSize(), 0.01f);
mTextView.setTextSize(200f);
assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 200f, metrics),
mTextView.getTextSize(), 0.01f);
}
這里面有幾個單位dip, dp, px, sp概念必須了解一下先:
dip: device independent pixels(設備獨立像素). 不同設備有不同的顯示效果,
這個和設備硬件有關,一般我們為了支持WVGA、HVGA和QVGA 推薦使用這個,不依賴像素。
px: pixels(像素). 不同設備顯示效果相同,一般我們HVGA代表320x480像素,這個用的比較多。
pt: point,是一個標準的長度單位,1pt=1/72英寸,用于印刷業,非常簡單易用;
sp: scaled pixels(放大像素). 主要用于字體顯示best for textsize,根據 google 的建議,
TextView 的字號最好使用 sp 做單位
程序員通常以像素為單位設計計算機用戶界面,但是如果顯示分辯率發生變更(更高時),
則以前做的應用界面會相應縮小,所以有必要使用與分辨率無關的度量單位解決此問題。
Android支持下列所有單位:
px(像素):屏幕上的點。
in(英寸):長度單位。
mm(毫米):長度單位。
pt(磅):1/72英寸。
dp(與密度無關的像素):一種基于屏幕密度的抽象單位。在每英寸160點的顯示器上,1dp = 1px。
dip:與dp相同,多用于android/ophone示例中。
dp也就是dip。這個和sp基本類似。如果設置表示長度、高度等屬性時可以使用dp或sp。但如果
設置字體,需要使用sp。dp是與密度無關,sp除了與密度無關外,還與scale無關。
所以為了使用戶界面能夠在現在和將來的顯示器類型上正常顯示,建議大家始終使用sp作為
文字大小的單位,將dip作為其他元素的單位。當然,也可以考慮使用矢量圖形,而不是用位圖
附帶兩個問題的解決:
解碼圖片顯示時,設定的density會影響到顯示效果
在DisplayMetrics.java中定義的默認值:
/
Standard quantized DPI for low-density screens.
/
public static final int DENSITY_LOW = 120;
/
Standard quantized DPI for medium-density screens.
/
public static final int DENSITY_MEDIUM = 160;
/
Standard quantized DPI for high-density screens.
/
public static final int DENSITY_HIGH = 240;
/
Standard quantized DPI for extra-high-density screens.
/
public static final int DENSITY_XHIGH = 320;
/
The reference density used throughout the system.
/
public static final int DENSITY_DEFAULT = DENSITY_MEDIUM;
1、如果圖片解碼像素高但顯示效果不怎么樣時,請修改下DENSITY_DEFAULT看個效果
public static final int DENSITY_DEFAULT = DENSITY_XHIGH;
顯示例子:
Options opts = new Options();
opts.inScaled = false;
opts.inSampleSize = 1;
opts.inScreenDensity = DisplayMetrics.DENSITY_HIGH;
opts.inPreferredConfig = Bitmap.Config.ARGB_8888;
mBitmapbg = BitmapFactory.decodeResource(this.getResources(), R.drawable.bj, opts);
BitmapDrawable bd = new BitmapDrawable(mBitmapbg);
2、如果圖片在不同的顯示頻率下被放大了,那么有可能與webview相關,這也是density影響的
/
Enum for specifying the WebView's desired density.
FAR makes 100% looking like in 240dpi
MEDIUM makes 100% looking like in 160dpi
CLOSE makes 100% looking like in 120dpi
*/
public enum ZoomDensity {
FAR(150), // 240dpi
MEDIUM(100), // 160dpi
CLOSE(75); // 120dpi
ZoomDensity(int size) {
value = size;
}
int value;
}
那么是否可能根據屏幕的分辯率進行動態設定呢?
int dDensity = getResources().getDisplayMetrics().densityDpi ;
WebSettings.ZoomDensity zDensity = WebSettings.ZoomDensity.MEDIUM ;
switch(dDensity) {
case DisplayMetrics.DENSITY_LOW :
zDensity = WebSettings.ZoomDensity.CLOSE;
break;
case DisplayMetrics.DENSITY_MEDIUM:
zDensity = WebSettings.ZoomDensity.MEDIUM;
break;
case DisplayMetrics.DENSITY_HIGH:
zDensity = WebSettings.ZoomDensity.FAR;
break ;
}
webSettings.setDefaultZoom(zDensity); </span>
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!