屏幕适配相关问题总结

1. 请问平时开发过程中,你是如何做到多分辨率适配的

 

答:1.根据不同分辨率建立不同的布局文件 
2.根据分辨率不同建立不同分辨率的资源图片 
3.在程序启动时,获取当前屏幕的分辨率和密度,在代码中进行适配 
4.为不同分辨率的写不同的dimen文件。 
5.其实还有就是多使用fragement

 

2.屏幕适配的方式有哪些?

适配方式之dp

名词解释

 分辨率:eg:480*800,1280*720。表示物理屏幕区域内像素点的总和。(切记:跟屏幕适配没有任何关系)

   因为我们既可以把1280*720的分辨率做到4.0的手机上面。我也可以把1280*720的分辨率做到5.0英寸的手机上面,如果分辨率相同,手机屏幕越小清晰。

 px(pix):像素,就是屏幕中最小的一个显示单元

 dpi(像素密度):即每英寸屏幕所拥有的像素数,像素密度越大,显示画面细节就越丰富。

计算公式:像素密度=√{(长度像素数^2+宽度像素数^2)}/ 屏幕尺寸

注:屏幕尺寸单位为英寸 例:分辨率为1280*720 屏幕宽度为6英寸 计算所得像素密度约等于245,屏幕尺寸指屏幕对角线的长度。

Android手机中dpi分类:

ldpi

Resources for low-density (ldpi) screens (~120dpi).

mdpi

Resources for medium-density (mdpi) screens (~160dpi). (This is the baseline density.)

hdpi

Resources for high-density (hdpi) screens (~240dpi).

xhdpi

Resources for extra high-density (xhdpi) screens (~320dpi).

在我们的Android工程目录中有如下drawable-*dpi目录,这些目录是用来适配不同分辨率手机的。


Android应用在查找图片资源时会根据其分辨率自动从不同的文件目录下查找(这本身就是Android系统的适配策略),如果在低分辨的文件目录中比如drawable-mdpi中没有图片资源,其他目录中都有,当我们将该应用部署到mdpi分辨率的手机上时,那么该应用会查找分辨率较高目录下的资源文件,如果较高分辨率目录下也没有资源则只好找较低目录中的资源了。

常见手机屏幕像素及对应分别率级别:

 ldpi  320*240    

 mdpi  480*320    

 hdpi  800*480

 xhdpi  1280*720

 xxhdpi  1920*1080

dppx之间的简单换算关系:

 

 ldpi的手机 1dp=0.75px

 mdpi的手机 1dp=1.0px

 hdpi的手机 1dp=1.5px

 xhdpi的手机 1dp=2.0px

 xxhdpi的手机 1dp=3.0px


根据上面的描述我们得出如下结论,对于mdpi的手机,我们的布局通过dp单位可以达到适配效果。

屏幕适配之dimens

跟drawable目录类似的,在Android工程的res目录下有values目录,这个是默认的目录,同时为了适配不同尺寸手机我们可以创建一个values-1280x720的文件夹,同时将dimens.xml文件拷贝到该目录下。

在dimens.xml中定义一个尺寸,如下图所示。


在values-1280x720目录中的dimens.xml中定义同样的尺寸名称,但是使用不同的尺寸,如下图所示。


当我们在布局文件中使用长或者宽度单位时,比如下图所示,应该使用@dimen/width来灵活的定义宽度。


:在values-1280x720中,中间的是大写字母X的小写形式x,而不是加减乘除的乘号。如果我们在values-1280x720中放置了dimens常量,一定记得也将该常量的对应值在values目录下的dimens.xml中放一份,因为该文件是默认配置,当用户的手机不是1280*720的情况下系统应用使用的是默认values目录中的dimens.xml。

屏幕适配之layout

跟values一样,在Android工程目录中layout目录也支持类似values目录一样的适配,在layout中我们可以针对不同手机的分辨率制定不同的布局,如下图所示。


视频方式之java代码方式

为了演示用java代码控制适配的效果,因此假设有这样的需求,让一个TextView控件的宽和高分别为屏幕的宽和高的一半。

我们新创建一个Android工程,修改main_activity.xml,布局文件清单如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    tools:context=".MainActivity">

 <!-- 当前控件宽高为屏幕宽度的各50%-->

    <TextView

       android:id="@+id/tv"

       android:background="#000000"

       android:layout_width="wrap_content"

       android:layout_height="wrap_content"

       android:text="@string/hello_world"/>

</RelativeLayout>

在MainActivity.java类中完成用java代码控制TextView的布局效果,其代码清单如下:

publicclass MainActivity extends Activity {

 

   privatestaticfinal String tag = null;

 

   @Override

   protectedvoid onCreate(BundlesavedInstanceState) {

      super.onCreate(savedInstanceState);

      //去掉title

      requestWindowFeature(Window.FEATURE_NO_TITLE);

      setContentView(R.layout.activity_main);

      //获取TextView控件

      TextViewtv  = (TextView) findViewById(R.id.tv);

      //找到当前控件的夫控件(父控件上给当前的子控件去设定一个规则)

      DisplayMetricsmetrics  = new DisplayMetrics();

      //给当前metrics去设置当前屏幕信息(宽(像素)高(像素))

      getWindowManager().getDefaultDisplay().getMetrics(metrics);

      //获取屏幕的高度和宽度

      Constant.srceenHeight = metrics.heightPixels;

      Constant.srceenWidth = metrics.widthPixels;

      //日志输出屏幕的高度和宽度

      Log.i(tag, "Constant.srceenHeight= "+Constant.srceenHeight);

      Log.i(tag, "Constant.srceenWidth ="+Constant.srceenWidth);

            //宽高各 50%

      RelativeLayout.LayoutParamslayoutParams = new RelativeLayout.LayoutParams(

            //数学角度上 四舍五入

            (int)(Constant.srceenWidth*0.5+0.5),

            (int)(Constant.srceenHeight*0.5+0.5));

      //tv控件设置布局参数

      tv.setLayoutParams(layoutParams);

   }

}

其中Constant类是一个常量类,很简单,只有两个常量用来记录屏幕的宽和高,其代码清单如下:

publicclass Constant {

   publicstaticintsrceenHeight;

   publicstaticintsrceenWidth;

}

适配方式之weight权重适配

在控件中使用属性android:layout_weight="1"可以起到适配效果,但是该属性的使用有如下规则:

只能用在线性控件中,比如LinearLayout。

竖直方向上使用权重的控件高度必须为0dp(Google官方的推荐用法)

水平方向上使用权重的控件宽度必须为0dp(Google官方的推荐用法)

 

3.dp和px之间的关系

dp:是dip的简写,指密度无关的像素。

      指一个抽象意义上的像素,程序用它来定义界面元素。一个与密度无关的,在逻辑尺寸上,与一个位于像素密度为160dpi的屏幕上的像素是一致的。要把密度无关像素转换为屏幕像素,可以用这样一个简单的公式:pixels=dips*(density/160)。举个例子,在DPI为240的屏幕上,1个DIP等于1.5个物理像素。

布局时最好使用dp来定义我们程序的界面,因为这样可以保证我们的UI在各种分辨率的屏幕上都可以正常显示。

 

4.Padding和Margin有什么区别?

a)       Padding是相对View的内容计算边距。比如边长100的正方形控件,设置padding为10的话,则它占用空间大小为边长100的正方形,内容的可用大小为边长80的正方形。

b)       Margin是相对View的父窗体计算边距。比如边长100的正方形控件,设置Margin为10的话,则它占用空间大小为边长120的正方形,内容的可用大小为边长100的正方形。

 

5.屏幕适配GridView

a) 在处理大小相关的单位时使用dp、sp来替代px

b) 创建多个dimens文件,同一个控件在不同的屏幕提供不同的大小

c) 创建多个layout文件夹适配不同的屏幕

d) 使用9patch图片实现更好的缩放效果

e) 不得已的情况下需要在代码动态计算控件大小

 

6.如何屏幕适配

Android的屏幕适配主要有五中方式:

1.图片适配,根据不同的手机的密度加载不同文件夹下的图片
    2.dimens.xml文件适配,根据不同的手机的密度加载不同文件夹下的dimens.xml
    3.layout适配,根据不同的手机的密度加载不同文件夹下的布局文件
    4.java代码适配
    5.权重适配,设置显示比例。

 

7.gravity和layout-gravity区别

 

 

8.屏幕适配  百分比适配

 

 


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
移动端 H5 的兼容性问题主要包括以下几个方面: 1. 屏幕适配问题:由于移动设备的屏幕尺寸和分辨率千差万别,需要对页面进行响应式设计,以适应不同的屏幕大小。 2. 浏览器兼容性问题:不同的移动设备可能使用不同的浏览器,而不同的浏览器对 HTML、CSS、JavaScript 的支持程度也有差异,需要进行兼容性测试。 3. 图片加载问题:移动设备的网络环境比 PC 端要差,需要对图片进行优化,以减少页面加载时间。 4. 动画效果问题:移动设备的硬件性能相对较弱,需要对动画效果进行优化,以避免卡顿现象。 5. 视频播放问题:不同的移动设备可能使用不同的视频格式,需要对视频进行兼容性处理。 6. 输入框兼容性问题:移动设备的软键盘弹出时可能会遮挡输入框,需要对输入框进行特殊处理。 7. 其他特殊问题:如微信浏览器的 JS-SDK 接口、单页应用路由跳转问题等。 针对以上问题,可以采用以下方法进行解决: 1. 使用响应式布局方案,如 Bootstrap、Foundation 等。 2. 使用浏览器兼容性 CSS 样式,如 -webkit-、-moz-、-ms- 等。 3. 对图片进行压缩,使用适当的图片格式,如 JPEG、PNG、SVG 等。 4. 使用 CSS3 动画代替 JavaScript 动画,或者使用 JavaScript 动画代替 GIF 动画。 5. 使用 HTML5 视频标签,同时提供多种视频格式。 6. 对输入框进行特殊处理,如监听软键盘事件,调整输入框位置等。 7. 针对特殊问题,查找相关资料或者咨询专业人士进行解决。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值