屏幕适配经验
橫屏和豎屏的切換,以及分辨率大小不同。
一、橫豎屏切換:
1、Android應用程序支持橫豎屏幕的切換,android中每次屏幕的切換動會重啟Activity,所以應該在Activity銷毀(執行onPause()方法和onDestroy()方法)前保存當前活動的狀態;在Activity再次創建的時候載入配置,那樣,進行中的游戲就不會自動重啟了!有的程序適合從豎屏切換到橫屏,或者反過來,這個時候怎么辦呢?可以在配置Activity的地方進行如下的配置android:screenOrientation="portrait"(landscape是橫向,portrait是縱向)。這樣就可以保證是豎屏總是豎屏了。
2、而有的程序是適合橫豎屏切換的。如何處理呢?首先要在配置Activity的時候進行如下的配置:
android:configChanges="keyboardHidden|orientation",
另外需要重寫Activity的onConfigurationChanged方法。
實現方式如下:
@Override
publicvoidonConfigurationChanged(ConfigurationnewConfig){
super.onConfigurationChanged(newConfig);
if(this.getResources().getConfiguration().orientation==Configuration.ORIENTATION_LANDSCAPE){
//landdonothingisok
}elseif(this.getResources().getConfiguration().orientation==Configuration.ORIENTATION_PORTRAIT){
//portdonothingisok
}
}
?
二、分辨率問題:
對于分辨率問題,官方給的解決辦法是創建不同的layout文件夾,這就需要對每種分辨率的手機都要寫一個布局文件,雖然看似解決了分辨率的問題,但是如果其中一處或多處有修改了,就要每個布局文件都要做出修改,這樣就造成很大的麻煩。那么可以通過以下幾種方式解決:
一)使用layout_weight
目前最為推薦的Android多屏幕自適應解決方案。
? ? 該屬性的作用是決定控件在其父布局中的顯示權重,一般用于線性布局中。其值越小,則對應的layout_width或layout_height的優先級就越高(一般到100作用就不太明顯了);一般橫向布局中,決定的是layout_width的優先級;縱向布局中,決定的是layout_height的優先級。
? ? 傳統的layout_weight使用方法是將當前控件的layout_width和layout_height都設置成fill_parent,這樣就可以把控件的顯示比例完全交給layout_weight;這樣使用的話,就出現了layout_weight越小,顯示比例越大的情況(即權重越大,顯示所占的效果越小)。不過對于2個控件還好,如果控件過多,且顯示比例也不相同的時候,控制起來就比較麻煩了,畢竟反比不是那么好確定的。于是就有了現在最為流行的0px設值法。看似讓人難以理解的layout_height=0px的寫法,結合layout_weight,卻可以使控件成正比例顯示,輕松解決了當前Android開發最為頭疼的碎片化問題之一。
先看下面的styles(style_layout.xml)
<?xml version="1.0" encoding="utf-8"?>
<resources>?
?
<!-- 全屏幕拉伸-->
? <style name="layout_full">?
??? <item name="android:layout_width">fill_parent</item>?
??? <item name="android:layout_height">fill_parent</item>?
? </style>
??
<!-- 固定自身大小-->
? <style name="layout_wrap">?
??? <item name="android:layout_width">wrap_content</item>?
??? <item name="android:layout_height">wrap_content</item>?
? </style>
?
<!-- 橫向分布-->
? <style name="layout_horizontal" parent="layout_full">?
??? <item name="android:layout_width">0px</item>?
? </style>
???
<!-- 縱向分布-->
? <style name="layout_vertical" parent="layout_full">?
??? <item name="android:layout_height">0px</item>?
? </style>
????????
</resources>
可以看到,layout_width和layout_height兩個屬性被我封裝成了4個style,?根據實際布局情況,選用當中的一種,不需要自己設置
二)清單文件配置:【不建議使用這種方式,需要對不同的界面寫不同的布局】
需要在AndroidManifest.xml文件的<manifest>元素如下添加子元素
<supports-screensandroid:largeScreens="true"
android:normalScreens="true"
android:anyDensity="true"
android:smallScreens="true"
android:xlargeScreens="true">
</supports-screens>
以上是為我們的屏幕設置多分辨率支持(更準確的說是適配大、中、小三種密度)。
Android:anyDensity="true",這一句對整個的屏幕都起著十分重要的作用,值為true,我們的應用程序當安裝在不同密度的手機上時,程序會分別加載hdpi,mdpi,ldpi文件夾中的資源。相反,如果值設置為false,即使我們在hdpi,mdpi,ldpi,xdpi文件夾下擁有同一種資源,那么應用也不會自動地去相應文件夾下尋找資源。而是會在大密度和小密度手機上加載中密度mdpi文件中的資源。
有時候會根據需要在代碼中動態地設置某個值,可以在代碼中為這幾種密度分別設置偏移量,但是這種方法最好不要使用,最好的方式是在xml文件中不同密度的手機進行分別設置。這里地圖的偏移量可以在values-xpdi,values-hpdi,values-mdpi,values-ldpi四種文件夾中的dimens.xml文件進行設置。
?
三)、其他:
說明:
?????? 在不同分辨率的手機模擬器下,控件顯示的位置會稍有不同
?????? 通過在layout中定義的布局設置的參數,使用dp(dip),會根據不同的屏幕分辨率進行適配
?????? 但是在代碼中的各個參數值,都是使用的像素(px)為單位的
技巧:
1、盡量使用線性布局,相對布局,如果屏幕放不下了,可以使用ScrollView(可以上下拖動)
ScrowView使用的注意:
在不同的屏幕上顯示內容不同的情況,其實這個問題我們往往是用滾動視圖來解決的,也就是ScrowView;需要注意的是ScrowView中使用layout_weight是無效的,既然使用ScrowView了,就把它里面的控件的大小都設成固定的吧。
2、指定寬高的時候,采用dip的單位,dp單位動態匹配
3、由于android代碼中寫的單位都是像素,所有需要通過工具類進行轉化
4、盡量使用9-patch圖,可以自動的依據圖片上面顯示的內容被拉伸和收縮。其中在編輯的時候,灰色區域是被拉伸的,上下兩個點控制水平方向的拉伸,左右兩點控制垂直方向的拉伸
?????? 工具在adt-bundle-windows-x86-20130522\sdk\tools目錄下的draw9patch.bat
?
?
?
三、手機分辨率px和dp的關系:
dp:是dip的簡寫,指密度無關的像素。
?????? 指一個抽象意義上的像素,程序用它來定義界面元素。一個與密度無關的,在邏輯尺寸上,與一個位于像素密度為160DPI的屏幕上的像素是一致的。要把密度無關像素轉換為屏幕像素,可以用這樣一個簡單的公式:pixels=dips*(density/160)。舉個例子,在DPI為240的屏幕上,1個DIP等于1.5個物理像素。
強烈推薦你用DIP來定義你程序的界面布局,因為這樣可以保證你的UI在各種分辨率的屏幕上都可以正常顯示。
/**
???? * 根據手機的分辨率從 px(像素) 的單位 轉成為 dp
???? */?
??? public static int px2dip(Context context, float pxValue) {?
??????? final float scale = context.getResources().getDisplayMetrics().density;?
??????? return (int) (pxValue / scale + 0.5f);?
??? }?
?
/**
???? * 根據手機的分辨率從 dip 的單位 轉成為 px(像素)
???? */?
??? public static int dip2px(Context context, float dpValue) {?
??????? final float scale = context.getResources().getDisplayMetrics().density;?
??????? return (int) (dpValue * scale + 0.5f);?
??? }?
轉載于:https://www.cnblogs.com/dubo-/p/6676241.html
總結
- 上一篇: UML设计,可以设计程序的用例图、类图、
- 下一篇: 通过js获取元素css3的transfo