屏幕适配/自适应的一些思路

不同生产环境下,有不同的屏幕适配策略。如WPF用<ViewBox>标签包裹控件进行自适应,如安卓中通过分包准备各种大小尺寸的图片资源,如游戏开发中常用的九宫图等等。。。

同样屏幕适配还有很多方式,常见的情况有:

  • 不管如何改变分辨率的大小和宽高比,都能保持控件宽高比,但不能保持控件的物理宽高,若超出屏幕则出现水平和垂直滚动条。如高于设计的分辨率宽高比,则控件等比缩小,屏幕左右两边留白;或是控件不缩小,屏幕下部超框,显示垂直滚动条。
  • 不管如何改变分辨率的大小和宽高比,都能保持控件宽高比,但不能保持控件的物理宽高,若超出屏幕能够自动调整控件布局的响应式布局。
  • 不管如何改变分辨率的大小和宽高比,都能保持控件宽高比,同时能保持控件的物理宽高,即自动缩放控件大小。

在WPF中有时候由于界面过于复杂(多处动态加载等),光是用<ViewBox>标签不一定能满足需求了。现在本文讨论上述第三种自适应方式,在WPF下做尝试。



同一控件在不同分辨率下,能有同样的物理宽高,说明该控件的Width、Height属性值是当程序运行时,根据当前的分辨率动态地由函数计算出来的。可以猜测公式为:

y = Ax + B (A、B为待求的常量)

其中:

  • y是控件的Width或Height值,单位是像素。因为要在不同分辨率下保持物理尺寸一致,所以在不同分辨率下的y值(像素)也不一样。
  • x是当前分辨率与设计分辨率的比值,是运行时的动态计算出来的。
  • A、B是一个待求的常量,所以要通过一组(至少两个)这样的式子做方程组才能求解。当两个分辨率的宽高比一样时,B为0,后面也会解释这一点。

下面先求x值。

    public class ScreenResolution
    {
        public static double SCALEX = 1.0;
        public static double SCALEY = 1.0;
        public static Size StandardSize = new Size(1920, 1080); // 设计分辨率
        public static Size ActualSize = new Size(1920, 1080);   // 真实分辨率
        static ScreenResolution()
        {
            ActualSize.Width = SystemParameters.WorkArea.Width;
            ActualSize.Height = SystemParameters.WorkArea.Height;
            SCALEX = ActualSize.Width / StandardSize.Width;
            SCALEY = ActualSize.Height / StandardSize.Height;
        }
    }

与设计分辨率相同时,SCALEX = 1。再用(1280*720)分辨率测试,则SCALEX = 0.66。注意,当屏幕下方显示任务栏时,(1920*1080)分辨率下任务栏高40像素,所以实际上的WorkArea.Height = 1040,即SCALEY ≈ 0.963。

然后求常量A、B。

以(1920*1080)为标准分辨率,现在为了保持一个Button控件在不同分辨率下的物理宽高都是(2.54cm*1cm),通过实际操作、不断调整,可得下面的方程组:

宽度:

===>>

高度:

===>>

知道UI控件宽高与当前分辨率对设计分辨率的宽高比值的关系后,前台界面XAML中将一个UI控件(如Button)的宽高进行绑定。

    <Button x:Name="btn" Width="{Binding ButtonWidth}" Height="{Binding ButtonHeight}" Content="自适应"/>

然后ViewModel的构造函数中,对ButtonWidth和ButtonHeight属性值赋值,套用公式,A、B常量采用上面求得的结果。

ButtonWidth = 100 * ScreenResolution.SCALEX;
ButtonHeight = 40 * ScreenResolution.SCALEY;

因为(1920*1080)与(1028*720)的宽高比完全一致,所以常量B为0。如果两种分辨率宽高比不一致,如(1280*960)就比(1280*720)在高上多了一截,那么就要在上面的式子中加上常量B来调整。



这种自适应的方法适用于调整控件宽高,以及控件位置布局,特别适用于运行时分辨率宽高比与设计的分辨率宽高比不一致的情况。缺点是需要调整的控件都要去计算它的宽高函数,工作量大。

该方式切入点是为保证在不同分辨率下UI在屏幕中显示大小基本与设计分辨率下的效果一致,所以是从物理宽高的角度出发,来计算像素宽高值在不同分辨率下的函数关系的。

时间: 2024-11-02 18:48:22

屏幕适配/自适应的一些思路的相关文章

关于屏幕适配问题几种思路与方式

相关参数以及测试结果 1. document.body.clientWidth:网页可见区域(body 内容)宽 document.body.clientHeight:网页可见区域(body 内容)高 重点理解clientHeight <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <meta name="vi

关于直播系统和短视频系统安卓手机屏幕适配的方向思路

直播与短视频的接踵而至,将互联网推向了网红经济时代,而智能手机的更新迭代为二者的发展提供了"温床".但随着Android机型的增多,设备碎片化的程度也在不断加深,因此为了保证用户在不同Android机型下的体验效果一致,我们需要对各种手机屏幕进行适配.下面我们就来聊下直播系统和短视频系统Android机型的适配问题.1. 布局组件的适配关于组件的适配,这里有几种不同的适配方案.一是使用密度无关像素dp或独立比例像素sp单位指定尺寸:二是多使用相对布局(RelativeLayout)或线

【转】Android屏幕适配全攻略(最权威的官方适配指导)

Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入的讲解了Android屏幕适配的原因.重要概念.解决方案及最佳实践,我相信如果你能认真的学习本文,对于Android的屏幕适配,你将有所收获! Android屏幕适配出现的原因 重要概念 屏幕尺寸 屏幕分辨率 屏幕像素密度 dpdipdpisppx mdpihdpixdpixxdpi 解决方案 支持各种屏幕尺寸 使用wrap_contentmatch_parentweight 使用相对布局

Android屏幕适配全攻略(最权威的官方适配指导)

Android屏幕适配出现的原因 在我们学习如何进行屏幕适配之前,我们需要先了解下为什么Android需要进行屏幕适配. 由于Android系统的开放性,任何用户.开发者.OEM厂商.运营商都可以对Android进行定制,修改成他们想要的样子. 但是这种"碎片化"到底到达什么程度呢? 在2012年,OpenSignalMaps(以下简称OSM)发布了第一份Android碎片化报告,统计数据表明, 2012年,支持Android的设备共有3997种. 2013年,支持Android的设备

Android屏幕适配全攻略(最权威的Google官方适配指导)

Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入的讲解了Android屏幕适配的原因.重要概念.解决方案及最佳实践,我相信如果你能认真的学习本文,对于Android的屏幕适配,你将有所收获! 出处:http://blog.csdn.net/zhaokaiqiang1992 Android屏幕适配出现的原因 重要概念 屏幕尺寸 屏幕分辨率 屏幕像素密度 dpdipdpisppx mdpihdpixdpixxdpi 解决方案 支持各种屏幕尺

iOS 屏幕适配 (转)

参考 微信的多屏适配 目前为止,iPhone屏幕尺寸已经有四种: 3.5(inch):1/3G/3GS/4/4S 4.0(inch):5/5S/5C 4.7(inch):6 5.5(inch):6Plus 看一下iPhone4~6(+)的屏幕高宽比: iPhone4(s):分辨率960*640,高宽比1.5 iPhone5(s):分辨率1136*640,高宽比1.775 iPhone6:分辨率1334*750,高宽比1.779 iPhone6+:分辨率1920*1080,高宽比1.778 可粗略

Android开发:最全面、最易懂的Android屏幕适配解决方案

前言 Android的屏幕适配一直以来都在折磨着我们Android开发者,本文将结合: Google的官方权威适配文档 郭霖:Android官方提供的支持不同屏幕大小的全部方法 Stormzhang:Android 屏幕适配 鸿洋:Android 屏幕适配方案 凯子:Android屏幕适配全攻略(最权威的官方适配指导) 自身的思考&实践 给你带来一种全新.全面而逻辑清晰的Android屏幕适配思路,只要你认真阅读,保证你能解决Android的屏幕适配问题! 目录 定义 使得某一元素在Androi

Android屏幕适配全攻略(最权威的官方适配指导)(转),共大家分享。

Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入的讲解了Android屏幕适配的原因.重要概念.解决方案及最佳实践,我相信如果你能认真的学习本文,对于Android的屏幕适配,你将有所收获! Android屏幕适配出现的原因 重要概念 屏幕尺寸 屏幕分辨率 屏幕像素密度 dpdipdpisppx mdpihdpixdpixxdpi 解决方案 支持各种屏幕尺寸 使用wrap_contentmatch_parentweight 使用相对布局

(转)Android屏幕适配全攻略

转载自http://blog.csdn.net/zhaokaiqiang1992 Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入的讲解了Android屏幕适配的原因.重要概念.解决方案及最佳实践,我相信如果你能认真的学习本文,对于Android的屏幕适配,你将有所收获! Android屏幕适配出现的原因 重要概念 屏幕尺寸 屏幕分辨率 屏幕像素密度 dpdipdpisppx mdpihdpixdpixxdpi 解决方案 支持各种屏幕尺