十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
一:不同的layout
创新互联公司专业为企业提供南开网站建设、南开做网站、南开网站设计、南开网站制作等企业网站建设、网页设计与制作、南开企业网站模板建站服务,十年南开做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
Android手机屏幕大小不一,有480x320, 640x360, 800x480.怎样才能让App自动适应不同的屏幕呢?
其实很简单,只需要在res目录下创建不同的layout文件夹,比如layout-640x360,layout-800x480,所有的layout文件在编译之后都会写入R.java里,而系统会根据屏幕的大小自己选择合适的layout进行使用。
二:hdpi、mdpi、ldpi
在之前的版本中,只有一个drawable,而2.1版本中有drawable-mdpi、drawable-ldpi、drawable-hdpi三个,这三个主要是为了支持多分辨率。
drawable- hdpi、drawable- mdpi、drawable-ldpi的区别:
(1)drawable-hdpi里面存放高分辨率的图片,如WVGA (480x800),FWVGA (480x854)
(2)drawable-mdpi里面存放中等分辨率的图片,如HVGA (320x480)
(3)drawable-ldpi里面存放低分辨率的图片,如QVGA (240x320)
系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片。
更正:应该是对应不同density 的图片
在开发程序时为了兼容不同平台不同屏幕,建议各自文件夹根据需求均存放不同版本图片。
[i]备注:三者的解析度不一样,就像你把电脑的分辨率调低,图片会变大一样,反之分辨率高,图片缩小。 [/i]
屏幕方向:
横屏竖屏自动切换:
可以在res目录下建立layout-port-800x600和layout-land两个目录,里面分别放置竖屏和横屏两种布局文件,这样在手机屏幕方向变化的时候系统会自动调用相应的布局文件,避免一种布局文件无法满足两种屏幕显示的问题。
不同分辨率横屏竖屏自动切换:
以800x600为例
可以在res目录下建立layout-port-800x600和layout-land-800x600两个目录
不切换:
以下步骤是网上流传的,不过我自己之前是通过图形化界面实现这个配置,算是殊途同归,有空我会把图片贴上来。
还要说明一点:每个activity都有这个属性screenOrientation,每个activity都需要设置,可以设置为竖屏(portrait),也可以设置为无重力感应(nosensor)。
要让程序界面保持一个方向,不随手机方向转动而变化的处理办法:
在AndroidManifest.xml里面配置一下就可以了。加入这一行android:screenOrientation="landscape"。
例如(landscape是横向,portrait是纵向):
Java代码:
?xml version="1.0" encoding="utf-8"?
manifest xmlns:android=""
package="com.ray.linkit"
android:versionCode="1"
android:versionName="1.0"
application android:icon="@drawable/icon" android:label="@string/app_name"
activity android:name=".Main"
android:label="@string/app_name"
android:screenOrientation="portrait"
intent-filter
action android:name="android.intent.action.MAIN" /
category android:name="android.intent.category.LAUNCHER" /
/intent-filter
/activity
activity android:name=".GamePlay"
android:screenOrientation="portrait"/activity
activity android:name=".OptionView"
android:screenOrientation="portrait"/activity
/application
uses-sdk android:minSdkVersion="3" /
/manifest
另外,android中每次屏幕的切换动会重启Activity,所以应该在Activity销毁前保存当前活动的状态,在Activity再次Create的时候载入配置,那样,进行中的游戏就不会自动重启了!
有的程序适合从竖屏切换到横屏,或者反过来,这个时候怎么办呢?可以在配置Activity的地方进行如下的配置android:screenOrientation="portrait"。这样就可以保证是竖屏总是竖屏了,或者landscape横向。
而有的程序是适合横竖屏切换的。如何处理呢?首先要在配置Activity的时候进行如下的配置:android:configChanges="keyboardHidden|orientation",另外需要重写Activity的 onConfigurationChanged方法。实现方式如下,不需要做太多的内容:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
// land do nothing is ok
} else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
// port do nothing is ok
}
}
写一个支持多分辨的程序,基于1.6开发的,建立了三个资源文件夹drawable-hdpi drawable-mdpi drawable-ldpi,里面分别存放72*72 48*48 36*36的icon图标文件。当我在G1(1.5的系统)上测试时,图标应该自适应为48*48才对啊,但实际显示的是36*36。怎么才能让其自适应 48*48的icon图标呢
解决办法 drawable-hdpi drawable-mdpi drawable-ldpi改成drawable-480X320 drawable-800X480的多分辨支持的文件夹
早在谷歌宣布Android P的名字之前,该公司就在用最新版本的移动操作系统来宣传人工智能。两个最有趣的“AI特性”是自适应电池和自适应亮度。默认情况下,两个都在PUI上,可以很容易地被禁用(设置= 电池= 自适应电池和设置=显示=自适应亮度),并在后台自动工作-机器学习处理所有的重举。
然而,到目前为止,Google还没有分享关于这两个功能到底如何发挥作用的信息,也没有分享Android用户可能看到的影响。这很有道理——公司的内部dogfood号码不一定具有代表性,而且在beta测试程序期间有很多迭代(Android Pie看到了5个开发人员预览)。但三周前,Android派最终定稿,并慢慢开始推出,所以我们赶上了谷歌来谈论细节。
小组产品经理Ben Poiesz负责一个负责Android智能特性的团队,他和我们一起坐下来解释Adaptive Battery和Adaptive Brightness是如何产生的,Google在Android P测试版中看到了什么,以及这些特性的内部工作原理。每个Android设备用户都有自己独特的偏好和用例,但是没有哪个头脑正常的人想积极地优化电池寿命和屏幕亮度,他们也不应该这么做。
Poiesz的团队与谷歌,AI公司,谷歌在2014年1月收购了这两个特点。这不是一个短的项目---早期头脑风暴和在android O 2017年8月发货之前调查。
“Android和深渊团队都在伦敦出现,”Poiesz说。“他们在同一栋楼,只是不同的楼层。它使我们紧密合作,找出正确的策略是什么,什么是正确的API,并建立一些东西。每个人都有很多人,但不幸的是我不能说出确切的数字。”
Poiesz分享数据的地方,你应该记住,我们讨论的是Android P测试版,它比之前的Android测试版要多,因为它不仅限于Google手机,还包括来自索尼、小米、诺基亚、Oppo、Vivo、OnePlus和Es.al的设备。
Poiesz确实注意到,Android P的公开推出可能由于自选偏向而影响自适应电池和自适应亮度的结果。注册测试版的用户与广大的Android用户不一样——他们以不同的方式使用他们的设备,安装不同的应用程序,等等。这就是说,Poiesz承诺贝塔人口“给了我们统计上显著的结果”。
下面是Poiesz如何解释这个特征背后的想法。
“不幸的是,直到P,对于所有的人来说,由于他们选择安装的应用程序,或者bug,或者不管它是什么,都非常小心手机的电池寿命,”他说。这是Android用户不应该考虑的事情,Poiesz认为,但Android应该负责。
谷歌多年来为Android发布了各种电池寿命特性,如DoZE和App Stand。然而,Android Poice中的自适应电池的所有基础工作都是在Android ORIO中进行的,背景执行限制。
当应用程序以Oreo为目标时,与后台服务相反,它们必须依靠使用作业和警报(这些作业和警报有时限,但是没有严格定义的开始和停止时间)来完成后台工作。随着越来越多的开发人员采用这种方式,自适应电池等功能将变得更加有效。
“所以Android P的自适应电池真的在考虑‘操作系统是否可以提供对您正在使用哪些应用程序以及如何与它们进行交互的独立审计?Poiesz解释道。“然后看看这些应用程序希望如何运行,然后做出更明智的决定……那么,我们应该什么时候运行作业?”我们应该什么时候报警?这个应用程序应该如何在后台进行处理?是否应该允许它停电或等到它上电或等待一些特殊情况才有意义?如果操作系统具有这种谨慎性,用户就不必担心。这是自适应电池的主要目标——为设备带来一致性。”
一致性并不一定意味着电池的全面消耗会越来越慢。这意味着消除你用完果汁的日子。
Poiesz指出:“如果你每个月只有一个坏电池,你就会记住一个糟糕的一天。”“你也许每隔一天都表现得很好,但如果是在你脑海深处,那就是‘对我而言可能失败’——那是个压力源。”这是首要目标,就是要达到这样的稳定水平,这样你可以在设备上安装的单个应用程序就不会耗尽你的电池。”
自适应电池使用深度卷积神经网络来预测在未来几个小时内您将使用哪些应用程序,以及哪些应用程序可能直到稍后才会使用。DeepMind尝试了不同的策略,但是选择了一个卷积神经网络,因为它在做出正确的决策和使用最少的功率开销之间提供了正确的平衡。这个团队依靠DeepMind来选择正确的机器学习方法,然后为Android构建一些定制的东西,但是从一开始就不清楚AI会扮演什么角色。
也许Android P可以简单地使用经典的启发式算法来节制哪些应用程序呢?如果一个应用程序在后台运行,这无疑是浪费电力,也许操作系统可以推迟它直到用户插入他们的设备。以Android不破坏应用程序的方式完成这个任务是很棘手的,但是一旦实现了,就归结为调整启发式。下一步是问几个机器学习专家,如果问题是合适的。
他们看着它说:“是的,我们认为我们可以在这里做一些事情。”Poiesz解释道。“所以我们建立了这样一个模型,在那里他们与基线启发式竞争”。今天的基线启发式算法。他们的目标是,我们必须比基线更好,所以这意味着机器学习不仅必须做更好的预测,它还必须做足够的更好的预测来超过运行机器学习模型的成本。它必须做得更好,而不是更好一点。他们能做到。他们热衷于“机器学习不仅仅是机器学习”这一概念。它必须是有意义的。”
在今年早些时候的I/O开发者大会上,Google分享的数字(减少了30%的“应用程序CPU唤醒”)是基于内部dogfooding。但这只是一个模糊的度量,现在测试版已经上线,公司基于更广泛的测试人群有了具体的结果:
对于5%个数字来说,理论上来说,DeepMind团队取得的成绩更大。实际上,运行机器学习模型的成本是必须考虑的因素。
关于第二个数字,我要求更多的上下文。
Poiesz说:“假设你有一个应用程序进行大量的处理,它有一个预定的工作。”“你不使用那个应用程序,但它继续进行处理。这个系统会扼杀这个应用程序直到你打开电源。当你处于电源状态时,所有被拔掉的CPU都可以被推到电源上。那只是直接储蓄。因为当你插上电时,你所做的任何事情都是储蓄。它高度依赖于应用程序所做的事情。你可以有一个不使用背景的应用程序,所以节省是零。你也可以有一个在后台工作时非常积极的应用程序,你可以节省很多钱。”
有趣的是,移动数据的节省不是一个目标,但是如果你考虑一下,储蓄是有意义的。“如果应用程序在拔出时运行较少,这意味着它们也不会传输。数据也是力量。因为当你要调出调制解调器的时候,你将进入广播状态,这就需要力量。但这也导致了消费者数据计划的节省。
这些数字听起来不错,但这些好处要花多长时间才能生效呢?
“对于自适应电池,你可以立即看到它,因为有些规则是根本不同的。有一个基本模型,所以今天,如果你有一个新的电话上奥利奥,你不会有任何应用程序得到这些限制。当为P加载基本模型时,没有什么比这更宽松了,因为这些规则以前不存在,所以它显式地更具限制性。这样你就会立刻得到一笔存款,然后它会继续精益求精。
你可以认为自适应亮度是自动亮度。它通过学习如何在不同的环境下设置你的亮度滑块来学习你的习惯,然后试着为你做。
一般用户需要多长时间才能看到收益?“我的个人经历大约是一个星期,当我感觉我不再在调整它时,”Poiesz说。“你不会觉得情况更糟,这正是我们真正想要解决的问题——当你得到升级时,你不会觉得那里有降级。只是当你和它互动时,它会变得更好。我发现一个星期后,我觉得我几乎没碰它。”
PoeSz不能为所有用户提供答案很简单:每个人都是不同的。自适应亮度大约需要一周左右的时间来稳定,但是只要用户正在进行交互,它就可以持续学习。如果你接近基线模型,它可以花费更少的时间。如果你走得很远,可能会更长。
“用户对亮度有不同的偏好,”Poiesz解释说。“在基于机器学习的新策略出现之前,我们所采用的亮度策略还让人们不得不稍微对设置进行混淆。我们设置曲线的方式并不理想——在中间位置仍然非常好,但是到了极端情况,比如在漆黑或死光中,用户很难优化两种场景。你必须把系统推向光明的一面,或者把系统推向黑暗的一面。自适应亮度能够更有效地利用全谱。在用户给它足够的输入之后,它在优化极端之间的曲线以及您想要走多远极端方面变得越来越好。”
所有这些都是棘手的,因为谷歌同时试图改善电池寿命。要不断地了解最佳亮度设置在不排水的情况下对每种情况都是不容易的。
Poiesz说:“这样做的目的并不一定是为了节省电力,因为任意节省电力会使用户不高兴,因为他们不能很好地看到屏幕。”“这是为了让屏幕上的电源,用户需要在屏幕上感觉舒适。”
换句话说,Google发现,当用户将设备的动态亮度曲线改变为亮或暗时,系统在识别光谱的一端方面变得更好,而在另一端同时变得更差。机器学习模型在频谱的两端同时更加智能,而不是偏向于某一个或另一个。
与自适应电池不同,自适应亮度不需要输入,只需要使用Android设备。
“基线模型,我们在那里,如果你想要一些不同的东西,那就是当你必须给它输入…通过与滑块互动。”一旦你一天到晚都给它反馈——大多数人已经把滑块弄乱了,这未必是一个新现象——那么它会变得更好,你与它互动的需求会越来越低。”
总的来说,Poiesz的团队看到人们在测试期间对滑块所做的调整减少了10%,只是在用户进入和改变亮度的次数方面。此外,用户总体上分享关于亮度特征的正反馈。同时,这是至关重要的——从整体上看,Android并没有使用更多的电力。
“如果你过火,人们很好。通常情况下,除非你在黑暗中,如果你有点太亮,那就没什么大不了的。如果你太昏昏沉沉,这是个问题。如果我们……避免太暗,也不用太亮而矫正过度,那么用户感知是“哇,这是一个更好、更亮的屏幕”,尽管在现实中,这可能不是正在发生的事情;您可能只是更准确。这就是我们的发现:我们的总动力是一样的。”
所有的机器学习都为球队带来了一个有趣的发现:奥利奥的模型太黯淡了。这意味着,即使你不调整滑块很多(或根本),馅饼应导致更好的亮度体验。研究小组发现,你自然能够找到认为奥利奥的模型还不错的人,但总体来说,它需要改进。
“新的基线显示出更高的亮度。这有助于作为起点。现在我们可以更有效地使用全范围和这些自动模式,因为算法更好,再加上更好的基础,让人们觉得他们的手机更亮,即使不是这样。”
简而言之,馅饼的底线比奥利奥的更亮,新的模型知道它需要暗淡的区域。请记住,很多时候,您的屏幕可能被设置成比您自己设置要暗得多,有时人们只是提高亮度,然后结束一天的工作。
“我们发现了一个有趣的数据:电池保护器,过去,我们通常把亮度减半。Poiesz说:“我们在P中采用了这个特性。”“原因是,[在电池储藏器启动后]人们把亮度往后推,有时他们会把亮度往上推,比以前更亮。”因为这样很难吸引眼球。我们的想法是,如果我们的亮度达到你所需要的,如果你打开电池保护器,你的眼睛就不会改变。亮度是亮度。机器学习最终会发生什么,它会与你想要的地方保持一致,然后你会感到快乐。”
如果你要求人们增加亮度,他们不会选择最佳的亮度,但是随着时间的推移,机器学习模型会。人们不会给自己设置一个太暗的屏幕,但是它们会超调,这会消耗更多的能量。
“这就是我们获得总储蓄的方法。如果我们避免用户必须进行增强,试图摆脱这些暗淡的情况——每次你避免这种情况,并且你处于最佳状态,那就是节省。“作为一个人,你很难找到最佳的亮度。没有人真的想挑剔。所以这个模型在试图帮助你找到正确的水平而不必考虑这一点上是相当宽容的。
自适应亮度只有两个输入:来自设备传感器的环境照明和设置的亮度。为什么不考虑其他因素,比如输入是人工还是自然光?有几个原因。首先,最重要的是,所有的机器学习和优化都在设备上本地运行。
Poiesz强调:“模型越简单,推理时间就越短,运行起来就越便宜,这样就节省了功率。”“你必须始终确保额外的成本运行模型超出了储蓄。”
每当你的亮度被自动调整时,所有的计算都不会发生——只有当你介入时。“当你在计算模型应该是什么时,你正在做更重的提升。当设备说‘哦,这是来自环境传感器的新的亮度输入,屏幕的nit水平应该是多少?’这样一来,你就不会注意到Android馅饼和它的前身相比在调整亮度上所花费的时间有什么有意义的差别了。
下一步,无论是在内部还是外部,在优化方面都没有多大关系。但是团队调查了其他因素,比如你正在运行的应用程序,以及你在应用程序之间切换的时候。
Poiesz说:“当你做应用程序切换时,突然你的亮度发生了变化,这可能真的令人不安。”“我们发现最基本的事情相当有效,当我们进行狗食和beta测试时,用户反应非常积极。”
最后,这仅仅是个开始——更多的优化正在进行中。Poiesz解释说:“我们将在今年和明年研究更多的选择,以了解我们应该向模型中提供哪些更多信息。”
可以说,与自适应电池和自适应亮度最大的协议是,它们可以独立于Android进行更新。该团队不必等待Android 9.1或下一次空中(OTA)更新来改进他们的模型。这是可能的,因为模型驻留在Android应用程序(APK文件)中:设备健康服务。
出于好奇,除了自适应电池和自适应亮度之外,在设置应用程序中,这个应用程序还负责预测电池何时耗尽。
“这两个组件都可以在传统OTA之外更新,”Poiesz共享。“这将给我们提供很多灵活性来不断改进模型。[谷歌游戏]商店可以更新逻辑。如果我们有更好的模型,我们会更新它。如果事情发生变化,基线变化,或者如果我们发现一个更好的效率,那么我们将更新它。
事实上,其他Android设备制造商可以选择使用他们自己的型号。PoeSz听起来怀疑合作伙伴是否会选择使用谷歌以外的东西。“我相信如果有人能做得更好,DeepMind会很兴奋。”他补充道。
既然这是一个APK,它能被移植到以前版本的Android吗?
“不,不幸的是。我们必须在OS中做很多钩子,让这个APK提供数据,以便OS能够做出这些决定。应用程序不在这里工作,应用程序就是模型。所有的工作仍在OS中进行。”
也许这是件好事。这可能有助于推动更多的设备。
不同的android
target会有不同的大小,应用程序的界面需要针对不同的大小调整界面元素的尺寸。而且屏幕也可以在横屏和竖屏之间切换,界面也需要调整。
默认情况下,当屏幕方面切换时,activity的oncreate()方法会被重新调用,所以可以在其中通过以下代码来读取屏的方向:
public
void
oncreate()
{
if(this.getresources().getconfiguration().orientation
==
configuration.orientation_landscape)
{
log.i("info",
"landscape");
}
else
if
(this.getresources().getconfiguration().orientation
==
configuration.orientation_portrait)
{
log.i("info",
"portrait");}}
如果在androidmanifest.xml中加入配置
android:configchanges="orientation|keyboardhidden|navigation
当屏幕翻转时,activity就不会重复的调用oncreate()、onpause()和onresume().
而是调用onconfigurationchanged(configuration
newconfig)
int
screenwidth,screenheight;
windowmanager
windowmanager
=
getwindowmanager();
display
display
=
windowmanager.getdefaultdisplay();
screenwidth
=
display.getwidth();
screenheight
=
display.getheight();
也有人提到另一种方法:
displaymetrics
dm
=
new
displaymetrics();
getwindowmanager().getdefaultdisplay().getmetrics(dm);
在网页代码的头部内加入一行viewport元标签。
meta name="viewport" content="width=device-width, initial-scale=1" /
viewport的说明:
viewport是网页默认的宽度和高度,上面这行代码的意思是,网页宽度默认等于屏幕宽度(width = device-width),原始缩放比例(initial-scale = 1)为1.0,即网页初始大小占屏幕面积的100%。所有主流浏览器都支持这个设置。
关于viewport的基本属性:
width=device-width :表示宽度是设备屏幕的宽度
initial-scale=1.0:表示初始的缩放比例
minimum-scale=0.5:表示最小的缩放比例
maximum-scale=2.0:表示最大的缩放比例
user-scalable=yes:表示用户是否可以调整缩放比例