1.獲取手機屏幕寬高:
DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); int screenWidth = dm.widthPixels; int screenHeight = dm.heightPixels;
22.根據屏幕寬度為控件設置動態設置寬高:
imageView.setImageResource(R.drawable.newscar); LayoutParams params = imageView.getLayoutParams(); params.height=screenWidth/10; params.width =screenHeight/10; imageView.setLayoutParams(params);
注意示例:
我們需要獲取Android手機或Pad的屏幕的物理尺寸,以便於界面的設計或是其他功能的實現。下面就介紹講一講如何獲取屏幕的物理尺寸
下面的代碼即可獲取屏幕的尺寸。
在一個Activity的onCreate方法中,寫入如下代碼:
DisplayMetrics metric = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metric); int width = metric.widthPixels; // 屏幕寬度(像素) int height = metric.heightPixels; // 屏幕高度(像素) float density = metric.density; // 屏幕密度(0.75 / 1.0 / 1.5) int densityDpi = metric.densityDpi; // 屏幕密度DPI(120 / 160 / 240)
但是,需要注意的是,在一個低密度的小屏手機上,僅靠上面的代碼是不能獲取正確的尺寸的。比如說,一部240x320像素的低密度手機,如果運行上述代碼,獲取到的屏幕尺寸是320x427。因此,研究之后發現,若沒有設定多分辨率支持的話,Android系統會將240x320的低密度(120)尺寸轉換為中等密度(160)對應的尺寸,這樣的話就大大影響了程序的編碼。所以,需要在工程的AndroidManifest.xml文件中,加入supports-screens節點,具體的內容如下:
<supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:resizeable="true" android:anyDensity="true" />
這樣的話,當前的Android程序就支持了多種分辨率,那么就可以得到正確的物理尺寸了。如果沒有這幾行代碼,不管你怎么調整layout中的控件,對應分辨率的手機是沒有任何效果的。注意:由於android版本的不同,有些版本不支持xlargeScreens,可以直接將android:xlargeScreens="true"去掉。
杏總的代碼也是按照這種方式來適配屏幕的
private void layoutAdjust() { ECMLog.i_ui(CLASS_TAG, "layoutAdjust called..."); RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) logoIV.getLayoutParams(); params.width = 375 * mGlobalData.mScreenWidth / 1080; params.height = 394 * mGlobalData.mScreenWidth / 1080; params.topMargin = 470 * mGlobalData.mScreenHeight / 1920; logoIV.setLayoutParams(params); zhuanyedemimakaguanjiaIV = (ImageView) findViewById(R.id.zhuanyedemimakaguanjiaIV); params = (RelativeLayout.LayoutParams) zhuanyedemimakaguanjiaIV.getLayoutParams(); params.height = 60 * mGlobalData.mScreenHeight / 1920; params.width = 470 * mGlobalData.mScreenWidth / 1080; zhuanyedemimakaguanjiaIV.setLayoutParams(params); }
給了一個線性布局在1920*1080上的寬度和高度是375*394,現在的在不同的手機分辨率上就可以按照上面的比例來上來動態的設計指定線性布局的大小,滿足在不同的手機屏幕分辨率上顯示的布局的寬度和高度在不同的手機屏幕上顯示的效果是一樣的。
動態設置控件的寬度和高度的思路來自於:
android屏幕適配的全攻略2--支持手機各種屏幕密度dpi
我們最好按照上面的思路來解決,上面在代碼中這樣設置這樣寫主要用於布局控件很少的情況,當布局控件很多的時候,我們在代碼中就會寫很多代碼,這樣不太好,按照
android屏幕適配的全攻略2--支持手機各種屏幕密度dpi中的方法,我們ui設計師給了一個一個控件在1920*1080上面的寬度和高度是375*394
我們首先打開工程下的:
找到工程下的values-1920x1080文件夾
打開文件夾下面的lay_x.xml和lay_y.xml的值
375px對應在lay_x中的值是:
394對應在lay_y的值是:
我們在程序中寫代碼只需要在xml中進行設置就可以了,代碼如下:
<TextView android:text="Hello World!" android:background="#809" android:layout_width="@dimen/x110" android:layout_height="@dimen/y99"/>
這樣我們就能夠滿足在不同的手機中控件顯示的寬度和高度在屏幕中顯示的大小是一樣的,是不是相當的經典。
上面的是對控件能夠適配,對應圖片的適配按照下面的方法
- 為了讓我們提供的圖片符合各種屏幕密度的要求。我們需要為不同屏幕密度提供大小不同的圖片。
上篇文章中我們提到了在Google官方開發文檔中,說明了 mdpi:hdpi:xhdpi:xxhdpi:xxxhdpi=2:3:4:6:8 的尺寸比例進行縮放。例如,一個圖標的大小為48×48dp,表示在mdpi上,實際大小為48×48px,在hdpi像素密度上,實際尺寸為mdpi上的1.5倍,即72×72px,以此類推。
因此,我們要在drawable
、drawable-hdpi
、drawable-mdpi
、drawable-xdpi
、drawable-xhdpi
等文件夾下放置相同名稱、符合上述比例的圖片資源。系統會根據屏幕密度的不同,而選擇對應的圖片進行加載。
在布局文件中的簡單使用:
<Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:background="@drawable/ic_launcher" />