文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android 手机屏幕适配解决办法

2022-06-06 07:16

关注

0. 前言

Android的屏幕适配,即使得某一元素在Android不同尺寸、不同分辨率的手机上具备相同的显示效果,这个问题一直以来都是我们Android开发者不得不面对的问题。本文参考了很多前人的博客,并对这一问题做一个总结,力求精简明了。

转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52690498

1. 基础概念

(1)屏幕尺寸,即手机对角线的物理尺寸

1英寸 = 2.54cm  常见手机尺寸有5英寸、5.5英寸、6英寸等。

(2)屏幕分辨率,即手机在横向、纵向上的像素点数总和(一般描述成屏幕的”宽x高”)

例如1080dpx1920dp,即宽度方向上有1080个像素点,在高度方向上有1920个像素点,1px=1像素点

Android手机常见的分辨率:320x480、480x800、720x1280、1080x1920

(3)屏幕像素密度,即每英寸的像素点数,单位dpi

例如某设备为240x320,屏幕尺寸为3.3英寸,那么该设备的屏幕像素密度为400/3.3=120dpi,其中400为通过宽高像素勾股定理得出。

Android手机根据像素密度,可以分为以下几种屏幕密度类型:

 (4)密度无关像素,单位为dp,是Android特有的单位

Android开发时通常使用dp而不是px单位设置图片大小,因为它可以保证在不同屏幕像素密度的设备上显示相同的效果。


 
public class DensityUtils { 
  public static int dp2px(float dp , Context context){ 
    float density = context.getResources().getDisplayMetrics().density;//即表中的0.75/1/1.5/2/3 
    //context.getResources().getDisplayMetrics().densityDpi //即表中的120/160/240/320/480 
    return (int)(dp * density + 0.5f); 
  } 
  public static float px2dp(int px , Context context){ 
    float density = context.getResources().getDisplayMetrics().density; 
    return px/density; 
  } 
} 

(5)独立比例像素,单位为sp,Android开发时用于设置文字大小的单位

可根据字体大小首选项进行缩放,推荐使用12/14/18/22sp作为字体设置的大小,不推荐使用奇数和小数,容易造成精度的丢失问题。

介绍了上述基础概念,我们接下来从布局适配、图片适配、以及代码适配三个角度分别介绍屏幕适配的解决方案。

2. 布局适配

(1)推荐使用相对布局,禁用绝对布局。因为相对布局在屏幕的大小改变时视图之间的相对位置不会变化。

(2)使用dp和sp(尽量不用px)、wrap_content、match_parent和weight来控制布局。使用权重weight在任何设备上均会完美适配。

(3)为不同屏幕尺寸的设备设计不同的布局,通过配置限定符使得程序在运行时根据当前设备的尺寸自动加载合适的布局资源。

比如我们先写两个布局文件,分别为:

适配手机的布局(默认):res/layout/main.xml

适配尺寸>7寸平板的布局:res/layout/main_pb.xml

然后加入以下两个文件,系统会根据Android版本自动选择使用哪个布局配置文件。


//适配Android 3.2之前的平板布局 
res/values-large/layout.xml 
<resources> 
  <item name="main" type="layout">@layout/main_pb</item> 
</resources> 
//适配Android 3.2之后的平板布局 
res/values-sw600dp/layout.xml 
<resources> 
<item name="main" type="layout">@layout/main_pb</item> 
</resources> 

上述两个配置文件,并没有真正去定义布局,它们仅仅是将main设置成了@layout/main_pb的别名。

如果不这样做,main_pb.xml布局文件的内容需要复制成两份分别放入res/layout-large/main.xml和res/layout-sw600dp/main.xml以适配3.2以前和以后,这样明显很冗余。

3. 图片适配

(1)比如有一个这样的需求,一个按钮的背景图片必须能够随着按钮大小的改变而改变。使用普通的图片将无法实现上述功能,因为运行时会均匀地拉伸或压缩你的图片。

这时候可以使用Nine-Patch图(一种被特殊处理过的PNG图片,使用.9.png后缀名),9Patch图可以指定图片的拉伸区域和非拉伸区域,在需要拉伸图片时,系统就会自动地拉伸你想要拉伸的部分。需要注意的是,.9图不需要多个分辨率的图片,放在drawable文件夹即可。


红色框区域:表示纵向拉伸的区域,也就是说,当图片需要纵向拉伸的时候它会只指定拉伸红色区域。

绿色框区域:表示横向拉伸的区域,也就是说,当图片需要横向拉伸的时候它会只指定拉伸绿色区域。

 (2)图片不需要在下图hdpi、mdpi等目录下都放入相对应的分辨率的图片,这样会使APK变大,一般只做1280*720一套图,放在hdpi或xhdpi下,若出问题再针对屏幕进行问题图片替换即可。另外对于如何减小APK大小,可以参考Android开发——减小APK大小。

3. 代码适配

(1)比如有一个需求,需要实现一个空间宽度,是屏幕的1/3。这时候就可以用代码实现:


 
WindowManager wm = getWindowManager();   
int width = wm.getDefaultDisplay().getWidth(); 
LinearLayout.LayoutParams params = (LayoutParams)tv.getLayoutParams(); 
params.width = width/3; 
tv.setLayoutParams(params); 

需要注意的是,一般代码适配需要写一个工具类(上文中已经贴出了)来实现dp2px ,因为代码里的参数一般都需要px值,需要通过不同设备的屏幕密度来实现dp2px。

 (2)代码适配的另一个使用场景是根据加载布局的不同,来决定走不同的流程,如下:


setContentView(R.layout.main_layout);//此处会根据屏幕大小加载不同的布局  
Button btn = (Button)findViewById(R.id.btn);//其中一个布局没有该按钮  
if(btn == null){  
  //业务逻辑1...  
}else{  
  //业务逻辑2...  
}  

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

您可能感兴趣的文章:简单谈谈我的Android屏幕适配之路Android 图片显示与屏幕适配的问题Android的分辨率和屏幕适配详解Android-屏幕适配需要注意的地方总结Android屏幕适配工具类 Android自动生成不同分辨率的值


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯