Android 调整屏幕分辩率
生活随笔
收集整理的這篇文章主要介紹了
Android 调整屏幕分辩率
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Android 可設(shè)置為隨著窗口大小調(diào)整縮放比例及設(shè)定fixed的窗口大小。
對于surface的控制在SurfaceHolder類中進(jìn)行
而Android 屏幕分辯率中已經(jīng)有一個(gè)類DisplayMetics提供
Andorid.util 包下的DisplayMetrics 類提供了一種關(guān)于顯示的通用信息,如顯示大小,分辨率和字體。
為了獲取DisplayMetrics 成員,首先初始化一個(gè)對象如下:
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
String str = metrics.toString();
String str = "屏幕分辨率為:" + metrics.widthPixels
??????????????? +" * "+metrics.heightPixels;
??????? textview.setText(str); //顯示
???
在CTS中有如下一段代碼可以體現(xiàn)出不同的單位顯示情況:
??? 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);
??? }
??
這里面有幾個(gè)單位dip, dp, px, sp概念必須了解一下先:
dip: device independent pixels(設(shè)備獨(dú)立像素). 不同設(shè)備有不同的顯示效果,
??? 這個(gè)和設(shè)備硬件有關(guān),一般我們?yōu)榱酥С諻VGA、HVGA和QVGA 推薦使用這個(gè),不依賴像素。
px: pixels(像素). 不同設(shè)備顯示效果相同,一般我們HVGA代表320x480像素,這個(gè)用的比較多。
pt: point,是一個(gè)標(biāo)準(zhǔn)的長度單位,1pt=1/72英寸,用于印刷業(yè),非常簡單易用;
sp: scaled pixels(放大像素). 主要用于字體顯示best for textsize,根據(jù) google 的建議,
?? TextView 的字號最好使用 sp 做單位
??
程序員通常以像素為單位設(shè)計(jì)計(jì)算機(jī)用戶界面,但是如果顯示分辯率發(fā)生變更(更高時(shí)),
則以前做的應(yīng)用界面會相應(yīng)縮小,所以有必要使用與分辨率無關(guān)的度量單位解決此問題。
Android支持下列所有單位:
px(像素):屏幕上的點(diǎn)。
in(英寸):長度單位。
mm(毫米):長度單位。
pt(磅):1/72英寸。
dp(與密度無關(guān)的像素):一種基于屏幕密度的抽象單位。在每英寸160點(diǎn)的顯示器上,1dp = 1px。
dip:與dp相同,多用于android/ophone示例中。
dp也就是dip。這個(gè)和sp基本類似。如果設(shè)置表示長度、高度等屬性時(shí)可以使用dp或sp。但如果
設(shè)置字體,需要使用sp。dp是與密度無關(guān),sp除了與密度無關(guān)外,還與scale無關(guān)。
所以為了使用戶界面能夠在現(xiàn)在和將來的顯示器類型上正常顯示,建議大家始終使用sp作為
文字大小的單位,將dip作為其他元素的單位。當(dāng)然,也可以考慮使用矢量圖形,而不是用位圖
附帶兩個(gè)問題的解決:
解碼圖片顯示時(shí),設(shè)定的density會影響到顯示效果
在DisplayMetrics.java中定義的默認(rèn)值:
??? /**
???? * 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、如果圖片解碼像素高但顯示效果不怎么樣時(shí),請修改下DENSITY_DEFAULT看個(gè)效果
??? 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相關(guān),這也是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;
??? }
???
??? 那么是否可能根據(jù)屏幕的分辯率進(jìn)行動(dòng)態(tài)設(shè)定呢?
??? 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);
?
轉(zhuǎn)載于:https://www.cnblogs.com/snake-hand/p/3151370.html
總結(jié)
以上是生活随笔為你收集整理的Android 调整屏幕分辩率的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: day 29
- 下一篇: 在MacOSX上重新安装Python (