Android手机适配问题,【.9制作】【获取手机屏幕的宽高】【px,dp转换】

来源:互联网 发布:linux下jdk的卸载 编辑:程序博客网 时间:2024/04/29 03:45

工作内容:内容摘自

1.明白密度单位与像素之间的换算

2.使用wrap_content,match_parent,layout_weight来适应屏幕

3.使用限定符来设置不同屏幕显示不同布局

4.获取当前的布局(给出对应的响应)

5.使用自动拉伸位图

6.获取屏幕宽高动态设置

7.px与dp转换

学习分享:

一、首先明白密度单位dpi/dp与px的关系
dpi是屏幕像素密度,假如一英寸里面有160个像素,这个屏幕的像素密度就是160dpi,那么在这种情况下,dp和px如何换算呢?在Android中,规定以160dpi为基准,1dip=1px,如果密度是320dpi,则1dip=2px,以此类推。
2.图标文件夹的密度和显示
五种主流的像素密度(mdpi、hdpi、xhdpi、xxhdpi 和 xxxhdpi )应按照 2:3:4:6:8 的比例进行缩放。例如,一个启动图标的尺寸为48x48 dp,这表示在 MDPI 的屏幕上其实际尺寸应为 48x48 px,在 HDPI 的屏幕上其实际大小是 MDPI 的 1.5 倍 (72x72 px),在 XDPI 的屏幕上其实际大小是 MDPI 的 2 倍 (96x96 px),依此类推。

二、支持各种屏幕尺寸
“wrap_content” “match_parent” android:layout_weight
要确保布局的灵活性并适应各种尺寸的屏幕,应使用 “wrap_content” 和 “match_parent” 控制某些视图组件的宽度和高度。使用 “wrap_content”,系统就会将视图的宽度或高度设置成所需的最小尺寸以适应视图中的内容,而 “match_parent”(在低于 API 级别 8 的级别中称为 “fill_parent”)则会展开组件以匹配其父视图的尺寸。
如果使用 “wrap_content” 和 “match_parent” 尺寸值而不是硬编码的尺寸,视图就会相应地仅使用自身所需的空间或展

开以填满可用空间。此方法可让布局正确适应各种屏幕尺寸和屏幕方向。
weight是线性布局的一个独特的属性,我们可以使用这个属性来按照比例对界面进行分配,完成一些特殊的需求。(宽度为0dp的按钮,再分别设置weight)

android:layout_weight的真实含义是:如果View设置了该属性并且有效,那么该 View的宽度等于原有宽度(android:layout_width)加上剩余空间的占比。


三、使用限定符
在版本低于 3.2 的 Android 设备上,开发人员遇到的问题之一是“较大”屏幕的尺寸范围,该问题会影响戴尔 Streak、早期的 Galaxy Tab 以及大部分 7 英寸平板电脑。即使这些设备的屏幕属于“较大”的尺寸,但很多应用可能会针对此类别中
的各种设备(例如 5 英寸和 7 英寸的设备)显示不同的布局。这就是 Android 3.2 版在引入其他限定符的同时引入“最小宽度”限定符的原因。
最小宽度限定符可让您通过指定某个最小宽度(以 dp 为单位)来定位屏幕。例如,标准 7 英寸平板电脑的最小宽度为 600dp,因此如果您要在此类屏幕上的用户界面中使用双面板(但在较小的屏幕上只显示列表),您可以使用上文中所述的单面板和双面板这两种布局,但您应使用 sw600dp 指明双面板布局仅适用于最小宽度为 600 dp 的屏幕,而不是使用 large 尺寸限定符。
列如:
res/layout/main.xml: 单面板布局
res/layout-large: 多面板布局

四、确定当前布局(给出相应的响应)
由于每种布局的实施都会稍有不同,因此我们需要先确定当前向用户显示的布局。例如,我们可以先了解用户所处的是“单面
板”模式还是“双面板”模式。要做到这一点,可以通过查询指定视图是否存在以及是否已显示出来。

五、使用自动拉伸位图

右键点击在drawable目录下(Android Studio)的图片,选择“Create 9-Patch file”进入位图编辑区

支持各种屏幕尺寸通常意味着您的图片资源还必须能适应各种尺寸。例如,无论要应用到什么形状的按钮上,按钮背景都必须能适应。

如果在可以更改尺寸的组件上使用了简单的图片,您很快就会发现显示效果多少有些不太理想,因为系统会在运行时平均地拉伸或收缩您的图片。解决方法为使用自动拉伸位图,这是一种格式特殊的 PNG 文件,其中会指明可以拉伸以及不可以拉伸的区域。

.9的制作,实际上就是在原图片上添加1px的边界,然后按照我们的需求,把对应的位置设置成黑色线,系统就会根据我们的

六、实际需求进行拉伸。
动态设置
有一些情况下,我们需要动态的设置控件大小或者是位置,比如说popwindow的显示位置和偏移量等,这个时候我们可以动态
的获取当前的屏幕属性,然后设置合适的数值
<span style="font-size:14px;">public class ScreenSizeUtil {    public static int getScreenWidth(Activity activity) {          return activity.getWindowManager().getDefaultDisplay().getWidth();  //获取屏幕宽度    }      public static int getScreenHeight(Activity activity) {          return activity.getWindowManager().getDefaultDisplay().getHeight();  //获取屏幕高度    }  }  </span>

其他获取屏幕宽高的方法:

//方法一:推荐DisplayMetrics dm = [Context]getResources().getDisplayMetrics();int screenWidth = dm.widthPixels; //像素值宽度[可用宽度]int screenHeight = dm.heightPixels;//像素值高度//方法二:已过时  像素值WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);int width = wm.getDefaultDisplay().getWidth();int height = wm.getDefaultDisplay().getHeight(); WindowManager wm = this.getWindowManager();int width = wm.getDefaultDisplay().getWidth();int height = wm.getDefaultDisplay().getHeight();//方法三:像素值WindowManager manager = this.getWindowManager();DisplayMetrics outMetrics = new DisplayMetrics();manager.getDefaultDisplay().getMetrics(outMetrics);int width2 = outMetrics.widthPixels;int height2 = outMetrics.heightPixels;//方法四:像素值Resources resources = this.getResources();DisplayMetrics dm = resources.getDisplayMetrics();float density1 = dm.density;int width3 = dm.widthPixels;int height3 = dm.heightPixels;
七、px与dp转换
import android.content.Context;    public class DensityUtil {        /**      * 根据手机的分辨率从 dp 的单位 转成为 px(像素)      */      public static int dip2px(Context context, float dpValue) {          final float scale = context.getResources().getDisplayMetrics().density;          return (int) (dpValue * scale + 0.5f);      }        /**      * 根据手机的分辨率从 px(像素) 的单位 转成为 dp      */      public static int px2dip(Context context, float pxValue) {          final float scale = context.getResources().getDisplayMetrics().density;          return (int) (pxValue / scale + 0.5f);      }  }  


1 0
原创粉丝点击