剛才一群里的兄弟問的一問題,稍微研究下,這里一起分享:新建的Emulator -配置為:WAGA800 其分辨率是 800*480 的設(shè)備模擬器,當(dāng)我們程序中在取得其 Height和 Width的時候發(fā)現(xiàn),總是 320*533 ,明顯是系統(tǒng)對我們?nèi)隽酥e!如下圖:
那么為什么系統(tǒng)會對其分辨率進行撒謊呢? 其作用是什么呢?
簡單的來說,在SDK1.6 (sdk version 4)以后,Android 增加了新功能“支持多屏”,所謂這項新功能也就是為了讓我們的游戲、軟件能在不同的分辨率,不同機型上一樣流暢、玩美運行,其作用一來減輕我們的移植工作量,二來更好的體現(xiàn)Android 越來越強勁的勢頭。
自適應(yīng)效果如下圖:(WVGA高密度(左),中密度的HVGA(中),低密度和QVGA(右)
在不同的分辨率上想玩美的跑起來一款游戲和軟件,有兩種方式,一種是我們做游戲的時候都做成自適應(yīng)屏幕的游戲方式,比如我們?nèi)∽鴺?biāo)都根據(jù)屏幕的寬、高、圖片的寬、高等等而不是寫成死的位置坐標(biāo)。 第二種那就是Android os 在1.6以后的這種自適應(yīng)技術(shù);
但是有些時候顯然Android提供的這種自適應(yīng)有時候我們不需要,或者說不太適合我們的開發(fā),(其實這也類似于現(xiàn)在的游戲引擎,很多人都在問我開發(fā)游戲用什么引擎,其實公司有自己的引擎。我自己寫游戲不用引擎,因為沒有一款游戲引擎適應(yīng)所有的游戲類型開發(fā),例如用RPG的引擎去做個益智連連看?是不是搞了點 - -。..當(dāng)然現(xiàn)在市面上已經(jīng)有不少的游戲開發(fā)引擎,但是使用別人的游戲引擎,對于開發(fā)來說,雖然提高了開發(fā)效率,縮短了開發(fā)周期,但是對于其擴展性不得不說很是頭疼的一件事情,so~建議大家去吸收這些開源引擎的知識和技術(shù),自己整理出一份屬于自己的游戲引擎,畢竟自己的擴展起來就容易多了!而不能去一謂的去使用和強加灌輸別人的思維方式到自己腦中)咳咳、回到主題上來,剛才說了,有時候我們并不想使用Android os 提供的自適應(yīng),而是我們自己去寫自適應(yīng),這樣更加的靈活。
剛才一群里的兄弟問的一問題,稍微研究下,這里一起分享:新建的Emulator -配置為:WAGA800 其分辨率是 800*480 的設(shè)備模擬器,當(dāng)我們程序中在取得其 Height和 Width的時候發(fā)現(xiàn),總是 320*533 ,明顯是系統(tǒng)對我們?nèi)隽酥e!如下圖:
下面是官方文檔原文:
http://androidappdocs.appspot.com/guide/practices/screens_support.html
那么為什么系統(tǒng)會對其分辨率進行撒謊呢? 其作用是什么呢?
簡單的來說,在SDK1.6 (sdk version 4)以后,Android 增加了新功能“支持多屏”,所謂這項新功能也就是為了讓我們的游戲、軟件能在不同的分辨率,不同機型上一樣流暢、玩美運行,其作用一來減輕我們的移植工作量,二來更好的體現(xiàn)Android 越來越強勁的勢頭。
自適應(yīng)效果如下圖:(WVGA高密度(左),中密度的HVGA(中),低密度和QVGA(右)
在不同的分辨率上想玩美的跑起來一款游戲和軟件,有兩種方式,一種是我們做游戲的時候都做成自適應(yīng)屏幕的游戲方式,比如我們?nèi)∽鴺?biāo)都根據(jù)屏幕的寬、高、圖片的寬、高等等而不是寫成死的位置坐標(biāo)。 第二種那就是Android os 在1.6以后的這種自適應(yīng)技術(shù);
但是有些時候顯然Android提供的這種自適應(yīng)有時候我們不需要,或者說不太適合我們的開發(fā),(其實這也類似于現(xiàn)在的游戲引擎,很多人都在問我開發(fā)游戲用什么引擎,其實公司有自己的引擎。我自己寫游戲不用引擎,因為沒有一款游戲引擎適應(yīng)所有的游戲類型開發(fā),例如用RPG的引擎去做個益智連連看?是不是搞了點 - -。..當(dāng)然現(xiàn)在市面上已經(jīng)有不少的游戲開發(fā)引擎,但是使用別人的游戲引擎,對于開發(fā)來說,雖然提高了開發(fā)效率,縮短了開發(fā)周期,但是對于其擴展性不得不說很是頭疼的一件事情,so~建議大家去吸收這些開源引擎的知識和技術(shù),自己整理出一份屬于自己的游戲引擎,畢竟自己的擴展起來就容易多了!而不能去一謂的去使用和強加灌輸別人的思維方式到自己腦中)咳咳、回到主題上來,剛才說了,有時候我們并不想使用Android os 提供的自適應(yīng),而是我們自己去寫自適應(yīng),這樣更加的靈活。
下面給講解如何避開Android os的自適應(yīng)的方法:
先來看下官方的一段話:
這里是從官方文檔中截取的一段,這里是在說,當(dāng)Android sdk的版本是4或更低與版本為5或更高的之間的區(qū)別;
那么從這里可以得知Android sdk 1.6(version 4)之前是不支持自適應(yīng)的,那么解決的方法也就有了;
我們只需要在AndroidMainFest 中,定義 《uses-sdk android:minSdkVersion=“4” /》 就OK了!
view plaincopy to clipboardprint?
·········10········20········30········40········50········60········70········80········90········100·······110
·······120·······130·······140·······150
《?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后的運行截圖:
這樣就正常啦, 這里呢我要給大家道個歉,大家也看到了,最近也沒有更新文章,主要原因是一個回老家過年,今天剛回到公司第一天上班,第二點是由于出書的緣故,已經(jīng)簽下了《清華出版社》的合同,將大概在上半年完成一本關(guān)于Android 游戲開發(fā)書籍,so~大家也體諒一下我,當(dāng)然博客我肯定是還要更新的,不過速度不會跟以前一樣快了。
這里還要說下,我寫的這21篇文章,基本上對于學(xué)習(xí)游戲開發(fā)都是很實用很有用的,希望大家一定要細細的看,因為不少人問的都是寫過的東西 - -;如果大家還有什么疑惑和問題可以來群里進行交流和互相學(xué)習(xí)。
OK 就寫到這里,自己會盡快完成書籍,讓大家早點看到。
本文補充:看到有些網(wǎng)友的回復(fù),大概還存在兩個問題。下面來逐一進行分析;
第一:
“ 一般來說800X480的density為240, 這樣得到的系數(shù)大小為240/160,
所以320X533再乘上1.5就是正確的像素,這個需要結(jié)合屏幕的density來計算。
”
這段話說的沒錯,(公式的由來官方api 文檔中有寫)Android SDK 1.6 以上才可以通過 canvas.getDensity(); 得到密度,canvas.setDensity(240);設(shè)置密度,但是很多群友設(shè)置過密度的都知道這根本沒有任何的效果。然后我就想通過利用比值去對canvas進行縮放處理處理畫布使其回到正確的分辨率(像素),雖然目的達到了,但是發(fā)現(xiàn)失真效果很嚴重。所以我認為還是用xml定義minSdkVersion 的方式方便、實用。但是又出現(xiàn)了下一個問題:
第二:
“ 《uses-sdk android:minSdkVersion=“4” /》 ,加了這句話之后SDK=3時候(也就是SDK 1.5的時候),
做出來的APK不就裝不成了嗎?
”
沒錯,我們一旦定義了應(yīng)用程序運行的最低版本,那么低于此版本的都無法安裝此應(yīng)用,但是除了利用密度比值,現(xiàn)在我也沒有其好的解決方案。
總結(jié):先說一句,我們這種使用定義應(yīng)用程序運行的最低版本的方式來解決,存在兩種弊端:
第一: 低于1.6sdk無法安裝程序。
第二:影響高版本的功能,例如我們的BlueTooth(藍牙)是在2.0+的api中才有的。
但是可以利用密度比值,但是最好不要,畢竟失真嚴重。