一:不同的layout Android手机 屏幕 大小不一,有480x320, 640x360, 800x480.怎样才能让App自动 适应不同的屏幕 二:hdpi、mdpi、ldpi 在之前的版本中,只有一个drawable,而2.1版本中有drawable-mdpi、drawable-ldpi、drawable-hdpi三个,这三个主要是为了支持多分辨率。 三、屏幕 横屏竖屏自动切换: 还有一种办法:只要在androidmanifest.xml中对应的Activity中加入sensor属性即可实现屏幕自动翻转,如: Xml代码 < activity android:name=".demo" android:label="@string/app_name" android:screenOrientation="sensor" > 横屏竖屏不切换: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" </manifest> 四、 另外,android中每次屏幕 但是屏幕自动翻转也伴随着一个问题:当窗体切换或者布局切换时,Activity中OnCreate方法会被重复调用。一般OnCreate中会初始化一些数据,重复调用可能会产生意想不到的后果。解决方法如下: 在androidmanifest.xml中的activit元素加入configChanges这个属性,比如 Xml代码 < activity android:name="demo" android:configChanges="orientation|keyboardHidden" android:label="@string/app_name" > 另外,在Activity的Java文件中重载onConfigurationChanged(Configuration newConfig)这个方法,这样就不会在布局切换或窗口切换时重载onCreate等方法。代码如下: Java代码 public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { //TO-DO } else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { //TO-DO } } 还有界面设计方面的问题,Android手机大部分是HVGA、WVGA的分辨率,屏幕视觉上比较“狭长”。往往竖着看很合适的布局,当屏幕横向翻转以后显示会变得很别扭。当屏幕由竖直方向改变为横向时,我们可以把界面中的控件由本来的垂直线性布局修改为横向线性布局,这样布局会更合理一些。我们可以自己写一个布局类集成LinearLayout布局,通过覆盖onMeasure方法来实现这种自动布局。当屏幕的宽高发生改变时,系统会调用 onMeasure方法。通过这个方法,我们可以获得改变以后的宽高尺寸,从而来实现屏幕翻转的自动布局,主要代码如下: Java代码
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int screenWith = View.MeasureSpec.getSize(widthMeasureSpec);
int screenHeight = View.MeasureSpec.getSize(heightMeasureSpec);
if (screenWith < screenHeight) { this.setOrientation(VERTICAL); for (int i = 0; i < getChildCount(); i++) { View childView = getChildAt(i); if (childView instanceof CakyCanvas) {
LayoutParams params = new LayoutParams(screenWith, screenHeight * 2/ 5 updateViewLayout(childView, params); } else if (childView instanceof CakyExplainCanvas) {
LayoutParams params = new LayoutParams(screenWith, screenHeight * 3/ 5 updateViewLayout(childView, params); } } }
else { this.setOrientation(HORIZONTAL); for (int i = 0; i < getChildCount(); i++) { View childView = getChildAt(i); if (childView instanceof CakyCanvas) { LayoutParams params = new LayoutParams( screenWith * 2/ 5 screenHeight); updateViewLayout(childView, params); } else if (childView instanceof CakyExplainCanvas) { LayoutParams params = new LayoutParams( screenWith * 3/ 5 screenHeight); updateViewLayout(childView, params); } } } super.onMeasure(widthMeasureSpec, heightMeasureSpec); } 五、有的程序适合从竖屏切换到横屏,或者反过来,这个时候怎么办呢?可以在配置Activity的地方进行如下的配置android:screenOrientation="portrait"。这样就可以保证是竖屏总是竖屏了,或者landscape横向。 六、而有的程序是适合横竖屏切换的。如何处理呢?首先要在配置Activity的时候进行如下的配置:android:configChanges="keyboardHidden|orientation",另外需要重写Activity的 onConfigurationChanged方法。实现方式如下,不需要做太多的内容: @Override 屏幕分辨率:1024x600 density:1(160) 这样能够保证深度UI定制的情况 首先是几个基本概念: 1.屏幕尺寸Screen size 即显示屏幕的实际大小,按照屏幕的对角线进行测量。 为简单起见,Android把所有的屏幕大小分为四种尺寸:小,普通,大,超大(分别对应:small, normal, large, and extra large). 应用程序可以为这四种尺寸分别提供不同的自定义屏幕布局-平台将根据屏幕实际尺寸选择对应布局进行渲染,这种选择对于程序侧是透明的。 2.屏幕长宽比Aspect ratio 长宽比是屏幕的物理宽度与物理高度的比例关系。应用程序可以通过使用限定的资源来为指定的长宽比提供屏幕布局资源。 3.屏幕分辨率Resolution 在屏幕上显示的物理像素总和。需要注意的是:尽管分辨率通常用宽x高表示,但分辨率并不意味着具体的屏幕长宽比。 在Andorid系统中,应用程序不直接使用分辨率。 4.密度Density 根据像素分辨率,在屏幕指定物理宽高范围内能显示的像素数量。 在同样的宽高区域,低密度的显示屏能显示的像素较少,而高密度的显示屏则能显示更多的像素。 屏幕密度非常重要,因为其它条件不变的情况下,一共宽高固定的UI组件(比如一个按钮)在在低密度的显示屏上显得很大, 而在高密度显示屏上看起来就很小。 为简单起见,Android把所有的屏幕分辨率也分为四种尺寸:小,普通,大,超大(分别对应:small, normal, large, and extra large). 应用程序可以为这四种尺寸分别提供不同的资源-平台将透明的对资源进行缩放以适配指定的屏幕分辨率。 5.设备独立像素Density-independent pixel (dp) 应用程序可以用来定义UI组件的虚拟像素单元,通过密度无关的方式来描述布局尺寸和位置。 一个设备独立像素相当于一个160 dpi屏幕上的物理像素。 在程序运行时,系统根据屏幕的实际密度透明的处理任何需要缩放的设备独立像素单元,设备独立像素转换成屏幕实际像素的换算很简单:pixels = dps * (density / 160). 例如在240 dpi的屏幕上,1个设备独立像素等于1.5物理像素.为确保UI组件在不同的屏幕都能合适的展示,强烈建议使用设备独立像素单元来定义你的应用程序UI。 四种屏幕尺寸分类:: small, normal, large, and xlarge 四种密度分类: ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extra high) 需要注意的是: xhdpi是从 xlarge是从Android 2.3 (API Level 9)才开始增加的分类. DPI是“dot per inch”的缩写,每英寸像素数。 一般情况下的普通屏幕:ldpi是120,mdpi是160,hdpi是240,xhdpi是320。 参考:http://developer.android.com/images/screens_support/screens-ranges.png 两种获取屏幕分辨率信息的方法: DisplayMetrics metrics = new DisplayMetrics(); Display display = activity.getWindowManager().getDefaultDisplay(); display.getMetrics(metrics); //这里得到的像素值是设备独立像素dp //DisplayMetrics metrics=activity.getResources().getDisplayMetrics(); 这样获得的参数信息不正确,不要使用这种方式。 不能使用android.content.res.Resources.getSystem().getDisplayMetrics()。这个得到的宽和高是空的。 如果需要为Android pad定制资源文件,则res目录下的目录可能为: drawable drawable-ldpi drawable-mdpi drawable-hdpi drawable-xhdpi drawable-nodpi drawable-nodpi-1024×600 drawable-nodpi-1280×800 drawable-nodpi-800×480 values values-ldpi values-mdpi values-hdpi values-xhdpi values-nodpi values-nodpi-1024×600 values-nodpi-1280×800 values-nodpi-800×480 |
Android自适应屏幕分辨率
最新推荐文章于 2024-03-16 14:56:53 发布