李华明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"
这些是一些开关,好比是否支持小屏幕、是否支持任意密度等等,可是经过尝试发现效果不理想,甚至没效果;
多是使用的方法不对,但愿对这方面比较深刻探究的童鞋能够将心得分享出来供你们讨论学习;
若是各位童鞋还有什么的好的建议和方法能够通知我、谢谢。