开发者社区> 余二五> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

【Android游戏开发二十一】Android os设备谎言分辨率的解决方案!

简介:
+关注继续查看

刚才一群里的兄弟问的一问题,稍微研究下,这里一起分享:新建的Emulator -配置为:WAGA800 其分辨率是 800*480 的设备模拟器,当我们程序中在取得其 Height和 Width的时候发现,总是 320*533 ,明显是系统对我们撒了谎!如下图: 

 

 下面是官方文档原文: 

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

 那么为什么系统会对其分辨率进行撒谎呢? 其作用是什么呢?

     单的来说,在SDK1.6 (sdk version 4)以后,Android 增加了新功能“支持多屏”,所谓这项新功能也就是为了让我们的游戏、软件能在不同的分辨率,不同机型上一样流畅、玩美运行,其作用一来减轻我们的移植工作量,二来更好的体现Android 越来越强劲的势头。

     适应效果如下图:(WVGA高密度(左),中密度的HVGA(中),低密度和QVGA(右)

 

     不同的分辨率上想玩美的跑起来一款游戏和软件,有两种方式,一种是我们做游戏的时候都做成自适应屏幕的游戏方式,比如我们取坐标都根据屏幕的宽、高、图片的宽、高等等而不是写成死的位置坐标。 第二种那就是Android os 在1.6以后的这种自适应技术;

     但时候显然Android提供的这种自适应有时候我们不需要,或者说不太适合我们的开发,(其实这也类似于现在的游戏引擎,很多人都在问我开发游戏用什么引擎,其实公司有自己的引擎。我自己写游戏不用引擎,因为没有一款游戏引擎适应所有的游戏类型开发,例如用RPG的引擎去做个益智连连看?是不是搞了点 - -...当然现在市面上已经有不少的游戏开发引擎,但是使用别人的游戏引擎,对于开发来说,虽然提高了开发效率,缩短了开发周期,但是对于其扩展性不得不说很是头疼的一件事情,so~建议大家去吸收这些开源引擎的知识和技术,自己整理出一份属于自己的游戏引擎,毕竟自己的扩展起来就容易多了!而不能去一谓的去使用和强加灌输别人的思维方式到自己脑中)咳咳、回到主题上来,刚才说了,有时候我们并不想使用Android os 提供的自适应,而是我们自己去写自适应,这样更加的灵活.

   下面给讲解如何避开Android os的自适应的方法:

   先来看下官方的一段话: 

     这里是从官方文档中截取的一段,这里是在说,当Android sdk的版本是4或更低与版本为5或更高的之间的区别;

    那么从这里可以得知Android sdk 1.6(version 4)之前是不支持自适应的,那么解决的方法也就有了;

     我们只需要在AndroidMainFest 中,定义 <uses-sdk android:minSdkVersion="4" /> 就OK了!

 

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     package="com.desmo.testAd" android:versionCode="1" android:versionName="1.0"> 
  4.     <application android:icon="@drawable/icon" android:label="@string/app_name"> 
  5.         <activity android:name=".Test" android:label="@string/app_name"> 
  6.             <intent-filter> 
  7.                 <action android:name="android.intent.action.MAIN" /> 
  8.                 <category android:name="android.intent.category.LAUNCHER" /> 
  9.             </intent-filter> 
  10.         </activity> 
  11.     </application> 
  12.     <uses-sdk android:minSdkVersion="4" /> 
  13. </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"

    这些是一些开关,比如是否支持小屏幕、是否支持任意密度等等,但是通过尝试发现效果不理想,甚至没效果;

    可能是使用的方法不对,希望对这方面比较深入探究的童鞋可以将心得分享出来供大家讨论学习;

    如果各位童鞋还有什么的好的建议和方法可以通知我、谢谢。










本文转自 xiaominghimi 51CTO博客,原文链接:http://blog.51cto.com/xiaominghimi/606925,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Android设备唯一标识的获取和构造
设备唯一标识对于app开发是很重要的一个点,主要应用于统计,有时也应用于业务。 Android平台提供了很多获取唯一标识的API,但都不是很稳定。 一、获取唯一标识 Android开发者网站上的一篇文章Identifying App Installations给出了几种获取方式; 中文博文也有很多,这是其中一篇 Android获取设备唯一ID的几种方式。
1423 0
Android设备的唯一标识
Android设备的唯一标识 IMEI 权限 获取IMEI /** * 获取IMEI * * @return IMEI */ private String ...
815 0
【Android 应用开发】Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片
【Android 应用开发】Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片
83 0
.NET(WinCE、WM)开发转Android开发 ——Xamarin和Smobiler对比
WinCE从1995年诞生至今,已有20多年的发展历史,行业成熟方案覆盖范围广,从车载、工控、手持机都有涉及,且方案成熟。 近些年,Android以后来居上的态势,逐渐渗透至各行业领域,硬件手持大厂也把产品线重心向Android手持迁移,基于Android的行业解决方案越来越成熟,WinCE的开发人才流失,在WinCE解决方案上吃老本的企业寻求转型。
1423 0
Android高级开发之【RxJava】详解(附项目源码)
文章大纲 一、什么是RxJava 二、为什么要用RxJava 三、RxJava使用详解 四、项目源码下载 一、什么是RxJava Rx(Reactive Extensions)是一个库,用来处理事件和异步任务,在很多语言上都有实现,RxJava是Rx在Java上的实现。
873 0
如何使用Android Studio在安卓平台对Unity开发的应用进行性能检查?
如何使用Android Studio在安卓平台对Unity开发的应用进行性能检查?前言大家常常会抱怨安卓平台没有一个统一、好用的性能检查工具。不能像iOS的instrument那样方便。 图片来自:Instruments Help 比如,Unity Blog在3年前就已经教大家如何使用instrument来进行性能检测了。
1816 0
Android开发十年,到中年危机就只剩下这套移动架构体系了!
蓦然回首自己做开发已经十年了,这十年中我获得了很多,技术能力、培训、出国、大公司的经历,还有很多很好的朋友。但再仔细一想,这十年中我至少浪费了五年时间,这五年可以足够让自己成长为一个优秀的程序员,可惜我错过了,我用这五年时间和很多程序员一样在困惑和迷茫中找不到出路! 路其实一直都在那里,只是我们看不到而已! 以前我一直被公司和技术牵着走,并不是自己在选择技术,而是不自觉地被推到了这个位置上。
2530 0
金三银四,冲击大厂,你值得拥有的一份2019初中级Android开发社招面试总结+解答
引言 2017年初Android市场饱和的传言一度甚嚣尘上。2018年经济寒潮下,众多大厂和曾经风口上的互联网企业也不得不裁员自保,通过小程序、前端渲染以达到原生的实现。 面对外界的纷繁复杂和技术栈的日新月异,我们更应该清楚认识到自身技术的短板来进行知识巩固。
2055 0
Android开发学习之使用Toolbar实现不同的Fragment使用不同颜色的标题栏与状态栏
Android开发学习之使用Toolbar实现不同的Fragment使用不同颜色的标题栏与状态栏                                            先看效果图。
2510 0
从零开始完成一个Android JNI开发
背景 最近的一个项目需要用到Android JNI开发,在这里记录了一下如何从零开始完成一个JNI开发。 我们知道,Android系统本身是包括Java层和C层两部分的,相应的Android开发也分SDK开发和NDK开发两种,SDK开发是Java代码,NDK开发则是C/C++代码,他们之间通过JNI接口来交互,Java代码可以调用外部的本地代码, 外部的C/C++ 代码可以调用Java代码。
1870 0
+关注
20376
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载