New UI-擷取手機螢幕尺寸與解析度,螢幕適配,橫豎屏問題

來源:互聯網
上載者:User

標籤:android開發   螢幕適配   解析度   橫豎屏問題   

New UI-擷取手機螢幕尺寸與常用解析度,螢幕適配,橫豎屏問題

——轉載請註明出處:coder-pig,歡迎轉載,請勿用於商業用途!


小豬Android開發交流群已建立,歡迎大家加入,無論是新手,菜鳥,大神都可以,小豬一個人的

力量畢竟是有限的,寫出來的東西肯定會有很多紕漏不足,歡迎大家指出,集思廣益,讓小豬的博文

更加的詳盡,幫到更多的人,O(∩_∩)O謝謝!

小豬Android開發交流群:小豬Android開發交流群群號:421858269

新Android UI執行個體大全目錄:http://blog.csdn.net/coder_pig/article/details/42145907



1)擷取手機螢幕尺寸與螢幕密度:

先要說一點,我們能通過編程擷取到的手機螢幕尺寸,只是解析度哦!!!真正的螢幕尺寸,

多少寸這樣要麼自己測,要麼上網查!編程擷取到的尺寸只是解析度,切記!!!

下面提供一個工具類,提供三種擷取手機解析度與螢幕密度的方法,方法一已經過時,不建議

使用了!

先上下吧:


工具類:

GetScreenParameter.java

package com.jay.example.getscreendemo;import android.app.Activity;import android.content.Context;import android.util.DisplayMetrics;import android.util.Log;import android.view.Display;public class GetScreenParameter {//方法一已經過時了,雖然可以使用,但不建議使用public static void getResolution1(Context mContext) {Display mDisplay = ((Activity) mContext).getWindowManager().getDefaultDisplay();int W = mDisplay.getWidth();int H = mDisplay.getHeight();Log.i("getResolution1", "Width = " + W + "px");Log.i("getResolution1", "Height = " + H + "px");}//方法二是通過getWindowManager來擷取螢幕尺寸的public static void getResolution2(Context mContext) {DisplayMetrics mDisplayMetrics = new DisplayMetrics();((Activity) mContext).getWindowManager().getDefaultDisplay().getMetrics(mDisplayMetrics);int W = mDisplayMetrics.widthPixels;int H = mDisplayMetrics.heightPixels;float density = mDisplayMetrics.density; // 螢幕密度(0.75 / 1.0 / 1.5)int densityDpi = mDisplayMetrics.densityDpi; // 就是螢幕密度 *160而已,螢幕密度DPI(120 / 160 / 240)Log.i("getResolution2", "Width = " + W + "px");Log.i("getResolution2", "Height = " + H + "px");Log.i("getResolution2", "density = " + density);Log.i("getResolution2", "densityDpi = " + densityDpi);}//方法三是通過getResources來擷取螢幕尺寸的public static void getResolution3(Context mContext) {DisplayMetrics mDisplayMetrics = new DisplayMetrics();mDisplayMetrics = mContext.getResources().getDisplayMetrics();int W = mDisplayMetrics.widthPixels;int H = mDisplayMetrics.heightPixels;float density = mDisplayMetrics.density; // 螢幕密度(0.75 / 1.0 / 1.5)int densityDpi = mDisplayMetrics.densityDpi; // 就是螢幕密度 *160而已,螢幕密度DPI(120 / 160 / 240)Log.i("getResolution3", "Width = " + W + "px");Log.i("getResolution3", "Height = " + H + "px");Log.i("getResolution3", "density = " + density);Log.i("getResolution3", "densityDpi = " + densityDpi);}}

MainActivity.java

package com.jay.example.getscreendemo;import android.app.Activity;import android.os.Bundle;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);GetScreenParameter.getResolution1(MainActivity.this);GetScreenParameter.getResolution2(MainActivity.this);GetScreenParameter.getResolution3(MainActivity.this);}}

用法很簡單,這裡只是列印到logcat裡,大家可以按自己的需求進行修改,另外還有一點要注意的是:

對於一些螢幕密度低的小屏手機,比如240*320的手機,計算出來的尺寸可能為:320*427,而網上也有解決方案,

原因好像是:沒有設定多解析度支援的話,Android系統會將240x320的低密度(120)尺寸轉換為中等密度

(160)對應的尺寸,於是乎要獲得正確的物理尺寸,只需要在AndroidManifest.xml檔案中添加下述內容:

<supports-screensandroid:smallScreens="true"android:normalScreens="true"android:largeScreens="true"android:resizeable="true"android:anyDensity="true"/>


就可以解決這個問題了!




2)手機解析度問題:

相信大家建立完工程後,都可以看到res目錄下的drawable有幾種

這個時候你就可能有一些疑問了,這些檔案夾都是幹嘛的為什麼要分那麼多個?

答:這些檔案夾都是放drawable資源的,你可以理解為放圖片的,分那麼多個是為了

針對不同螢幕密度的手機載入不同的圖片資源,之所以這樣做,是因為,同一張圖片在

不同螢幕密度手機下可能出現不同的結果,這顯然和我們的原意相違背;於是乎Android

會根據手機dpi的不同載入對應檔案夾下的圖片資源!




後面寫跟著的xdpi就是會載入對應檔案夾下的圖片資源!

當然,這也不是絕對的,比如我們把所有的圖片都丟在了drawable-hdpi下的話,即使手機

本該載入ldpi檔案夾下的圖片資源,但是ldpi下沒有,那麼載入的還會是hdpi下的圖片!

另外,還有一種情況:比如是hdpi,mdpi目錄下有,ldpi下沒有,那麼會載入mdpi中的資源!

原則是使用最接近的密度層級!

ps:另外如果你想禁止Android不跟隨螢幕密度載入不同檔案夾的資源,只需在AndroidManifest.xml

檔案中添加android:anyDensity="false"欄位即可!




3)螢幕適配的問題:

相信螢幕適配都是大家頭疼的一個問題吧,這裡的話就說下介面開發時要注意的地方吧!

①畫介面的時候使用RelativeLayout + LinearLayout的weight(權重)屬性來編寫!


②多用match_parent和warp_content,如果必須寫死控制項的大小的話,用dp而不要用px(像素)

對於文字大小則用sp,如果我們不設定textSize的話,預設大小是14sp!

(如果文字大小大於15sp的話也可以用dp,自己喜歡!)


③針對不同螢幕密度的手機提供不同大小的圖片,從低到高的比依次為:3,4,6,8;

例如:ldpi下的圖片為36*36,那麼mdpi就為48*48,同理hdpi為72*72,xhdpi為96*96


④針對不同的手機使用不同的布局,只需要建立一個布局檔案夾,命名為:

layout-480x320這樣的格式,然後寫相應的布局檔案,layout-320x240這樣,Android系統會根據

不同的手機解析度載入不同的布局!另外還要在AndroidManifest.xml裡添加這段東西:

<supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" />
不然會沒有效果的!


⑤對於局部展開的圖片,比如最常見的聊天時的TextView,文字過長就可能引起展開變形,那麼

這些時候就應該使用9-patch工具對圖片進行處理了!

ps:關於9patch工具的使用,可到:9patch(9妹)的用法




4.橫豎屏載入不同布局:

layout-port:橫屏   layout-land:豎屏

手機載入的時候會判斷橫豎屏,接著載入不同的布局






New UI-擷取手機螢幕尺寸與解析度,螢幕適配,橫豎屏問題

聯繫我們

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