让屏幕终极旋转控制已付费版的软件

碎片化既是 Android 的优势和弱点,也是开发者们头疼的问题,同时也为 Android 的全球影响力提供了基础。Android 设备的外形和尺寸各不相同,性能水平和屏幕尺寸也都大不相同。此外,有许多不同版本的 Android 在任何时候都同时处于活动状态,增加了另一层的碎片化。这意味着,开发各种Android设备的应用程序将是极具挑战性和耗时的。

今年,我们看到了之前报告中出现的趋势的延续;更多的设备和更多的设备之间的区别。今年我们注意到的一件大事是品牌的碎片化,今年有超过1000个品牌被发现,我们在2012年第一次发布这个报告时没有看到。三星仍然是市场领头羊的,在全球安卓设备市场的份额从43%降至/apk/res/android"

打开Android Studio的内存检测,检查耗费的内存,如图

可以看到,这个1.4MB的图片运行到这个手机上所消耗的内存是8.95MB。

接下来,咱们把这个图片移动到mipmap-xhdpi文件夹下面。运行后,监测内存情况如下:

可以看到,这个1.4MB的图片运行到这个手机上所消耗的内存是18.83MB。
继续放进mipmap-hdpi文件夹下面时,情况如下:

可以看到,这个1.4MB的图片运行到这个手机上所消耗的内存是32.67MB。
继续放进mipmap-mdpi文件夹下面时,情况如下:

可以看到,这个1.4MB的图片运行到这个手机上所消耗的内存是72.23MB。

为什么都是同一张图片,什么都没改,只是换了个文件夹而已,它就有这么大的区别呢?
这张图片是1.4Mb,我们启动的模拟器参数如下:

同一张图片不同分系统手机占用内存情况.png

根据前面所讲的屏幕像素密度计算公式可以得出该模拟器的屏幕像素密度是445,这就意味着它对应的xxhdpi,它会优先去加载此文件夹下面的图片。

因此当我们把图片放到xxhdpi文件夹下面时,系统第一优先找的是这个文件夹,这是有好处的,好处就是节省内存,从上图也可以看出,的确如此。这就是为什么我们要在对应的文件夹下面放对应分辨率图片的好处,就是占用内存小。这就是好处,至于为什么会出现这么大的差别,我们这样来分析。

当前图片1.4Mb,放到相应文件夹下面时占用内存不同

首先这张图片理应消耗的内存是8.97Mb-1.4Mb=7.6Mb (在手机里占用的内存-图片自身的大小)

得出该图片大约为8Mb,分析其他几种情况:


当放到mdpi下时,按照2:3:4:6:8的比例,mdpi跟xxhdpi的比例是2:6,我们的模拟器是xxhdpi的,在去mdpi文件夹里找图片时会自动转换,转换的比例就是2:6。也就是1:3的关系,既然如此,宽是3倍,高是3倍,自然一张图就变成了9倍。

虽然在Android7.+系统下每个阶段差不多比Android5.+和6.+多出了4M左右的内存,但是不影响结果。

总结:由此可见,一张图片放到正确的文件夹里面是多么的重要,由此你是否明白Google为什么造了那么多套ic_launcher的图片了吧。

那我们开发的图片到底是放在mipmap目录还是放在drawable目录下呢?

但是用mipmap系统会在缩放上提供一定的性能优化。

Android里有9patch图的概念,也就是.9图,能够自动拉伸你指定的地方,这其实是一种格式特殊的png文件,能指明可以拉伸以及不可拉伸的区域,同时还可以把显示内容区域的位置标示清楚。

.9图的有两条线必须画,就是左边和上边,否则会报错。
上图的红色区域就是图片会被拉伸的区域,其他地方不会发生任何变化,这个时候,一个简单的.9图就制作完成了。

我们控制这张图片哪些区域可以缩放,缩放的区域就是两条黑边的交集,即中间位置的红框。

我们需要提供备用位图(符合屏幕尺寸的图片资源)
由于 Android 可在各种屏幕密度的设备上运行,因此我们提供的位图资源应该始终可以满足各类密度的要求:

密度类型 代表的分辨率(px) 系统密度(dpi)

根据以下尺寸范围针对各密度生成相应的图片。

即一套分辨率=一套位图资源

接下来将生成的图片文件放在 res/ 下的相应子目录中(mdpi、hdpi、xhdpi、xxhdpi),系统就会根据运行您应用的设备的屏幕密度自动选择合适的图片

最后通过引用 @mipmap/id,系统都能根据相应屏幕的 屏幕密度(dpi)自动选取合适的位图。

如果是.9图或者是不需要多个分辨率的图片,放在drawable文件夹即可对应分辨率的图片要正确的放在合适的文件夹,否则会造成图片拉伸等问题。
更好地方案解决“图片资源”适配问题

上述方案是常见的一种方案,这固然是一种解决办法,但缺点很明显:

1.每套分辨率出一套图,为美工或者设计增加了许多工作量

那么,有没有一种方法:

使得apk包不变大(只使用一套分辨率的图片资源)

下面我们就来介绍这个方法:

只需选择唯一一套分辨率规格的图片资源
Google官方给出的高清设计图尺寸有两种方案,一种是以mdpi设计,然后对应放大得到更高分辨率的图片,另外一种则是以高分辨率作为设计大小,然后按照倍数对应缩小到小分辨率的图片。
推荐使用第二种方法,因为小分辨率在生成高分辨率图片的时候,会出现像素丢失。
而分辨率可以以或者是作为主要分辨率进行设计。

首先来理解下Android 加载资源过程

Android SDK会根据屏幕密度自动选择对应的资源文件进行渲染加载(自动渲染)

比如说,SDK检测到你手机的分辨率是320x480(dpi=160),会优先到mipmap-mdpi文件夹下找对应的图片资源;

但假设你只在xhdpi文件夹下有对应的图片资源文件(mdpi文件夹是空的),那么SDK会去xhdpi文件夹找到相应的图片资源文件,然后将原有大像素的图片自动缩放成小像素的图片,于是大像素的图片照样可以在小像素分辨率的手机上正常显示。

所以理论上来说只需要提供一种分辨率规格的图片资源就可以了。

那么应该提供哪种分辨率规格呢?

如果只提供ldpi规格的图片,对于大分辨率(xdpi、xxdpi)的手机如果把图片放大就会不清晰

所以需要提供一套你需要支持的最大dpi分辨率规格的图片资源,这样即使用户的手机分辨率很小,这样图片缩小依然很清晰。

xhdpi分辨率以内的手机需求量最旺盛
目前市面上最普遍的手机的分辨率还多集中在720x1080范围内(xhdpi),所以目前来看xhdpi规格的图片资源成为了首选。
而且很多公司为了保持App不同版本的体验交互一致,可能会以iPhone手机为基础进行设计,包括后期的切图之类的。
iPhone主流的屏幕dpi约等于320, 刚好属于xhdpi,所以选择xhdpi作为唯一一套dpi图片资源,可以让设计师不用专门为Android端切图,直接把iPhone的那一套切好的图片资源放入mipmap-xhdpi文件夹里就好,这样大大减少的设计师的工作量!

我们总是在xml布局里写dp,dp到底是什么意思呢?

这是Android开发中特有的一种度量,称作屏幕无关像素,它不表示任何具体的长度或者像素点,这个值只有在具体屏幕密度的手机上,才会被转换为具体的像素值。

它跟px不一样,咱们在xml里面写上px,那无论运行到任何设备上,就是固定的px,不会发生什么变化,但是dp就不一样了。

比如拿以下几种来说明一下。

分辨率(px) 系统密度(dpi)

1dp转换的px是多少呢?

比如现在有这么个需求,要求一个控件的宽度占屏幕的一半,我们用dp怎么来实现呢?

首先进行计算,比如320x480,它的宽是320个px,那我们就要写160px,用dp来表示就是160dp。所以我们可以在xml布局里写160dp就可以了,同样的方式试一试其他的手机:

再来试一试480x800,想在这种手机上也占一半,必须是240px,而咱们写的是160dp,它转换的px就是 160dp*240/160=240px,刚好也能符合需求。

其实Google出dp这个东西本身就能达到适配的概念,你看,咱们写了一个160dp,跑到这几种手机上都能达到需求,这不就是适配了吗?

但是我之所以提出来了,就说明dp并不能保证完美适配,比如咱们试试720x1280。
720的一半是360px,而咱们写的160dp,转换的px是160dp*320/160=320px,明显就不是一半,差了40px。也就是说咱们的代码运行到这种手机上的时候就没有适配好,没有达到需求。

由此可见,当在240x320,320x480,480x800上面的时候写160dp是正常的,可以满足需求。而在720x1280,上面却不能完美适配。

问题抛出来了,该怎么解决这个问题呢?

反过来算一下,如果我们写180dp,那在720p上转换的像素是180dpx320/160=360px,是720的一半,换到1080p上,180dpx480/160=540px,刚好是1080的一半,那也就是说,咱们写 180dp就可以实现了需求,那咱们就可以在xml布局里这么写:

可是,这么一写又有问题出现了,在240x320,320x480,480x800上面又坏了,这可怎么办呢?

Android 的values文件夹下面可以创建一个dimens的文件。这个dimens的作用就跟mipmap和drawable的引用方式一样,可以通过@dimens/xxx的方式来引用。我们的思路就是创建多套dimens,然后xml布局引用dimens,当运行到不同的手机上时,系统会自动去寻找相应的dimens,去加载我们提前准备好的dp值,图文教程:

同时再打开values-文件夹下面的dimens,创建一个相同的名为 item_width,但是值为180dp,如图:

做好了这些之后,接下来我们需要在xml布局里引用,还记得之前的TextView的width写的多少吧?

之前写的是160dp,是一个固定值,而现在就不能这么写了,我们需要写成“@dimen/item_width”,这个什么意思呢?其实这里只是一个引用,当我们点击想看看具体是多少的值的时候,会发现这样的情况,如图:

这个意思就是,当前我们写的“@dimen/item_width”引用了三个地方,问我们想去查看哪一个文件夹下面的dimens。

做好了这一切之后,这个TextView的值就是一个变的,下次再运行到手机上的时候,720p手机上运行时TextView的宽度就是180dp,1080p手机上也是180dp,其他的手机就是160dp(因为我们没有创建其他分辨率的文件夹,所以会走默认的values)。
这就达到了指定机型的屏幕适配。

虽然上述的dimens+dp能达到适配的目的,但是项目中如果要适配市场上常见的机型时,我们只能一个个的去计算,然后写上我们计算好的dp值,而且ui妹子在效果图上标记的都是px,我们还要根据这个再计算转换,很麻烦,有没有那种一劳永逸的?

参考了hongyang的博客之后,有这么一套适配方案,如下:
思路:把任何设备的手机宽度像素均分为320份,高度像素均分为480份,使用我们写好的程序自动生成资源values-***×***文件夹,里面包含lay_x.xml和lay_y.xml,分别对应宽度和高度的像素。

我们直接在dimens里面写上具体的px值,而不是dp值,这样给定一个写死的值,在手机上运行的时候就是我们所写上的px值。可能到这里各位又有疑问了,这样的话怎么做到适配的呢?别着急,我们假设手机屏幕的宽度都是320某单位,那么我们将一个屏幕宽度的总像素数平均分成320份,每一份对应具体的像素就可以了。

我们可以创建多个values文件夹,多到覆盖市面上绝大多数流行的手机机型,并且用相应的比例计算好px值,由于现在是以320x480为基准的,所以如果我们要编写其他的values,要进行如下计算,比如我们以为例:

由于基准是320x480,所以.375px,px,所以相应文件应该是这样的

我们可以按照这种计算的方式补全当今市面上流行的机型。

但是我们怎么可能会去做这么蠢的事呢?肯定有工具类之类的东西!在此,再次感谢hongyang提供的工具类。

代码应该很好懂,我们将一个屏幕宽度分为320份,高度480份,然后按照实际像素对每一个单位进行复制,放在对应values-widthxheight文件夹下面的lax.xml和lay.xml里面,这样就可以统一所有你想要的分辨率的单位了,无论在什么分辨率下,x320都是代表屏幕宽度,y480都是代表屏幕高度。

当执行了上述代码之后,会在本地生成很多个values文件夹,我们把这些values拷贝到项目的res下面,如下所示:

因为对于没有生成对应分辨率文件的手机,会使用默认values文件夹,如果默认values文件夹没有(即没有对应的分辨率、没有对应dimen)就会报错,从而无法进行屏幕适配。
(注意对应单位改为dp,而不同于上面的px。因为不知道机型的分辨率,所以默认分辨率文件只好默认为x1=1dp以保证尽量兼容(又回到dp老方法了),这也是这个解决方案的一个弊端)

工作中只需要根据UI妹子给出的某一个分辨率设计图的尺寸,然后找到对应像素数的单位,然后设置给控件就可以了,如下:

最后:本文非原创,大部分资料来源于大神的博客,这里只是作为一个归纳,希望更多的同学能够学习到屏幕适配的知识,也算是自己学习的一个笔记记录。感谢下面的大神:

}

【终极旋转屏幕.apk】文件大小:768.06 KB,浏览次数:144 次,由分享达人 wo****ing 于 上传到百度网盘。此页面由蜘蛛程序自动抓取,以非人工方式自动生成,只作交流和学习使用。盘搜搜本身不储存任何资源文件,其资源文件的安全性和完整性需要您自行判断,感谢您对盘搜搜的支持。

}

终极旋屏控制汉化版app是一款实用系统工具。为你提供专业便捷的设备屏幕旋转自由控制服务。你可以根据你的喜好随意设置屏幕,让你的实用 更加的舒适,给你不一样的用户体验,更加的智能化、人性化。你还在等什么,抓紧下载吧!!!

1、真正的屏幕方向锁定

3、单独为每个应用程序设置屏幕旋转方式

4、两类窗口小部件和状态栏通知,带有快捷方式按钮,可以轻松更改您的屏幕旋转方式设置

1、支持创建指定屏幕旋转方式的快捷方式- Android 4.x/Holo风格用户界面,简洁美观

2、支持通过Taker/Locale集成来自动设置屏幕方向支持的模式:

自动:普通的自动旋转屏幕方式,不会覆盖应用程序设置

强行自动:强行自动旋转屏幕方式,但会覆盖应用程序设置

3、锁定:真正的将屏幕锁定为当前的方向

竖屏:真正的锁定屏幕为竖屏方向

横屏:真正的锁定屏幕为横屏方向

反向竖屏:真正的锁定屏幕为反向竖屏方向

反向横屏:真正的锁定屏幕为反向横屏方向

自动竖屏:自动在竖屏和反向竖屏之间选择

自动横屏:自动在横屏和反向横屏之间选择

4、手动:普通的手动模式,不会覆盖应用程序设置

1、修复一些设备上和亮度控制冲突的问题

2、修复多处小问题更多汉化信息

3、增加日语和韩语翻译

}

我要回帖

更多关于 终极旋转控制已付费版 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信