李華明Himi 原創,轉載務必在明顯處註明:
剛纔一羣裏的兄弟問的一問題,稍微研究下,這裏一塊兒分享:新建的Emulator -配置爲:WAGA800 其分辨率是 800*480 的設備模擬器,當咱們程序中在取得其 Height和 Width的時候發現,老是 320*533 ,明顯是系統對咱們撒了謊!以下圖:css
下面是官方文檔原文:html
http://androidappdocs.appspot.com/guide/practices/screens_support.htmlandroid
那麼爲何系統會對其分辨率進行撒謊呢? 其做用是什麼呢?canvas
簡單的來講,在SDK1.6 (sdk version 4)之後,Android 增長了新功能「支持多屏」,所謂這項新功能也就是爲了讓咱們的遊戲、軟件能在不一樣的分辨率,不一樣機型上同樣流暢、玩美運行,其做用一來減輕咱們的移植工做量,二來更好的體現Android 愈來愈強勁的勢頭。api
自適應效果以下圖:(WVGA高密度(左),中密度的HVGA(中),低密度和QVGA(右)app
在不一樣的分辨率上想玩美的跑起來一款遊戲和軟件,有兩種方式,一種是咱們作遊戲的時候都作成自適應屏幕的遊戲方式,好比咱們取座標都根據屏幕的寬、高、圖片的寬、高等等而不是寫成死的位置座標。 第二種那就是Android os 在1.6之後的這種自適應技術;ide
可是有些時候顯然Android提供的這種自適應有時候咱們不須要,或者說不太適合咱們的開發,(其實這也相似於如今的遊戲引擎,不少人都在問我開發遊戲用什麼引擎,其實公司都有本身的引擎。我本身寫遊戲通常不使用他人引擎(本身寫引擎),由於沒有一款遊戲引擎適應全部的遊戲類型開發,例如用RPG的引擎去作個益智連連看?是否是搞了點 - -...固然如今市面上已經有很多的遊戲開發引擎,可是使用別人的遊戲引擎,對於開發來講,雖然提升了開發效率,縮短了開發週期,可是對於其擴展性不得不說非常頭疼的一件事情,so~建議你們去吸取這些開源引擎的知識和技術,本身整理出一份屬於本身的遊戲引擎,畢竟本身的擴展起來就容易多了!而不能去一謂的去使用和強加灌輸別人的思惟方式到本身腦中)咳咳、回到主題上來,剛纔說了,有時候咱們並不想使用Android os 提供的自適應,而是咱們本身去寫自適應,這樣更加的靈活.學習
下面給講解如何避開Android os的自適應的方法:ui
先來看下官方的一段話:spa
這裏是從官方文檔中截取的一段,這裏是在說,當Android sdk的版本是4或更低與版本爲5或更高的之間的區別;
那麼從這裏能夠得知Android sdk 1.6(version 4)以前是不支持自適應的,那麼解決的方法也就有了;
咱們只須要在AndroidMainFest 中,定義 <uses-sdk android:minSdkVersion="4" /> 就OK了!
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.desmo.testAd" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".Test" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-sdk android:minSdkVersion="4" /> </manifest>
而後咱們看看修改後xml後的運行截圖:
這樣就正常啦, 這裏呢我要給你們道個歉,你們也看到了,最近也沒有更新文章,主要緣由是一個回老家過年,今天剛回到公司第一天上班,第二點是因爲出書的緣故,已經簽下了《清華出版社》的合同,將大概在上半年完成一本關於Android 遊戲開發書籍,so~你們也體諒一下我,固然博客我確定是還要更新的,不過速度不會跟之前同樣快了。
這裏還要說下,我寫的這21篇文章,基本上對於學習遊戲開發都是很實用頗有用的,但願你們必定要細細的看,由於很多人問的都是寫過的東西 - -;若是你們還有什麼疑惑和問題能夠來羣裏進行交流和互相學習。
OK 就寫到這裏,本身會盡快完成書籍,讓你們早點看到。
_________________>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
本文補充:看到有些網友的回覆,大概還存在兩個問題。下面來逐一進行分析;
第一:
" 通常來講800X480的density爲240, 這樣獲得的係數大小爲240/160,
因此320X533再乘上1.5就是正確的像素,這個須要結合屏幕的density來計算。
"
這段話說的沒錯,(公式的由來官方api 文檔中有寫)Android SDK 1.6 以上才能夠經過 canvas.getDensity(); 獲得密度,canvas.setDensity(240);設置密度,可是不少羣友設置過密度的都知道這根本沒有任何的效果。而後我就想經過利用比值去對canvas進行縮放處理處理畫布使其回到正確的分辨率(像素),雖然目的達到了,可是發現失真效果很嚴重。因此我認爲仍是用xml定義minSdkVersion 的方式方便、實用。可是又出現了下一個問題:
第二:
「 <uses-sdk android:minSdkVersion="4" /> ,加了這句話以後SDK=3時候(也就是SDK 1.5的時候),
作出來的APK不就裝不成了嗎?
」
沒錯,咱們一旦定義了應用程序運行的最低版本,那麼低於此版本的都沒法安裝此應用,可是除了利用密度比值,如今我也沒有其好的解決方案。
總結:先說一句,咱們這種使用定義應用程序運行的最低版本的方式來解決,存在兩種弊端:
第一: 低於1.6sdk沒法安裝程序。
第二:影響高版本的功能,例如咱們的BlueTooth(藍牙)是在2.0+的api中才有的。
可是能夠利用密度比值,可是最好不要,畢竟失真嚴重。
有的童鞋說利用在項目的AndroidManifest.xml中定義這些屬性:
android:normalScreens="true"
android:smallScreens="true"
android:anyDensity="true"
這些是一些開關,好比是否支持小屏幕、是否支持任意密度等等,可是經過嘗試發現效果不理想,甚至沒效果;
多是使用的方法不對,但願對這方面比較深刻探究的童鞋能夠將心得分享出來供你們討論學習;
若是各位童鞋還有什麼的好的建議和方法能夠通知我、謝謝。