《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 其他 > 設(shè)計(jì)應(yīng)用 > Android os設(shè)備謊言分辨率的解決方案
Android os設(shè)備謊言分辨率的解決方案
CSDN
摘要: 簡(jiǎn)單的來(lái)說(shuō),在SDK1.6以后,,Android增加了新功能“支持多屏”,所謂這項(xiàng)新功能也就是為了讓我們的游戲,、軟件能在不同的分辨率,不同機(jī)型上一樣流暢、玩美運(yùn)行,其作用一來(lái)減輕我們的移植工作量,,二來(lái)更好的體現(xiàn)Android越來(lái)越強(qiáng)勁的勢(shì)頭。
關(guān)鍵詞: Android 謊言分辨率
Abstract:
Key words :

  剛才一群里的兄弟問的一問題,,稍微研究下,,這里一起分享:新建的Emulator -配置為:WAGA800 其分辨率是 800*480 的設(shè)備模擬器,,當(dāng)我們程序中在取得其 Height和 Width的時(shí)候發(fā)現(xiàn),,總是 320*533 ,,明顯是系統(tǒng)對(duì)我們?nèi)隽酥e!如下圖:

  

  那么為什么系統(tǒng)會(huì)對(duì)其分辨率進(jìn)行撒謊呢,? 其作用是什么呢,?

  簡(jiǎn)單的來(lái)說(shuō),在SDK1.6 (sdk version 4)以后,,Android 增加了新功能“支持多屏”,,所謂這項(xiàng)新功能也就是為了讓我們的游戲、軟件能在不同的分辨率,,不同機(jī)型上一樣流暢,、玩美運(yùn)行,其作用一來(lái)減輕我們的移植工作量,,二來(lái)更好的體現(xiàn)Android 越來(lái)越強(qiáng)勁的勢(shì)頭,。

  自適應(yīng)效果如下圖:(WVGA高密度(左),中密度的HVGA(中),,低密度和QVGA(右)

  

  在不同的分辨率上想玩美的跑起來(lái)一款游戲和軟件,,有兩種方式,一種是我們做游戲的時(shí)候都做成自適應(yīng)屏幕的游戲方式,,比如我們?nèi)∽鴺?biāo)都根據(jù)屏幕的寬,、高、圖片的寬,、高等等而不是寫成死的位置坐標(biāo),。 第二種那就是Android os 在1.6以后的這種自適應(yīng)技術(shù);

  但是有些時(shí)候顯然Android提供的這種自適應(yīng)有時(shí)候我們不需要,,或者說(shuō)不太適合我們的開發(fā),,(其實(shí)這也類似于現(xiàn)在的游戲引擎,很多人都在問我開發(fā)游戲用什么引擎,,其實(shí)公司有自己的引擎,。我自己寫游戲不用引擎,因?yàn)闆]有一款游戲引擎適應(yīng)所有的游戲類型開發(fā),,例如用RPG的引擎去做個(gè)益智連連看,?是不是搞了點(diǎn) - -。..當(dāng)然現(xiàn)在市面上已經(jīng)有不少的游戲開發(fā)引擎,,但是使用別人的游戲引擎,,對(duì)于開發(fā)來(lái)說(shuō),雖然提高了開發(fā)效率,,縮短了開發(fā)周期,,但是對(duì)于其擴(kuò)展性不得不說(shuō)很是頭疼的一件事情,so~建議大家去吸收這些開源引擎的知識(shí)和技術(shù),,自己整理出一份屬于自己的游戲引擎,,畢竟自己的擴(kuò)展起來(lái)就容易多了,!而不能去一謂的去使用和強(qiáng)加灌輸別人的思維方式到自己腦中)咳咳、回到主題上來(lái),,剛才說(shuō)了,,有時(shí)候我們并不想使用Android os 提供的自適應(yīng),而是我們自己去寫自適應(yīng),,這樣更加的靈活,。

  剛才一群里的兄弟問的一問題,稍微研究下,,這里一起分享:新建的Emulator -配置為:WAGA800 其分辨率是 800*480 的設(shè)備模擬器,,當(dāng)我們程序中在取得其 Height和 Width的時(shí)候發(fā)現(xiàn),總是 320*533 ,,明顯是系統(tǒng)對(duì)我們?nèi)隽酥e,!如下圖:

  

  下面是官方文檔原文:

  http://androidappdocs.appspot.com/guide/practices/screens_support.html

  那么為什么系統(tǒng)會(huì)對(duì)其分辨率進(jìn)行撒謊呢? 其作用是什么呢,?

  簡(jiǎn)單的來(lái)說(shuō),,在SDK1.6 (sdk version 4)以后,Android 增加了新功能“支持多屏”,,所謂這項(xiàng)新功能也就是為了讓我們的游戲,、軟件能在不同的分辨率,不同機(jī)型上一樣流暢,、玩美運(yùn)行,,其作用一來(lái)減輕我們的移植工作量,二來(lái)更好的體現(xiàn)Android 越來(lái)越強(qiáng)勁的勢(shì)頭,。

  自適應(yīng)效果如下圖:(WVGA高密度(左),,中密度的HVGA(中),低密度和QVGA(右)

  

  在不同的分辨率上想玩美的跑起來(lái)一款游戲和軟件,,有兩種方式,,一種是我們做游戲的時(shí)候都做成自適應(yīng)屏幕的游戲方式,比如我們?nèi)∽鴺?biāo)都根據(jù)屏幕的寬,、高,、圖片的寬、高等等而不是寫成死的位置坐標(biāo),。 第二種那就是Android os 在1.6以后的這種自適應(yīng)技術(shù),;

  但是有些時(shí)候顯然Android提供的這種自適應(yīng)有時(shí)候我們不需要,或者說(shuō)不太適合我們的開發(fā),,(其實(shí)這也類似于現(xiàn)在的游戲引擎,,很多人都在問我開發(fā)游戲用什么引擎,其實(shí)公司有自己的引擎。我自己寫游戲不用引擎,,因?yàn)闆]有一款游戲引擎適應(yīng)所有的游戲類型開發(fā),,例如用RPG的引擎去做個(gè)益智連連看?是不是搞了點(diǎn) - -,。..當(dāng)然現(xiàn)在市面上已經(jīng)有不少的游戲開發(fā)引擎,但是使用別人的游戲引擎,,對(duì)于開發(fā)來(lái)說(shuō),,雖然提高了開發(fā)效率,縮短了開發(fā)周期,,但是對(duì)于其擴(kuò)展性不得不說(shuō)很是頭疼的一件事情,,so~建議大家去吸收這些開源引擎的知識(shí)和技術(shù),自己整理出一份屬于自己的游戲引擎,,畢竟自己的擴(kuò)展起來(lái)就容易多了,!而不能去一謂的去使用和強(qiáng)加灌輸別人的思維方式到自己腦中)咳咳、回到主題上來(lái),,剛才說(shuō)了,,有時(shí)候我們并不想使用Android os 提供的自適應(yīng),而是我們自己去寫自適應(yīng),,這樣更加的靈活,。

  下面給講解如何避開Android os的自適應(yīng)的方法:

  先來(lái)看下官方的一段話:

  

  這里是從官方文檔中截取的一段,這里是在說(shuō),,當(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后的運(yùn)行截圖:

  

  這樣就正常啦,, 這里呢我要給大家道個(gè)歉,,大家也看到了,最近也沒有更新文章,,主要原因是一個(gè)回老家過(guò)年,,今天剛回到公司第一天上班,第二點(diǎn)是由于出書的緣故,,已經(jīng)簽下了《清華出版社》的合同,,將大概在上半年完成一本關(guān)于Android 游戲開發(fā)書籍,so~大家也體諒一下我,,當(dāng)然博客我肯定是還要更新的,,不過(guò)速度不會(huì)跟以前一樣快了,。

  這里還要說(shuō)下,我寫的這21篇文章,,基本上對(duì)于學(xué)習(xí)游戲開發(fā)都是很實(shí)用很有用的,,希望大家一定要細(xì)細(xì)的看,因?yàn)椴簧偃藛柕亩际菍戇^(guò)的東西 - -;如果大家還有什么疑惑和問題可以來(lái)群里進(jìn)行交流和互相學(xué)習(xí),。

  OK 就寫到這里,,自己會(huì)盡快完成書籍,讓大家早點(diǎn)看到,。

  本文補(bǔ)充:看到有些網(wǎng)友的回復(fù),,大概還存在兩個(gè)問題。下面來(lái)逐一進(jìn)行分析,;

  第一:

  “ 一般來(lái)說(shuō)800X480的density為240,, 這樣得到的系數(shù)大小為240/160,

  所以320X533再乘上1.5就是正確的像素,,這個(gè)需要結(jié)合屏幕的density來(lái)計(jì)算,。

  ”

  這段話說(shuō)的沒錯(cuò),(公式的由來(lái)官方api 文檔中有寫)Android SDK 1.6 以上才可以通過(guò) canvas.getDensity(); 得到密度,,canvas.setDensity(240);設(shè)置密度,,但是很多群友設(shè)置過(guò)密度的都知道這根本沒有任何的效果。然后我就想通過(guò)利用比值去對(duì)canvas進(jìn)行縮放處理處理畫布使其回到正確的分辨率(像素),,雖然目的達(dá)到了,,但是發(fā)現(xiàn)失真效果很嚴(yán)重。所以我認(rèn)為還是用xml定義minSdkVersion 的方式方便,、實(shí)用,。但是又出現(xiàn)了下一個(gè)問題:

  第二:

  “ 《uses-sdk android:minSdkVersion=“4” /》 ,加了這句話之后SDK=3時(shí)候(也就是SDK 1.5的時(shí)候),,

  做出來(lái)的APK不就裝不成了嗎,?

  ”

  沒錯(cuò),我們一旦定義了應(yīng)用程序運(yùn)行的最低版本,,那么低于此版本的都無(wú)法安裝此應(yīng)用,,但是除了利用密度比值,現(xiàn)在我也沒有其好的解決方案,。

  總結(jié):先說(shuō)一句,,我們這種使用定義應(yīng)用程序運(yùn)行的最低版本的方式來(lái)解決,存在兩種弊端:

  第一: 低于1.6sdk無(wú)法安裝程序,。

  第二:影響高版本的功能,,例如我們的BlueTooth(藍(lán)牙)是在2.0+的api中才有的。

  但是可以利用密度比值,但是最好不要,,畢竟失真嚴(yán)重,。

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載,。