精华内容
下载资源
问答
  • Unity屏幕特效之Bloom

    热门讨论 2015-09-21 13:35:56
    UnityShader实例15,配套资源,,适用于移动平台的屏幕bloom特效,效率不错
  • android5.0屏幕录制

    热门讨论 2015-09-17 18:14:26
    5.0下,使用MediaProjection进行屏幕录制的demo。 我比较懒,里面只放了实现的java类和xml,工程请自行创建。 另外这个demo源自android sample,我基本上没有改动,所以它其实只能算是屏幕捕捉,就是把屏幕内容在一...
  • java实现屏幕录制和播放(包含录音)

    热门讨论 2016-05-31 21:56:44
    用java写了个录视频的小程序, 录制后文件默认保存在系统临时目录, 录制视频和麦克风声音, 播放时回车键进入全屏, esc退出全屏, 希望能对有兴趣的朋友提供参考
  • android点击图标关闭屏幕

    热门讨论 2014-08-18 18:58:40
    android点击图标关闭屏幕
  • C#调用屏幕键盘和触摸键盘

    热门讨论 2014-08-06 22:00:26
    C# 调用 windows7 windows8 下的屏幕键盘 触摸键盘 文件中有两个类 一个是屏幕键盘类 一个触摸键盘类 代码里有详细的注释和说明 希望大家喜欢
  • 1 Android屏幕适配相关概念 1.1 屏幕尺寸(Screen Size) 屏幕尺寸是屏幕的对角线的长度,单位是英寸,1英寸等于2.54厘米。比如常见的屏幕尺寸有3.5、4.0、5.5等。 1.2 屏幕分辨率(Screen Resolution) 屏幕分辨率是指...

    0 前言

    快乐李同学最新在学习Android屏幕适配相关的知识点,其中涉及到了很多Android屏幕适配相关概念和度量单位,但是快乐李同学掌握的相关知识不牢固,于是决定写出这两篇文章对这方面的知识点做一个总结,Android屏幕适配系列文章共两篇:

    1. 《2021年最全Android屏幕适配的度量单位px dp(dip) ppi dpi sp pt的区别》
    2. 《2021年最详细的Android屏幕适配方案汇总》

    1 Android屏幕适配相关概念

    1.1 屏幕尺寸(Screen Size)

    1.1.1 设备的屏幕尺寸

    设备的屏幕尺寸是设备屏幕的对角线的长度,单位是英寸,1英寸等于2.54厘米。比如常见的设备屏幕尺寸有3.5"、4.0"、5.5"等。

    1.1.2 应用的屏幕尺寸

    应用的屏幕尺寸是Android系统为该应用所提供的可见空间。应用的屏幕尺寸并非设备的屏幕尺寸,而是综合考虑屏幕方向、系统装饰(如标题栏和导航栏)和窗口配置更改(例如当用户启用多窗口模式时)后的尺寸。

    多窗口模式:Android7.0及以上设备支持的分屏模式、Android7.0及以上的大尺寸屏幕设备支持的自由窗口模式、Android8.0及以上设备支持的画中画模式。

    例如以设备屏幕尺寸为1080px*2400px的Redmi K30Pro设备为例,我们把开发助手APP分别在不带导航栏的全屏模式、带导航栏的全屏模式、分屏模式和自由窗口模式下打开并检测屏幕属性,截图如下:在这里插入图片描述
    我们可以发现:这四种情况下检测出的屏幕分辨率永远都是1080px*2400px,这就是我们所说的设备的屏幕尺寸;但这四种情况下检测出的可用屏幕分辨率却各不相同,上图的蓝框圈中的区域便是可用屏幕分辨率所描述的区域,这也就是我们所说的应用的屏幕尺寸

    1.2 屏幕分辨率(Screen Resolution)

    屏幕分辨率是指在横向和纵向上的像素点数、单位是px(pixel),1px等于1个像素点,一般设备的屏幕分辨率以“纵向像素*横向像素”来表示,例如1920px*1080px。

    1.3 度量单位px、dp(dip)、ppi、dpi、sp、pt

    1.3.1 像素px(pixel)

    像素,1px代表物理屏幕上面的一个像素点。由于Android设备分辨率繁杂、厂商过多的原因,px在实际的开发过程中不建议被使用。如宽高都为100px的图片,在不同分辨率的设备上可能显示的大小不一致,如下图(图片来自android_developer_screens_support):

    在这里插入图片描述

    1.3.2 密度无关像素dp/dip(Density-independent Pixels)

    密度无关像素是一个基于屏幕物理密度的度量单位,在160dpi的屏幕中1dp大约等于1px。当在更高密度的屏幕上运行时,用于绘制1dp的像素数量会被一个适合屏幕dpi的density因子放大,例如在320dpi的屏幕中1dp大约等于2px。而在低密度屏幕上,1dp的像素数量会减少。

    也就是说,dp与px的比值与屏幕物理密度成正相关,但不一定成正比。度量单位dp可以在布局中适当地调整UI组件的大小,以适合不同的屏幕密度。换句话说,它为您在不同设备上的UI元素的真实大小提供了一致性。

    为什么说dp与px的比值与屏幕物理密度成正相关,而不是成正比呢?


    这主要是因为Android开发者可以在代码中指定浮点数的dp或者px,但当在设备屏幕上按照对应的dp或px显示内容时要进行四舍五入取整,因为设备屏幕都是一个个像素点构成的,因此它们的关系是成正相关。


    举个例子,一个宽高为11dp*11dp的ImageView,在density为1.0的设备屏幕上显示的实际像素为11px*11px,但在density为1.5的设备屏幕上显示的实际像素为17px*17px,而不是16.5px*16.5px。因为一个1px*1px的像素点只能是要么显示,要么不显示,所以Android系统中会将16.5px*16.5px四舍五入取整为17px*17px。

    Android官方文档《支持不同的像素密度》对于屏幕适配的观点是:必须避免的第一个陷阱是使用像素px来定义距离或尺寸。使用像素来定义尺寸会带来问题,因为不同的屏幕具有不同的像素密度,所以同样数量的像素在不同的设备上可能对应于不同的物理尺寸。

    例如下方同样是4.0英寸的两部手机,左边那台手机的分辨率很低,是320px*180px,右边那台是960px*540px。如果将显示字母a图片的ImageView宽高都设置为100px,那么左边手机显示的字母a图片很大,而右边手机显示的字母a图片很小。

    只有将显示字母a图片的ImageView宽高都设置为100dp,才能出现下面的效果,即该字母a图片在两台分辨率不同的手机看起来实际的物理宽高差不多一致,而不是一大一小。

    要在密度不同的屏幕上保持一个UI组件显示出相同的尺寸,您必须使用密度无关像素 (dp) 作为度量单位来设计界面。dp 是一个虚拟像素单位,1 dp 约等于在在基准密度160dpi屏幕上的1px。对于其他每个密度,Android 会将此值转换为相应的实际像素数。

    1.3.3 像素密度ppi(pixels per inch)

    像素密度是一个表示打印图像或显示器单位面积上像素数量的指数。一般用来计量电脑显示器、电视机和手机屏幕的精细程度,例如手机销售商一般会标识出售手机的ppi,例如淘宝店中小米K30Pro手机标识的ppi为395。通常情况下,ppi越高的屏幕,屏幕显示的内容更细腻和真实,其中ppi的计算公式如下:

    以分辨率1280*720、屏幕对角线尺寸为4.3英寸的设备为例:ppi = √(12802+7202) / 4.3 = 341.5359……≈342。

    1.3.4 屏幕密度dpi(dots per inch)

    屏幕密度是一个用于点阵数位影像的度量单位,意思是每一英寸长度中取样点或可显示点的数目。为简便起见,Android 将所有屏幕密度分组为六种通用密度,具体如下表:

    类别屏幕密度dpi密度无关像素dp的缩放因子density
    ldpi~120dpi0.75
    mdpi~160dpi1.0
    hdpi~240dpi1.5
    xhdpi~320dpi2.0
    xxhdpi~480dpi3.0
    xxxhdpi~640dpi4.0

    1.3.4.1 密度无关像素dp的缩放因子density

    在《Android官方文档-Reference-DisplayMetrics.density》中对屏幕密度dpi的缩放因子density有以下的解释:

    density是密度无关像素dp的缩放因子,体现在android.util包中的DisplayMetrics.density 字段。将dp单位转换为px单位时,该字段是必须使用的缩放系数,160dpi屏幕的density是1,而240dpi屏幕的density是1.5,以此类推。利用density可以简单转换dp和px这两个度量单位:

    px = dp * density = dp * (dpi / 160)

    假设在某一应用中,用户的手指至少移动16px之后,系统才会识别出滚动或滑动手势。在160dpi基准屏幕上,用户必须移动 16 pixels / 160 dpi(等于一英寸的 1/10 或 2.5 毫米),系统才会识别该手势。而在配备高密度显示屏 (240dpi) 的设备上,用户的手指必须至少移动 16 pixels / 240 dpi,相当于 1 英寸的 1/15(1.7 毫米)。此距离短得多,因此用户会感觉应用在该设备上更灵敏。

    要解决此问题,必须在代码中以 dp 表示手势阈值,然后再转换为实际像素。例如:

    //以dp为度量单位的手势阈值
    private static final float GESTURE_THRESHOLD_DP = 16.0f;
    //获得当前设备的密度无关像素dp的缩放因子density
    final float density = getResources().getDisplayMetrics().density;
    //基于density将dp转化为当前设备适应的px,
    mGestureThreshold = (int) (GESTURE_THRESHOLD_DP * density + 0.5f)
    //使用以px为度量单位的mGestureThreshold变量值作为当前APP的手势阈值
    

    DisplayMetrics.density 字段根据当前像素密度指定将 dp 单位转换为像素时所必须使用的缩放系数。在中密度屏幕上,DisplayMetrics.density 等于 1.0;在高密度屏幕上,它等于 1.5;在超高密度屏幕上,等于 2.0;在低密度屏幕上,等于 0.75。此数字是一个系数,用其乘以 dp 单位,即可得出当前屏幕的实际像素数。

    1.3.4.2 ppi与dpi的区别

    dpi(dots per inch)、ppi(pixels per inch),前者突出dot(物理像素点),后者突出pixel(像素),dot是一个物理的像素点,pixel就不一定了,一个pixel可能由很多个物理dot组成。

    PPI描述了数字图像的像素分辨率,而DPI描述了打印图像上的墨点数量。尽管PPI在很大程度上是指屏幕显示,但它也会影响设计的打印尺寸,从而影响输出的质量。而DPI与数字化无关,主要涉及印刷。

    对Android而言,dpi等同于ppi,具体可以参考文章《PPI vs. DPI: what’s the difference?》。

    1.3.5 缩放无关像素sp(Scale-independent Pixel)

    在定义文本大小时,应该用可缩放像素sp作为单位。sp与dp很类似,但唯一的区别是:Android系统允许用户自定义文字尺寸大小(小、正常、大、超大等),当文字尺寸是“正常”时,1sp=1dp,而当文字尺寸是“大”或者“超大”时,1sp>1dp。

    1.3.6 点pt(point)

    pt在两种环境中有两种不同的含义:在PhotoShop中,pt用来指定电子图像的尺寸并映射到印刷设备;而在iOS应用开发中,pt用来将指定电子图像的尺寸并映射到iOS设备。

    但在上述两种环境下,pt都是逻辑单位,用来隔离输出设备的精度差异,保证输出结果的物理尺寸不会忽大忽小。

    1.3.6.1 iOS设备中的点pt(point)

    在iOS应用开发中,pt用来将指定电子图像的尺寸并映射到iOS设备。在163ppi的iOS设备中,1pt映射成1px,且1inch(英尺)等于163pt。而对于其他不同ppi的iOS设备,1pt可能会映射成2px、3px等像素,具体可参考下述表格:

    1.3.6.2 PhotoShop中的点pt(point)

    在PhotoShop中,pt用来指定电子图像的尺寸并映射到印刷设备。其中PhotoShop指定,当ppi为72时,PhotoShop中1pt映射成1px。且1inch等于72pt。

    2 2021年最详细的Android屏幕适配方案汇总

    请阅读快乐李同学写的文章《2021年最详细的Android屏幕适配方案汇总》


    本文参考文献:

    Android开发者-文档-指南-应用资源概览

    Android开发者-文档-指南-设备兼容性-设备兼容性概览

    Android开发者-文档-指南-设备兼容性-支持不同的屏幕尺寸

    Android开发者-文档-指南-设备兼容性-支持不同的像素密度

    【Android屏幕适配】浅析px、dp、ppi、dpi、sp

    iOS开发中使用的单位pt与ps中的pt是不是同一个概念?个人觉得不是。望高手解答…?

    腾讯何家成-Android 屏幕适配:最全面的解决方案

    张鸿洋-Android 屏幕适配方案

    展开全文
  • Android 今日头条屏幕适配详细使用攻略

    千次阅读 多人点赞 2020-09-22 09:33:40
    屏幕自适应1. 原理核心2. 框配置3. 自定义初始化4. 常用方法解析5. 常见接口及类的使用CustomAdapt 首先感谢大神JessYan的创神之作《AndroidAutoSize》,大神以今日头条屏幕适配的核心代码为基础进行了扩展封装,...

    Android 第三方库系列文章

    1. Android 今日头条屏幕适配详细使用攻略
    2. Lottie动画 轻松使用

    博客创建时间:2020.09.20
    博客更新时间:2021.06.27

    以Android studio build=4.2.1,gradle=6.7.1,SdkVersion 30来分析讲解。如图文和网上其他资料不一致,可能是别的资料版本较低而已


    前言

    首先感谢大神JessYan的创神之作《AndroidAutoSize》,大神以今日头条屏幕适配的核心代码为基础进行了扩展封装,产生了《AndroidAutoSize》这个能快速接入使用的屏幕适配方案,这个屏幕适配方案是我遇到的截止2020.9.15为止最强大、简单有效的屏幕适配方案。我已使用该方案有一年,在使用过程未发现有何问题,强烈推荐各位极客们使用学习。

    以下是大神JessYan的相关地址:

    大神的源码都在github中各位可以自行下载,我写这篇博客的目的就是记录使用心得,并将该框架的重要类和方法使用进行详细说明,大神的文章中对细节问题写的比较少,我对其进行了细微的修改和详细的注解解释。我自己修改注释过得框架源码请前往github下载https://github.com/l424533553/MyAutoSize


    1. 屏幕像素

    像素
    通常所说的像素,就是CCD/CMOS上光电感应元件的数量,一个感光元件经过感光,光电信号转换,A/D转换等步骤以后,在输出的照片上就形成一个点,我们如果把影像放大数倍,会发现这些连续色调其实是由许多色彩相近的小方点所组成,这些小方点就是构成影像的最小单位“像素”(Pixel)。简而言之,像素就是手机屏幕的最小构成单元。

    屏幕尺寸
    屏幕尺寸指屏幕的对角线的长度,单位是英寸,1英寸=2.54厘米。比如常见的屏幕尺寸有2.4、2.8、3.5、3.7、4.2、5.0、5.5、6.0等

    屏幕分辨率
    屏幕分辨率是指在横纵向上的像素点数,单位是px,1px=1个像素点。一般以纵向像素横向像素,如19201080

    屏幕像素密度(dpi)
    屏幕像素密度是指每英寸上的像素点数,单位是dpi,即“dot per inch”的缩写。屏幕像素密度与屏幕尺寸和屏幕分辨率有关,在单一变化条件下,屏幕尺寸越小、分辨率越高,像素密度越大,反之越小。
    在这里插入图片描述

    计算公式: 像素密度 = 像素 / 尺寸 (dpi = px / in)
    标准屏幕像素密度(mdpi): 每英寸长度上还有160个像素点(160dpi),即称为标准屏幕像素密度(mdpi)。

    密度无关像素(dp)
    含义:density-independent pixel,叫dp或dip,与终端上的实际物理像素点无关
    单位:dp,可以保证在不同屏幕像素密度的设备上显示相同的效果,是安卓特有的长度单位。
    场景例子:假如同样都是画一条长度是屏幕一半的线,如果使用px作为计量单位,那么在480x800分辨率手机上设置应为240px;在320x480的手机上应设置为160px,二者设置就不同了;如果使用dp为单位,在这两种分辨率下,160dp都显示为屏幕一半的长度。
    dp与px的转换:1dp = (dpi / 160 ) * 1px;

    密度类型代表的分辨率(px)屏幕像素密度(dpi)换算
    低密度(ldpi)240 x 3201201dp = 0.75px
    中密度(mdpi)320 x 4801601dp = 1px
    高密度(hdpi)480 x 8002401dp = 1.5px
    超高密度(xhdpi)720 x 12803201dp = 2px
    超超高密度(xxhdpi)1080 x 19204801dp = 3px

    独立比例像素(sp)
    scale-independent pixel,叫sp或sip,字体大小专用单位 ,Android开发时用此单位设置文字大小,可根据字体大小首选项进行缩放。
    推荐使用12sp、14sp、18sp、22sp作为字体大小,不推荐使用奇数和小数,容易造成精度丢失,12sp以下字体太小。

    sp与dp的区别
    dp只跟屏幕的像素密度有关, sp和dp很类似但唯一的区别是,Android系统允许用户自定义文字尺寸大小(小、正常、大、超大等等),当文字尺寸是“正常”时1sp=1dp=0.00625英寸,而当文字尺寸是“大”""或“超大”时,1sp>1dp=0.00625英寸。类似我们在windows里调整字体尺寸以后的效果——窗口大小不变,只有文字大小改变。


    2. 适配原理

    传统的屏幕适配头如下几种措施:

    1. 种像素密度机型,做5套图。比例 1:1.5:2:3:4
    2. 多用相对布局
    3. 尺寸限定符
    4. 点九图
    5. 不同图片填充类型ScaleType
      但是以往的所有屏幕适配都有各种各样的问题和重大缺陷,直到字节跳动的屏幕适配方案出现。根据其公开的核心源码,网上重大大咖封装了各种屏幕适配框架,其中最成功且本人使用感受最好的是AutoSize框架。

    Android AutoSize的核心代码来源于字节跳动的微信文章https://mp.weixin.qq.com/s/d9QCoBP6kV9VSWvVldVVwA。网上也有多各个大神进行了代码的封装设计,都是万变不离其中。

    1. 核心思想

            DisplayMetrics appDisplayMetrics = application.getResources().getDisplayMetrics();
            if (sNoncompatDensity == 0) {
                sNoncompatDensity = appDisplayMetrics.density;
                sNoncompatDensity = appDisplayMetrics.scaledDensity;
                application.registerComponentCallbacks(new ComponentCallbacks() {
                    
                    public void onConfigurationChanged(Configuration newConfig) {
                        if (newConfig != null && newConfig.fontScale > 0) {
                            sNoncompatScaledDensity = application.getResources().getDisplayMetrics().scaledDensity;
                        }
                    }
    
                    
                    public void onLowMemory() {
    
                    }
                });
            }
            float targetDensity = appDisplayMetrics.widthPixels / 360;
            float targetScaleDensity = targetDensity * (sNoncompatScaledDensity / sNoncompatDensity);
            int targetDensityDpi = (int) (160 * targetDensity);
            appDisplayMetrics.density = targetDensity;
            appDisplayMetrics.scaledDensity = targetScaleDensity;
            appDisplayMetrics.densityDpi = targetDensityDpi;
    
            final DisplayMetrics activityDisplayMetrics = activity.getResources().getDisplayMetrics();
            activityDisplayMetrics.density = targetDensity;
            activityDisplayMetrics.scaledDensity = targetScaleDensity;
            activityDisplayMetrics.densityDpi = targetDensityDpi;
    

    原理很简单,例如一个4.59的10801920的手机它的dpi=480,它的density=480/160,则说明1dp=3px。当我们在布局中给如TextView设置layout_width=30dp时,在程序运行时会自动计算其对应px单位长度90px,px=dpdensity。

    今日头条适配方案的核心就是动态计算程序中的density=appDisplayMetrics.widthPixels / 360,360是原始设计图纸的dp。假设原先的设计图纸10801920,现在适配5.99寸560dpi的14402880手机,则30dp=30560/160=105px,实际上屏幕适配要求的30dp=1440/36030=120px才可以达到适配效果。因为120/1440=90/1080,控件在布局中的占宽比是一样的才能达到宽度适配效果。这就是为什么要动态修改全局或activity的DisplayMetrics#density的目的了。


    2. 优缺点

    • 优点:
    1. 侵入性非常低,该方案和项目完全解耦,使用的还是Android官方单位
    2. 接入无性能损耗,使用的全是Android官方的API。
    • 缺点:
    1. 项目中的系统控件、三方库控件、等非我们项目自身设计的控件,它们的设计图尺寸并不会和我们项目自身的设计图尺寸一样,此时会产生适配误差。解决方案就是取消当前 Activity 的适配效果,改用其他的适配方案
    2. 系统修改字体大小后,返回应用系统字体大小还是未改变,需要设置registerComponentCallbacks监听。 Android AutoSize框架已经解决了该问题。
    3. 在使用过程中需要进行registerComponentCallbacks监听内容文字的大小改变情况,解决退出应用修改文字大小后,文字大小不改变的情况。

    3. 框架配置

    依赖配置

    1. 远程依赖,截止到2020.9.15,版本为1.2.1
        implementation 'me.jessyan:autosize:1.2.1'
    
    1. 从github上下载源码进行library库依赖

    参数配置
    在AndroidManifest.xml中配置参数

    <manifest>
        <application>    
            ...
            <meta-data
                android:name="design_width_in_dp"
                android:value="360"/>
            <meta-data
                android:name="design_height_in_dp"
                android:value="640"/>      
            ...
         </application>           
    </manifest>
    

    4. 自定义初始化

    本文中使用的框架是经过大神JessYan的封装后成为你所看到的框架。它能根据一套给定的设计图尺寸进行布局展示,当安装当不同分辨率尺寸的设备上时,它能自动适配屏幕。

    框架的初始化时机是配置在ContentProvider中,在Application#onCreate()方法之前启动。框架一旦初始化完成,其适配效果会在Activity和Fragment、各种View中自动全局适配。程序将默认是以屏幕宽度为基准进行适配的,并且使用的是在AndroidManifest中填写的全局设计图尺寸进行全局适配。

    框架支持dp、sp两个主单位,pt、in、mm三个冷门副单位,如果使用副单位,可以规避系统控件或三方库控件使用的不良影响。

    ContentProvider初始化第三方库
    ContentProvider是一种共享型组件,它通过Binder向其他组件或者其他应用程序提供数据,当ContentProvider所在进程启动时候,ContentProvider会被同时启动并被发布到AMS中。

    ContentProvider的onCreate要优先于Application的onCreate,但在attachBaseContext()之后而执行,它的具体详细启动源码在ActivityThread中。很多人会在ContentProvider#onCreate()初始化第三方库。

    一般进行了依赖配置参数配置两操作,Android AutoSize就配置完成可以直接使用了,它的框架源码初始化在InitProvider代码中。

    在InitProvider 中已进行了初始化设置

    public class InitProvider extends ContentProvider {
        @Override
        public boolean onCreate() {
            if (getContext() != null) {
                Context application = getContext().getApplicationContext();
                if (application == null) {
                    application = AutoSizeUtils.getApplicationByReflect();
                }
                AutoSizeConfig.getInstance()
                        .setLog(true)
                        .init((Application) application)
                        .setUseDeviceSize(false);
                return true;
            }
            return false;
        }
    

    但是为了个性化的配置,我们可以在Application中进行一些自定义设置,设置的方法都应写在Application#onCreate()方法中。

    public class Application {
        @Override
        public void onCreate() {
            super.onCreate();
            ...
            AutoSize.initCompatMultiProcess(this);
            AutoSize.checkAndInit(this);
            AutoSizeConfig.getInstance()
                    .setCustomFragment(true)
                    .setExcludeFontScale(true)
                    .setPrivateFontScale(0.8f)
                    .setLog(false)
                    .setBaseOnWidth(true)
                    .setUseDeviceSize(true)
                    //屏幕适配监听器
                    .setOnAdaptListener(new OnAdaptListener() {
                        @Override
                        public void onAdaptBefore(Object target, Activity activity) {
    //                        AutoSizeConfig.getInstance().setScreenWidth(ScreenUtils.getScreenSize(activity)[0]);
    //                        AutoSizeConfig.getInstance().setScreenHeight(ScreenUtils.getScreenSize(activity)[1]);
                            AutoSizeLog.d(String.format(Locale.ENGLISH, "%s onAdaptBefore!", target.getClass().getName()));
                        }
    
                        @Override
                        public void onAdaptAfter(Object target, Activity activity) {
                            AutoSizeLog.d(String.format(Locale.ENGLISH, "%s onAdaptAfter!", target.getClass().getName()));
                        }
                    });
            configUnits();
        }
        
        private void configUnits() {
            AutoSizeConfig.getInstance()
                    .getUnitsManager()
                    .setSupportDP(true)
                    .setDesignSize(2160, 3840)
                    .setSupportSP(true)
                    .setSupportSubunits(Subunits.MM);
        }
    }
    

    5. 常用方法解析

    对于初始化中方法,我们进行一一分析
    1. AutoSize.initCompatMultiProcess(Context context)
    当 App 中出现多进程,并且您需要适配所有的进程,就需要在 App 初始化时调用。一般的单进程App程序不用设置。

    2. AutoSize.checkAndInit(Application application)

         if (!checkInit()) {
                AutoSizeConfig.getInstance()
                        .setLog(true)
                        .init(application)
                        .setUseDeviceSize(false);
            }
    

    一般来说Android AutoSize会通过InitProvider实例化自动完成初始化,是不需要调用checkAndInit()方法的。但由于某些 issues 反应, 可能会在某些特殊情况下出现InitProvider未能正常实例化的情况, 导致 AndroidAutoSize 未能完成初始化。所以需要使用该方法确保Android AutoSize 初始化成功。

    3. AutoSizeConfig.getInstance().setCustomFragment(boolean customFragment)
    设定是否让框架支持自定义Fragment 的适配参数,一般这个需求比较少。默认不支持的

    4. AutoSizeConfig.getInstance().setExcludeFontScale(true)
    是否屏蔽系统字体大小对AndroidAutoSize 的影响, 如果为 true, App 内的字体的大小将不会跟随系统设置中字体大小的改变, 如果为 false, 则会跟随系统设置中字体大小的改变, 默认为 false

    5. AutoSizeConfig.getInstance().setPrivateFontScale(float fontScale)
    区别于系统字体大小的放大比例, AndroidAutoSize 允许 APP 内部可以独立于系统字体大小之外,独自拥有全局调节 APP 字体大小的能力。 fontScale取值0~1,设为 0 则取消此功能。同时字体的单位必须是sp做单位。

    6. AutoSizeConfig.getInstance().setLog(boolean log)
    设置是否打印AutoSize的日志,true为打印

    7. AutoSizeConfig.getInstance().setBaseOnWidth(true)
    是否全局按照宽度进行等比例适配,true以宽来适配,false以高来适配

    8. AutoSizeConfig.getInstance().stop(this)
    自动适配方案可以手动调用方法停止,需要注意的是Android AutoSize暂停只是停止了对后续还没有启动的{@link Activity}进行适配的工作,但对已经启动且已经适配的{@link Activity}不会有任何影响

    9. AutoSizeConfig.getInstance().restart()
    AutoSize可以暂停适配也可以重启适配,但是重启适配只能对后续还没有启动的 {@link Activity} 进行适配的工作,但对已经启动且在stop期间未适配的{@link Activity}不会有任何影响

    10. AutoSizeConfig.getInstance().setUseDeviceSize(true)
    是否以屏幕的实际尺寸为高度,默认为false,屏幕的适配高度是屏幕总高度减去状态栏高度。

    11. UnitsManager.setSupportSP(boolean supportSP)
    是否让框架支持sp单位,默认是为true支持,如果为false,则字体大小最好设置为其他单位才能自动适配

    12. UnitsManager.setSupportSubunits(Subunits supportSubunits)
    自主设置心仪的副单位,可以从pt、in、mm中进行选择,如果使用了Subunits#NONE即代表不支持副单位

    13. UnitsManager.setSupportDP(boolean supportDP)
    是否支持dp单位,默认是true支持,如果关闭将不对dp单位进行支持

    14. UnitsManager.setDesignSize(float designWidth, float designHeight)
    设置设计图尺寸,一般专为副单位尺寸设计,它与AndroidManifest.xml中配置的参数不一样,不会被覆盖。


    6. 常见接口及类的使用

    CustomAdapt
    实现CustomAdapt接口即可对activity和fragment进行新的自定义尺寸适配,适配方向可以自主选择是宽度还是高度。实现该接口会取消默认的适配方案和效果。对于fragment的自定义尺寸需要进AutoSizeConfig.getInstance().setCustomFragment(true)设置,默认是不支持对fragment的自定义尺寸适配的。

    <在CustomAdapt接口中需要实现者重写两个方法boolean isBaseOnWidth()和float getSizeInDp(),根据使用者需求自定义。

    • 1. boolean isBaseOnWidth()
      为了保证在高宽比不同的屏幕上也能正常适配,所以只能在宽度和高度之中选一个作为基准进行适配。 true为按照宽度适配, false 为按照高度适配

    • 2. float getSizeInDp()
      getSizeInDp 须配合isBaseOnWidth()使用, 有如下使用规则:
      如果 {@link #isBaseOnWidth()} 返回 {@code true}, {@link CustomAdapt #getSizeInDp} 则应该返回设计图的总宽度。
      如果 {@link #isBaseOnWidth()} 返回 {@code false}, {@link CustomAdapt #getSizeInDp} 则应该返回设计图的总高度。
      如果您不需要自定义设计图上的设计尺寸, 想继续使用在 AndroidManifest 中填写的设计图尺寸,getSizeInDp 则返回 0即可。

    CancelAdapt
    接口CancelAdapt没有任何成员变量,支持AndroidAutoSize的项目所有模块默认使用适配功能,第三方库的也不例外。
    如果某个页面不想使用适配功能, 请让该页面实现CancelAdapt接口放弃适配,所有的适配效果都将失效。


    7.框架核心

    1. 自定义适配
    通过字节跳动的核心源码,只能进行全局适配,但是该框架中进行了Activity和Fragmen的自定义适配和随时取消恢复适配功能。它的原理是注册了ActivityLifecycleCallbacks,进行了Activity的适配时间精准化自我掌控。

    通过注册ActivityLifecycleCallbacks,进行Activity的生命周期进行管理, 当onActivityCreated时,也就是OnCreate()的setContentView之前进行了AutoAdaptStrategy#applyAdapt的调用。这种方案类似于 AOP, 面向接口, 侵入性低, 方便统一管理, 扩展性强。

        @Override
        public void onActivityCreated(@androidx.annotation.NonNull Activity activity, Bundle savedInstanceState) {
            if (AutoSizeConfig.getInstance().isCustomFragment()) {
                if (mFragmentLifecycleCallbacksToAndroidx != null && activity instanceof androidx.fragment.app.FragmentActivity) {
                    ((androidx.fragment.app.FragmentActivity) activity).getSupportFragmentManager().registerFragmentLifecycleCallbacks(mFragmentLifecycleCallbacksToAndroidx, true);
                }
            }
            //Activity 中的 setContentView(View) 一定要在 super.onCreate(Bundle); 之后执行
            if (mAutoAdaptStrategy != null) {
                mAutoAdaptStrategy.applyAdapt(activity, activity);
            }
        }
    

    通过注册registerFragmentLifecycleCallbacks,进行Fragment的生命周期管理,当onFragmentCreated时,也就是OnCreate()中进行了AutoAdaptStrategy#applyAdapt的调用

    @Override
    public void onFragmentCreated(@androidx.annotation.NonNull FragmentManager fm, @androidx.annotation.NonNull Fragment f, Bundle savedInstanceState) {
            if (mAutoAdaptStrategy != null) {
                mAutoAdaptStrategy.applyAdapt(f, f.getActivity());
            }
        }
    
    

    通过全局的进行Activity和Fragment的生命周期监控,在其布局创建之前调用 AutoAdaptStrategy#applyAdapt进行具体的适配操作,它的关键点是动态修改density、scaledDensity、densityDpi三个参数,造成每个Activity或Fragment加载布局时的density、scaledDensity、densityDpi等参数不一样,达到的适配效果则不一样。


    2. 适配策略的实现
    ActivityLifecycleCallbacks的使用能实时监测Activity和Fragment进行适配调用,但是实际操作的代码在策略方案AutoAdaptStrategy的实现子类中,框架中已有默认策略方案,当然自己也可以自定义修改创建。

    • 当target实现CancelAdapt后,将density、scaledDensity、densityDpi恢复到原始状态,不进行匹配
    • 当target实现CustomAdapt后,将density、scaledDensity、densityDpi根据target的配置进行计算后设置
    • 当target未进行任何处理时,将density、scaledDensity、densityDpi根据AndroidManifest.xml中的配置进行计算设置
        @Override
        public void applyAdapt(Object target, Activity activity) {
        	....
            //如果 target 实现 CancelAdapt 接口表示放弃适配, 所有的适配效果都将失效
            if (target instanceof CancelAdapt) {
                AutoSizeLog.w(String.format(Locale.ENGLISH, "%s canceled the adaptation!", target.getClass().getName()));
                AutoSize.cancelAdapt(activity);
                return;
            }
    
            //如果 target 实现 CustomAdapt 接口表示该 target 想自定义一些用于适配的参数, 从而改变最终的适配效果
            if (target instanceof CustomAdapt) {
                AutoSizeLog.d(String.format(Locale.ENGLISH, "%s implemented by %s!", target.getClass().getName(), CustomAdapt.class.getName()));
                AutoSize.autoConvertDensityOfCustomAdapt(activity, (CustomAdapt) target);
            } else {
                AutoSizeLog.d(String.format(Locale.ENGLISH, "%s used the global configuration.", target.getClass().getName()));
                AutoSize.autoConvertDensityOfGlobal(activity);
            }
            ...
        }
       
    

    8. 其它

    1. Fragment横竖屏切换布局问题
    由于某些原因, 屏幕旋转后 Fragment 的重建, 会导致框架对 Fragment 的自定义适配参数失去效果。所以如果您的 Fragment 允许屏幕旋转, 则请在 onCreateView 手动调用一次 AutoSize.autoConvertDensity(),如AutoSize.autoConvertDensity(getActivity(), 1080, true)。
    如果您的 Fragment 不允许屏幕旋转, 则可以将下面调用 AutoSize.autoConvertDensity() 的代码删除掉

    public class CustomFragment1 extends Fragment implements CustomAdapt {
    
        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            //由于某些原因, 屏幕旋转后 Fragment 的重建, 会导致框架对 Fragment 的自定义适配参数失去效果
            //所以如果您的 Fragment 允许屏幕旋转, 则请在 onCreateView 手动调用一次 AutoSize.autoConvertDensity()
            //如果您的 Fragment 不允许屏幕旋转, 则可以将下面调用 AutoSize.autoConvertDensity() 的代码删除掉
            AutoSize.autoConvertDensity(getActivity(), 1080, true);
            return createTextView(inflater, "Fragment-1\nView width = 360dp\nTotal width = 1080dp", 0xffff0000);
        }
    

    2. 主副单位的逐步替换
    框架中同时支持主单位和副单位,对于对于旧项目中已使用dp或px的项目,可以通过逐步在新页面中使用主单位副单位。通过不断的迭代替换,最终将项目中的主单位如dp全替换为副单位px,或者将副单位px全替换为主单位dp。

    当单位都替换完成后,设置UnitsManager.setSupportDP(false)关闭对dp的支持,彻底隔离修改 density 所造成的不良影响。
    或者都使用dp,不在支持副单位时设置UnitsManager.setSupportSubunits(Subunits.NONE)关闭对副单位的支持。

    3. 主副单位的同时支持
    当使用者想将旧项目从主单位过渡到副单位, 或从副单位过渡到主单位时。因为在使用主单位时, 建议在 AndroidManifest 中填写设计图的 dp 尺寸, 比如 360 * 640。

    但在 AndroidManifest 中却只能填写一套设计图尺寸, 并且已经填写了主单位的设计图尺寸,所以当项目中同时存在副单位和主单位, 并且副单位的设计图尺寸与主单位的设计图尺寸不同时, 可以通过UnitsManager#setDesignSize() 方法配置。

    如果副单位的设计图尺寸与主单位的设计图尺寸相同, 则不需要调用 UnitsManager#setDesignSize(), 框架会自动使用 AndroidManifest 中填写的设计图尺寸。

    4. 自定义单位模拟器创建
    布局时的实时预览在开发阶段是一个很重要的环节, 很多情况下 Android Studio 提供的默认预览设备并不能完全展示我们的设计图。所以我们就需要自己创建模拟设备, 大神@JessYan已经为我们准备好了dp、pt、in、mm 这四种单位的模拟设备创建方法,请点击查看链接https://github.com/JessYanCoding/AndroidAutoSize/blob/master/README-zh.md#preview


    总结

    经过我自己修改注释的源码在https://github.com/l424533553/MyAutoSize中,大家也可以自行封装框架,适合自己的才是最好的。

    屏幕自适应的核心就是根据需要在使用之前不断修改density、scaledDensity、densityDpi达到适配效果。


    相关链接

    1. Android 今日头条屏幕适配详细使用攻略
    2. Lottie动画 轻松使用

    扩展链接:

    1. Android CameraX 使用入门
    2. Android studio 最全必用插件
    3. Android 史上最新最全的ADB及命令百科,没有之一

    博客书写不易,您的点赞收藏是我前进的动力,千万别忘记点赞、 收藏 ^ _ ^ !

    展开全文
  • Qt写的Windows下屏幕录制程序源码

    热门讨论 2014-05-30 21:52:45
    Qt + ffmpeg写的Windows屏幕录制程序(包含源程序和编译好的可执行程序) 程序使用方法: ScreenCapture w h w和h分别表示希望录制的帧宽度和高度
  • Flutter 屏幕适配

    千次阅读 多人点赞 2020-09-15 18:18:57
    志当存高远。——诸葛亮 屏幕尺寸大全 菜单栏共有5个选项,包括手机、平板、手表、电脑、显示器,分别显示屏幕尺寸、PPI、纵横比、dp和px 单位下的宽✘...屏幕分辨率是指屏幕图像的精密度,是显示器所能显示的...

    志当存高远。——诸葛亮

     屏幕尺寸大全

    菜单栏共有5个选项,包括手机、平板、手表、电脑、显示器,分别显示屏幕尺寸、PPI、纵横比、dp和px 单位下的宽✘高,以及DPI。

    官方设计规范

    适配原理

     屏幕尺寸 

    严格来说,屏幕尺寸实际被物理尺寸和显示分辨率两个部分定义。而我们今天对各类手机、Pad 设备所说的屏幕尺寸,只指物理尺寸。如果一块手机屏幕的物理尺寸是 5.0 英寸,即是指该手机屏幕对角线的长度。

    屏幕分辨率

    屏幕分辨率是指屏幕图像的精密度,是显示器所能显示的像素的具体数值。 如一个手机标称分辨率是 400 x 800,即表示屏幕横向由 400 个像素点组成,纵向由 800 个像素点组成。由于屏幕上的点、线和面都是由像素组成的,屏幕具备的像素点越多,画面就越精细。分辨率越高,单位面积内显示的信息就越多,我们能看到的内容就越多。 

    屏幕比例

    屏幕比例是指屏幕的宽度与高度的比例,今天更多指分辨率的比例,即
    屏幕比例 = 屏幕横向分辨率 / 屏幕纵向分辨率
    此外,在各类设备、平台之间也有一些比较常用的比例,同时也推荐大家在开发对应设置或平台的应用时使用推荐比例。
    使用推荐比例可以让用户在使用我们的 App 时更舒适,带来更好的使用体验。

    DPI
    DPI(Dots Per Inch),每英寸所拥有的点数,原用于打印机、鼠标的精确度指标。
    在屏幕方面一般使用 PPI 来表示精度。 

    PPI
    PPI(Pixels Per Inch),每英寸所拥有的像素数,屏幕的 PPI 越高,表示屏幕中的每个像素点之间的距离越接近,像素的密度越高,这样屏幕内容看起来就更加细腻、真实。
    而当 PPI 超过 300 时,屏幕被认为达到了视网膜级别,一般情况下人眼已经较难察觉 300 以上 PPI 之间的差别。

    图片描述

    屏幕密度(Density)
    Density 由 Android 1.6 版本(Android API Level 4)为了适配不同大小的屏幕而提出,表示每英寸有多少个显示点(逻辑值),它的单位是 DPI。
    在 Android 原生开发中,常常使用 dp/dip/sp 等单位来定义视图、文字的宽高
    理论上当 Density 的值为 160 DPI 时,1px = 1dp,当前屏幕的 Density 为 320 DPI 时,2px = 1dp 

    倍率DPR(devicePixelRatio)

    有的地方也叫设备像素比,是设备像素dp和设备独立像素dips的比例,
    也就是dpr = dp / dips 

    逻辑分辨率
    逻辑分辨率在 APICloud 应用中也可以被当做显示分辨率使用。
    逻辑分辨率与屏幕分辨率在当今的主流设备中是不相同的,公式为:
    逻辑分辨率 = 屏幕分辨率 / 屏幕倍率
    在 Android 系统中,根据 DP 的定义 1dp = 1px 时, Density 为 160,可知公式为:
    Android 屏幕倍率 = Density / 160
    如 iPhone 4 的屏幕分辨率为 640 x 960,逻辑分辨率为:
    640 / 2 x 960 / 2 = 320 x 480
    而小米 2 的屏幕分辨率为 720 x 1280,Density 为 320,逻辑分辨率为:
    720 / (320 / 160) x 1280 / (320 / 160) = 360 x 640 

    屏幕适配(自适应)方案

         现代手机屏幕尺寸各不相同,导致我们平时写布局的时候会在个不同的移动设备上显示的效果不同。为了达到一套代码所有手机体验一致效果,需要做尺寸上的适配。

    计算公式:实际尺寸 = UI尺寸 * 设备宽度/设计图宽度

    1px方案 : 1px = 1 / 设备像素比

    750设计图为例

    import 'package:flutter/material.dart';
    import 'dart:ui';
    
    class Adapt {
        static MediaQueryData mediaQuery = MediaQueryData.fromWindow(window);
        static double _width = mediaQuery.size.width;
        static double _height = mediaQuery.size.height;
        static double _topbarH = mediaQuery.padding.top;
        static double _botbarH = mediaQuery.padding.bottom;
        static double _pixelRatio = mediaQuery.devicePixelRatio;
        static var _ratio;
        static init(int number){
            int uiwidth = number is int ? number : 750;
            _ratio = _width / uiwidth;
        }
        static px(number){
            if(!(_ratio is double || _ratio is int)){Adapt.init(750);}
            return number * _ratio;
        }
        static onepx(){
            return 1/_pixelRatio;
        }
        static screenW(){
            return _width;
        }
        static screenH(){
            return _height;
        }
        static padTopH(){
            return _topbarH;
        }
        static padBotH(){
            return _botbarH;
        }
    }
    // 设置文本大小 30 为设计图尺寸
    new Text(
        'Hello World!',
        style: TextStyle(
             fontSize: Adapt.px(30),
         )
    )
    // 容器尺寸大小设置 一个设计图为 300*300像素的容器
    new Container(    width: Adapt.px(300),  
        height: Adapt.px(300),
    )
    // 1px 
    new Container(
        decoration: new BoxDecoration(
              border: new Border(bottom:BorderSide(width: Adapt.one())),
        ),
    )

     

    屏幕适配方案插件-完美解决屏幕适配

    插件地址

    添加依赖

    dependencies:
      flutter:
        sdk: flutter
      # 添加依赖
      flutter_screenutil: ^0.5.0 
    属性类型默认值描述
    widthint1080px设计稿中设备的宽度,单位px
    heightint1920px设计稿中设备的高度,单位px
    allowFontScalingboolfalse设置字体大小是否根据系统的“字体大小”辅助选项来进行缩放

    初始化

    @override
    Widget build(BuildContext context) {
      ScreenUtil.init(context, width: 750, height: 1624, allowFontScaling: true);
    }    
    //填入设计稿中设备的屏幕尺寸
    
    //默认 width : 1080px , height:1920px , allowFontScaling:false
    ScreenUtil.instance = ScreenUtil.getInstance()..init(context);
    
    //假如设计稿是按iPhone6的尺寸设计的(iPhone6 750*1334) 
    ScreenUtil.instance = ScreenUtil(width: 750, height: 1334)..init(context);
    
    //设置字体大小根据系统的“字体大小”辅助选项来进行缩放,默认为false : 字体随着系统的“字体大小”辅助选项来进行缩放
    ScreenUtil.instance = ScreenUtil(width: 750, height: 1334, allowFontScaling: true)..init(context); 

    适配尺寸

    //长方形:
    Container(
               width: ScreenUtil.getInstance().setWidth(375),
               height: ScreenUtil.getInstance().setHeight(200),
                ),
                
    //如果你想显示一个正方形:
    Container(
               width: ScreenUtil.getInstance().setWidth(300),
               height: ScreenUtil.getInstance().setWidth(300),
                ), 

    适配字体-传入设计稿的px尺寸

    //传入字体大小,默认不根据系统的“字体大小”辅助选项来进行缩放(可在初始化ScreenUtil时设置allowFontScaling)
    ScreenUtil.getInstance().setSp(28)         
     
    //传入字体大小,根据系统的“字体大小”辅助选项来进行缩放(如果某个地方不遵循全局的allowFontScaling设置)     
    ScreenUtil(allowFontScaling: true).setSp(28)        
         
    //for example:
    
    Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: <Widget>[
                    Text('我的文字大小在设计稿上是25px,不会随着系统的文字缩放比例变化',
                        style: TextStyle(
                            color: Colors.black, fontSize: ScreenUtil.getInstance().setSp(24))),
                    Text('我的文字大小在设计稿上是25px,会随着系统的文字缩放比例变化',
                        style: TextStyle(
                            color: Colors.black, fontSize: ScreenUtil(allowFontScaling: true).setSp(24))),
                  ],
                ) 

     其他相关api

     ScreenUtil.pixelRatio       //设备的像素密度
        ScreenUtil.screenWidth      //设备宽度
        ScreenUtil.screenHeight     //设备高度
        ScreenUtil.bottomBarHeight  //底部安全区距离,适用于全面屏下面有按键的
        ScreenUtil.statusBarHeight  //状态栏高度 刘海屏会更高  单位px
        ScreenUtil.textScaleFactory //系统字体缩放比例
        
        ScreenUtil.getInstance().scaleWidth  // 实际宽度的dp与设计稿px的比例
        ScreenUtil.getInstance().scaleHeight // 实际高度的dp与设计稿px的比例 

     

      @override
      Widget build(BuildContext context) {
        //设置适配尺寸 (填入设计稿中设备的屏幕尺寸) 假如设计稿是按iPhone6的尺寸设计的(iPhone6 750*1334)
        ScreenUtil.instance = ScreenUtil(width: 750, height: 1334)..init(context);
        
        print('设备宽度:${ScreenUtil.screenWidth}'); //Device width
        print('设备高度:${ScreenUtil.screenHeight}'); //Device height
        print('设备的像素密度:${ScreenUtil.pixelRatio}'); //Device pixel density
        print(
            '底部安全区距离:${ScreenUtil.bottomBarHeight}'); //Bottom safe zone distance,suitable for buttons with full screen
        print(
            '状态栏高度:${ScreenUtil.statusBarHeight}px'); //Status bar height , Notch will be higher Unit px
    
        print('实际宽度的dp与设计稿px的比例:${ScreenUtil.getInstance().scaleWidth}');
        print('实际高度的dp与设计稿px的比例:${ScreenUtil.getInstance().scaleHeight}');
    
        print(
            '宽度和字体相对于设计稿放大的比例:${ScreenUtil.getInstance().scaleWidth * ScreenUtil.pixelRatio}'); 
        print(
            '高度相对于设计稿放大的比例:${ScreenUtil.getInstance().scaleHeight * ScreenUtil.pixelRatio}'); 
        print('系统的字体缩放比例:${ScreenUtil.textScaleFactory}');
    
        return new Scaffold(
          appBar: new AppBar(
            title: new Text(widget.title),
          ),
          body: new Center(
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.center,
              children: <Widget>[
                Row(
                  children: <Widget>[
                    Container(
                      width: ScreenUtil.getInstance().setWidth(375),
                      height: ScreenUtil.getInstance().setHeight(200),
                      color: Colors.red,
                      child: Text(
                        '我的宽度:${ScreenUtil.getInstance().setWidth(375)}dp',
                        style: TextStyle(
                          color: Colors.white,
                          fontSize: ScreenUtil.getInstance().setSp(12),
                        ),
                      ),
                    ),
                    Container(
                      width: ScreenUtil.getInstance().setWidth(375),
                      height: ScreenUtil.getInstance().setHeight(200),
                      color: Colors.blue,
                      child: Text('我的宽度:${ScreenUtil.getInstance().setWidth(375)}dp',
                          style: TextStyle(
                            color: Colors.white,
                            fontSize: ScreenUtil.getInstance().setSp(12),
                          )),
                    ),
                  ],
                ),
                Text('设备宽度:${ScreenUtil.screenWidth}px'),
                Text('设备高度:${ScreenUtil.screenHeight}px'),
                Text('设备的像素密度:${ScreenUtil.pixelRatio}'),
                Text('底部安全区距离:${ScreenUtil.bottomBarHeight}px'),
                Text('状态栏高度:${ScreenUtil.statusBarHeight}px'),
                Text(
                  '实际高度的dp与设计稿px的比例:${ScreenUtil.getInstance().scaleHeight}',
                  textAlign: TextAlign.center,
                ),
                Text(
                  '实际高度的dp与设计稿px的比例:${ScreenUtil.getInstance().scaleHeight}',
                  textAlign: TextAlign.center,
                ),
                Text(
                  '宽度和字体相对于设计稿放大的比例:${ScreenUtil.getInstance().scaleWidth * ScreenUtil.pixelRatio}',
                  textAlign: TextAlign.center,
                ),
                Text(
                  '高度相对于设计稿放大的比例:${ScreenUtil.getInstance().scaleHeight * ScreenUtil.pixelRatio}',
                  textAlign: TextAlign.center,
                ),
                SizedBox(
                  height: ScreenUtil.getInstance().setHeight(100),
                ),
                Text('系统的字体缩放比例:${ScreenUtil.textScaleFactory}'),
                Column(
                             crossAxisAlignment: CrossAxisAlignment.start,
                             children: <Widget>[
                               Text('我的文字大小在设计稿上是25px,不会随着系统的文字缩放比例变化',
                                   style: TextStyle(
                                       color: Colors.black, fontSize: ScreenUtil.getInstance().setSp(24))),
                               Text('我的文字大小在设计稿上是25px,会随着系统的文字缩放比例变化',
                                   style: TextStyle(
                                       color: Colors.black, fontSize: ScreenUtil(allowFontScaling: true).setSp(24))),
                             ],
                           )
              ],
            ),
          ),
        );
      } 

     

    全面屏、折叠屏适配与兼容问题

    一 启动白屏问题 

           采用Flutter 开发的app,无论Android还是Ios,都会出现白屏的现象,大概持续1-3秒,他会根据手机或模拟器的速溶而不同,时间可长可短。Flutter 应用在启动的时候会先启动Flutter SDK, 然后加载到内存里面 ,然后完成渲染,在这个过程中 它是没有内容可以显示的,因此会显示白屏.
    二 解决白屏问题
     
    (1)可以在flutter项目中引入插件
     

     

    注意 :Android App启动的时候,会有一个默认的白屏 ,这个白屏在启动的时候会显示主题,如果主体色不是透明的 就会有个白屏

        Android的白屏非两个部分,一个是主题的白屏(如果主题不是透明的时候,点击图标会显示白屏),二,当App启动起来之后,会显示启动屏(如果没有启动屏,会显示默认的白屏)

    二 Flutter 全面屏适配指南

    1)全面屏特点,以及存在问题
       
       特点: 
            1 大屏占比高、长宽比不再试16:9,达到了19.5:9甚至更高
            2 短边的像素,density的取值是一样的 所有适配的是长边
     

    问题:

           1. 传统布局的高度不足,导致上下留黑边
           2. 基于屏幕顶部或底部的布局,如弹框,在全面屏手机上会发生位移
           3. 安全区域问题
     
    Flutter中全面屏的页面适配分两种情况:
     
         1.一种是对于页面已经使用了Scaffold的appBar 与bottomNavigationBar页面是不需要额外适配的,因为Scaffold框架会自动化帮助我们完成这些适配工作;
         2. 另外一种情况,没有使用了Scaffold或者Scaffold的appBar 与bottomNavigationBar页面,改如何适配全面屏呢?
     
      (1) 适配要点
            . 顶部NavigationBar上部留安全区域
            .  底部NavigationBar底部留安全区域
     
       对于安全区域的适配有两种方案:
     
          1. 采用 SafeArea来包裹页面,SafeArea是Flutter中的一个用于全面屏的一个组件,类似RN中SafeAreaView 主要用于解决适配全面屏手机的安全取悦问题;
         2.借助MeadiaQuery.of(context).padding 获取屏幕四周的padding,然后根据padding自己手动实现对安全区域的控制;
         . 方案一:相对简单的,只需要引入SafeArea,但不够灵活
         . 方案二:需要借助MeadiaQuery.of(context).padding自己实现对安全区域的控制,相对复杂些,但灵活度高
     

    借助 MediaQuery.of(context).padding手动适配

     

     提示:使用MediaQuery.of时要留意它所属的widget 不能直接和runApp解除,需要一个带有MaterialApp的widget 包裹一下这样才能使用MediaQuery.of

     

    富有表现力,漂亮的用户界面

     

     

     

    Android基础 - 如何做鲁棒性更高的布局

    Android 启动背景图怎么适配?

    ANDROID SPLASH启动页秒开方案,适配全面屏

    Android 启动页全面屏的适配

    展开全文
  • 【OLED】OLED屏幕的基础知识

    千次阅读 多人点赞 2018-08-17 15:19:14
    单色屏幕的像素是一个像素就是一个发光二极管。OLED是”自发光”,像素本身就是光源,所以对比度极高,显示效果很犀利,绝无朦朦胧胧、拖泥带水之感,深受爱好者追捧,可惜当前技术所限制,无法大尺寸化,价格比TFT...

    OLED显示屏基础知识:
    显示屏的发光单元是有机聚合物发光二极管,即organic/polymer light emitting diode,简称OLED。单色屏幕的像素是一个像素就是一个发光二极管。OLED是”自发光”,像素本身就是光源,所以对比度极高,显示效果很犀利,绝无朦朦胧胧、拖泥带水之感,深受爱好者追捧,可惜当前技术所限制,无法大尺寸化,价格比TFT液晶屏高得多。
    OLED分为PMOLED、AMOLED两种,其中PMOLED为无源驱动,AMOLED为有源驱动。

    展开全文
  • OLED屏幕和LCD屏幕的区别与优劣

    千次阅读 多人点赞 2019-11-11 17:40:47
    随着科技越来越多的手机用上了OLED屏幕,大家也开始逐渐了解起来了手机的屏幕,这篇文章呢将会用最简单的语言和图片,告诉你OLED屏幕和LCD屏幕究竟有什么差别。 要知道OLED屏幕 和 LCD屏幕的区别,我们需要从运行...
  • Android从屏幕底部弹出PopupWindow

    千次下载 热门讨论 2015-09-03 09:55:20
    Android从屏幕底部滑动弹出PopupWindow,有动画效果,类似于sharesdk的分享页面滑动弹出效果。
  • 文章地址:http://blog.csdn.net/i7788/article/details/44937277
  • 一, 屏幕基本元素(单值输入框,RANGE输入,单选按钮,复选框定义) TABLES: SFLIGHT. SELECTION-SCREEN BEGIN OF BLOCKbk1WITH FRAME TITLE text-001. PARAMETERS:P_CARRIDLIKESFLIGHT-CARRID ." 单值输入框 ...
  • Android 屏幕适配方案

    万次阅读 多人点赞 2015-05-04 13:08:47
    1、概述大家在Android开发时,肯定会觉得屏幕适配是个尤其痛苦的事,各种屏幕尺寸适配起来蛋疼无比。如果我们换个角度我们看下这个问题,不知道大家有没有了解过web前端开发,或者说大家对于网页都不陌生吧,其实...
  • 我在实现安卓模拟点击屏幕固定位置时尝试了很多方法,碰了不少壁,现在我将我实现的方法分享给大家,以及我尝试过的方法也分享给大家,让大家在开发的路上少走些弯路。 首先我尝试用安卓辅助功能Accessibility...
  • 在此做笔记方便查看:原文见 :点击打开链接 http://www.chinaz.com/manage/2015/0902/441624.shtml另:关于屏幕的适配:参考文章点击打开链接 http://www.cocoachina.com/android/20151030/13971.html今天我给...
  • ffmpeg直接采集屏幕;VLC的x264库进行压缩编码;live555作为服务器,侦听554端口,当有连接时,开始录制屏幕并发送。
  • 把平板、手机作为电脑第二屏幕(Linux系统下)

    千次阅读 多人点赞 2020-02-12 14:10:00
    将平板、手机作为电脑第二屏幕(Linux系统下) 背景 把手机、平板作为电脑第二屏幕是上个学期偶然想到的,那时我一边看网上的教程一边码代码。由于看的是视频教程,缩小了就看不清上面的字,放大了又会挡住打字区域...
  • android手机屏幕共享软件

    热门讨论 2012-12-20 10:40:25
    本软件可以实时显示android手机屏幕的动态 方便android开发人员开发 欢迎前来下载
  • iphone屏幕自定义排版Khamosh PathakKhamosh PathakAfter years of looking at the same grid of icons, it’s time to finally customize your iPhone to your heart’s content. Add some cool-looking custom ...
  • Android电脑源码通过adb实现实时屏幕演示
  • 什么是 smallestWidth smallestWidth 翻译为中文的意思就是 ...这就要说到,移动设备都是允许屏幕可以旋转的,当屏幕旋转时,屏幕的高宽就会互换,加上 最小 这两个字,是因为这个方案是不区分屏幕方向的,它只会把...
  • SAP选择屏幕开发(一)

    千次阅读 2019-05-28 17:01:26
    用户通过屏幕操作来实现与SAP的数据交互,而SAP的屏幕开发一般分为两种,一种是通过SAP ABAP语法创建屏幕元素,称之为选择屏幕,选择屏幕主要是用来输入查询参数;第二种是通过SAP的屏幕编辑器开发,通过屏幕编辑器...
  • OLED 12864屏幕指南

    万次阅读 多人点赞 2019-04-29 16:05:17
    OLED12864屏幕指南 OLED 屏幕作为一种新型的显示技术,其自身可以发光,亮度,对比度高,功耗低,在当下备受追捧。而在我们正常的显示调整参数过程中,我们越来越多的使用这种屏幕。我们使用的一般是分辨率为 128x...
  • 安卓的屏幕方向和摄像头方向1. 前言2. Android 的屏幕方向2.1 什么是屏幕方向?2.2 为什么要获取屏幕方向?2.3 屏幕方向的获取与设置2.3.1 如何获取屏幕方向?2.3.2 如何设置屏幕方向?2. Android 的摄像头方向 1. ...
  • 手机屏幕材质各有什么区别? 慢慢买比价 ​ 已认证的官方帐号 74 人赞同了该文章 今天我就为大家带来一篇纯干货知识点整理,关于手机屏幕那点事看完秒懂。 以及大家对于苹果手机LCD屏和OLED的区别在哪里的...
  • 因近期项目需要,实现了一套多种网络拓扑、多种应用场景的多平台屏幕共享系统,包括组播屏幕共享、服务器转发屏幕共享、P2P屏幕共享,暂支持Windows屏幕共享给Windows,Windows屏幕共享给Android等,后续加入android...
  • Android屏幕适配方案总结

    千次阅读 2020-05-22 21:31:36
    px(像素):每个px对应屏幕上的一个点。 dip或dp:(device independent pixels,设备独立像素):一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dip=1px.单随着屏幕的密度改变,dip和px的换算也会发生改变 ...
  • Android之调节屏幕亮度

    千次阅读 2019-03-17 16:05:18
    1、需求分析 ...我很早就注意到了这点,所以当我自己的项目需要做二维码点击放大功能时,我也在放大的同时把屏幕的界面调亮一点。尽管我当时比较轻松地实现了这个功能,但是当我编写屏幕亮度工具...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,459,071
精华内容 583,628
关键字:

屏幕