Android 屏幕适配方案

每日一字节跳动面试真题:说一下RecyclerView-性能优化(1) 字节跳动四面有三面都问了这个问题,在此做了整理,希望可以帮助到大家,欢迎查漏补缺。 阅读详情
转载请标明出处: 
http://blog.youkuaiyun.com/lmj623565791/article/details/45460089 ; 

本文出自:【张鸿洋的博客】

1、概述

大家在Android开发时,肯定会觉得屏幕适配是个尤其痛苦的事,各种屏幕尺寸适配起来蛋疼无比。如果我们换个角度我们看下这个问题,不知道大家有没有了解过web前端开发,或者说大家对于网页都不陌生吧,其实适配的问题在web页面的设计中理论上也存在,为什么这么说呢?电脑的显示器的分辨率、包括手机分辨率,我敢说分辨率的种类远超过Android设备的分辨率,那么有一个很奇怪的现象:

为什么Web页面设计人员从来没有说过,尼玛适配好麻烦?

那么,到底是什么原因,让网页的设计可以在千差万别的分辨率的分辨率中依旧能给用户一个优质的体验呢?带着这个疑惑,我问了下媳妇(前端人员),媳妇睁大眼睛问我:什么叫适配?fc,尼玛,看来的确没有这类问题。后来再我仔细的追问后,她告诉我,噢,这个尺寸呀,我都是设置为20%的~~追根到底,其实就是一个原因,网页提供了百分比计算大小。

同样的,大家拿到UI给的设计图以后,是不是抱怨过尼玛你标识的都是px,我项目里面用dp,这什么玩意,和UI人员解释,UI妹妹也不理解。那么本例同样可以解决Android工程师和UI妹妹间的矛盾~UI给出一个固定尺寸的设计稿,然后你在编写布局的时候不用思考,无脑照抄上面标识的像素值,就能达到完美适配,理想丰不丰满~~。

然而,Android对于不同的屏幕给出的适配方案是dp,那么dp与百分比的差距到底在哪里?

2、dp vs 百分比

  • dp

我们首先看下dp的定义:

Density-independent pixel (dp)独立像素密度。标准是160dip.即1dp对应1个pixel,计算公式如:px = dp * (dpi / 160),屏幕密度越大,1dp对应 的像素点越多。 
上面的公式中有个dpi,dpi为DPI是Dots Per Inch(每英寸所打印的点数),也就是当设备的dpi为160的时候1px=1dp;

好了,上述这些概念记不记得住没关系,只要记住一点dp是与像素无关的,在实际使用中1dp大约等于1/160inch。

那么dp究竟解决了适配上的什么问题?可以看出1dp = 1/160inch;那么它至少能解决一个问题,就是你在布局文件写某个View的宽和高为160dp*160dp,这个View在任何分辨率的屏幕中,显示的尺寸大小是大约是一致的(可能不精确),大概是 1 inch * 1 inch。

但是,这样并不能够解决所有的适配问题:

  • 呈现效果仍旧会有差异,仅仅是相近而已
  • 当设备的物理尺寸存在差异的时候,dp就显得无能为力了。为4.3寸屏幕准备的UI,运行在5.0寸的屏幕上,很可能在右侧和下侧存在大量的空白。而5.0寸的UI运行到4.3寸的设备上,很可能显示不下。

以上两点,来自参考链接1

一句话,总结下,dp能够让同一数值在不同的分辨率展示出大致相同的尺寸大小。但是当设备的尺寸差异较大的时候,就无能为力了。适配的问题还需要我们自己去做,于是我们可能会这么做:

[html]  view plain  copy
  1. <?xml version="1.0" encoding="utf-8"?>    
  2. <resources>    
  3.     <!-- values-hdpi 480X800 -->    
  4.     <dimen name="imagewidth">120dip</dimen>        
  5. </resources>    
  6.   
  7. <resources>    
  8.     <!-- values-hdpi-1280x800 -->    
  9.     <dimen name="imagewidth">220dip</dimen>        
  10. </resources>    
  11.   
  12.   
  13. <?xml version="1.0" encoding="utf-8"?>    
  14. <resources>    
  15.     <!-- values-hdpi  480X320 -->    
  16.     <dimen name="imagewidth">80dip</dimen>        
  17. </resources>   


上述代码片段来自网络,也就是说,我们为了优质的用户体验,依然需要去针对不同的dpi设置,编写多套数值文件。

可以看出,dp并没有能解决适配问题。下面看百分比。

  • 百分比 
    这个概念不用说了,web中支持控件的宽度可以去参考父控件的宽度去设置百分比,最外层控件的宽度参考屏幕尺寸设置百分比,那么其实中Android设备中,只需要支持控件能够参考屏幕的百分比去计算宽高就足够了。

比如,我现在以下几个需求:

  • 对于图片展示的Banner,为了起到该有的效果,我希望在任何手机上显示的高度为屏幕高度的1/4
  • 我的首页分上下两栏,我希望每个栏目的屏幕高度为11/24,中间间隔为1/12
  • slidingmenu的宽度为屏幕宽度的80%

当然了这仅仅是从一个大的层面上来说,其实小范围布局,可能百分比将会更加有用。

那么现在不支持百分比,实现上述的需求,可能需要1、代码去动态计算(很多人直接pass了,太麻烦);2、利用weight(weight必须依赖Linearlayout,而且并不能适用于任何场景)

再比如:我的某个浮动按钮的高度和宽度希望是屏幕高度的1/12,我的某个Button的宽度希望是屏幕宽度的1/3。

上述的所有的需求,利用dp是无法完成的,我们希望控件的尺寸可以按照下列方式编写:

[html]  view plain  copy
  1. <Button  
  2.      android:text="@string/hello_world"  
  3.      android:layout_width="20%w"  
  4.      android:layout_height="10%h"/>  

好了,到此我们可以看到dp与百分比的区别,而百分比能够更好的解决我们的适配问题。

  • some 适配tips

我们再来看看一些适配的tips

  1. 多用match_parent
  2. 多用weight
  3. 自定义view解决

其实上述3点tip,归根结底还是利用百分比,match_parent相当于100%参考父控件;weight即按比例分配;自定义view无非是因为里面多数尺寸是按照百分比计算的;

通过这些tips,我们更加的看出如果能在Android中引入百分比的机制,将能解决大多数的适配问题,下面我们就来看看如何能够让Android支持百分比的概念。

3、百分比的引入

1、引入

其实我们的解决方案,就是在项目中针对你所需要适配的手机屏幕的分辨率各自简历一个文件夹。

如下图:

然后我们根据一个基准,为基准的意思就是:

比如480*320的分辨率为基准

  • 宽度为320,将任何分辨率的宽度分为320份,取值为x1-x320
  • 高度为480,将任何分辨率的高度分为480份,取值为y1-y480

例如对于800*480的宽度480:

可以看到x1 = 480 / 基准 = 480 / 320 = 1.5 ;

其他分辨率类似~~ 
你可能会问,这么多文件,难道我们要手算,然后自己编写?不要怕,下文会说。

那么,你可能有个疑问,这么写有什么好处呢?

假设我现在需要在屏幕中心有个按钮,宽度和高度为我们屏幕宽度的1/2,我可以怎么编写布局文件呢?

[html]  view plain  copy
  1. <FrameLayout >  
  2.   
  3.     <Button  
  4.         android:layout_gravity="center"  
  5.         android:gravity="center"  
  6.         android:text="@string/hello_world"  
  7.         android:layout_width="@dimen/x160"  
  8.         android:layout_height="@dimen/x160"/>  
  9.   
  10. </FrameLayout>  

可以看到我们的宽度和高度定义为x160,其实就是宽度的50%; 

那么效果图:

可以看到不论在什么分辨率的机型,我们的按钮的宽和高始终是屏幕宽度的一半。

  • 对于设计图

假设现在的UI的设计图是按照480*320设计的,且上面的宽和高的标识都是px的值,你可以直接将px转化为x[1-320],y[1-480],这样写出的布局基本就可以全分辨率适配了。

你可能会问:设计师设计图的分辨率不固定怎么办?下文会说~

  • 对于上文提出的几个dp做不到的

你可以通过在引入百分比后,自己试试~~

好了,有个最主要的问题,我们没有说,就是分辨率这么多,尼玛难道我们要自己计算,然后手写?

2、自动生成工具

好了,其实这样的文件夹手写也可以,按照你们需要支持的分辨率,然后编写一套,以后一直使用。

当然了,作为程序员的我们,怎么能做这么low的工作,肯定要程序来实现:

那么实现需要以下步骤:

  1. 分析需要的支持的分辨率

对于主流的分辨率我已经集成到了我们的程序中,当然对于特殊的,你可以通过参数指定。关于屏幕分辨率信息,可以通过该网站查询:http://screensiz.es/phone

  1. 编写自动生成文件的程序

代码如下

[java]  view plain  copy
  1. import java.io.File;  
  2. import java.io.FileNotFoundException;  
  3. import java.io.FileOutputStream;  
  4. import java.io.PrintWriter;  
  5.   
  6. /** 
  7.  * Created by zhy on 15/5/3. 
  8.  */  
  9. public class GenerateValueFiles {  
  10.   
  11.     private int baseW;  
  12.     private int baseH;  
  13.   
  14.     private String dirStr = "./res";  
  15.   
  16.     private final static String WTemplate = "<dimen name=\"x{0}\">{1}px</dimen>\n";  
  17.     private final static String HTemplate = "<dimen name=\"y{0}\">{1}px</dimen>\n";  
  18.   
  19.     /** 
  20.      * {0}-HEIGHT 
  21.      */  
  22.     private final static String VALUE_TEMPLATE = "values-{0}x{1}";  
  23.   
  24.     private static final String SUPPORT_DIMESION = "320,480;480,800;480,854;540,960;600,1024;720,1184;720,1196;720,1280;768,1024;800,1280;1080,1812;1080,1920;1440,2560;";  
  25.   
  26.     private String supportStr = SUPPORT_DIMESION;  
  27.   
  28.     public GenerateValueFiles(int baseX, int baseY, String supportStr) {  
  29.         this.baseW = baseX;  
  30.         this.baseH = baseY;  
  31.   
  32.         if (!this.supportStr.contains(baseX + "," + baseY)) {  
  33.             this.supportStr += baseX + "," + baseY + ";";  
  34.         }  
  35.   
  36.         this.supportStr += validateInput(supportStr);  
  37.   
  38.         System.out.println(supportStr);  
  39.   
  40.         File dir = new File(dirStr);  
  41.         if (!dir.exists()) {  
  42.             dir.mkdir();  
  43.   
  44.         }  
  45.         System.out.println(dir.getAbsoluteFile());  
  46.   
  47.     }  
  48.   
  49.     /** 
  50.      * @param supportStr 
  51.      *            w,h_...w,h; 
  52.      * @return 
  53.      */  
  54.     private String validateInput(String supportStr) {  
  55.         StringBuffer sb = new StringBuffer();  
  56.         String[] vals = supportStr.split("_");  
  57.         int w = -1;  
  58.         int h = -1;  
  59.         String[] wh;  
  60.         for (String val : vals) {  
  61.             try {  
  62.                 if (val == null || val.trim().length() == 0)  
  63.                     continue;  
  64.   
  65.                 wh = val.split(",");  
  66.                 w = Integer.parseInt(wh[0]);  
  67.                 h = Integer.parseInt(wh[1]);  
  68.             } catch (Exception e) {  
  69.                 System.out.println("skip invalidate params : w,h = " + val);  
  70.                 continue;  
  71.             }  
  72.             sb.append(w + "," + h + ";");  
  73.         }  
  74.   
  75.         return sb.toString();  
  76.     }  
  77.   
  78.     public void generate() {  
  79.         String[] vals = supportStr.split(";");  
  80.         for (String val : vals) {  
  81.             String[] wh = val.split(",");  
  82.             generateXmlFile(Integer.parseInt(wh[0]), Integer.parseInt(wh[1]));  
  83.         }  
  84.   
  85.     }  
  86.   
  87.     private void generateXmlFile(int w, int h) {  
  88.   
  89.         StringBuffer sbForWidth = new StringBuffer();  
  90.         sbForWidth.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");  
  91.         sbForWidth.append("<resources>");  
  92.         float cellw = w * 1.0f / baseW;  
  93.   
  94.         System.out.println("width : " + w + "," + baseW + "," + cellw);  
  95.         for (int i = 1; i < baseW; i++) {  
  96.             sbForWidth.append(WTemplate.replace("{0}", i + "").replace("{1}",  
  97.                     change(cellw * i) + ""));  
  98.         }  
  99.         sbForWidth.append(WTemplate.replace("{0}", baseW + "").replace("{1}",  
  100.                 w + ""));  
  101.         sbForWidth.append("</resources>");  
  102.   
  103.         StringBuffer sbForHeight = new StringBuffer();  
  104.         sbForHeight.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");  
  105.         sbForHeight.append("<resources>");  
  106.         float cellh = h *1.0f/ baseH;  
  107.         System.out.println("height : "+ h + "," + baseH + "," + cellh);  
  108.         for (int i = 1; i < baseH; i++) {  
  109.             sbForHeight.append(HTemplate.replace("{0}", i + "").replace("{1}",  
  110.                     change(cellh * i) + ""));  
  111.         }  
  112.         sbForHeight.append(HTemplate.replace("{0}", baseH + "").replace("{1}",  
  113.                 h + ""));  
  114.         sbForHeight.append("</resources>");  
  115.   
  116.         File fileDir = new File(dirStr + File.separator  
  117.                 + VALUE_TEMPLATE.replace("{0}", h + "")//  
  118.                         .replace("{1}", w + ""));  
  119.         fileDir.mkdir();  
  120.   
  121.         File layxFile = new File(fileDir.getAbsolutePath(), "lay_x.xml");  
  122.         File layyFile = new File(fileDir.getAbsolutePath(), "lay_y.xml");  
  123.         try {  
  124.             PrintWriter pw = new PrintWriter(new FileOutputStream(layxFile));  
  125.             pw.print(sbForWidth.toString());  
  126.             pw.close();  
  127.             pw = new PrintWriter(new FileOutputStream(layyFile));  
  128.             pw.print(sbForHeight.toString());  
  129.             pw.close();  
  130.         } catch (FileNotFoundException e) {  
  131.             e.printStackTrace();  
  132.         }  
  133.     }  
  134.   
  135.     public static float change(float a) {  
  136.         int temp = (int) (a * 100);  
  137.         return temp / 100f;  
  138.     }  
  139.   
  140.     public static void main(String[] args) {  
  141.         int baseW = 320;  
  142.         int baseH = 400;  
  143.         String addition = "";  
  144.         try {  
  145.             if (args.length >= 3) {  
  146.                 baseW = Integer.parseInt(args[0]);  
  147.                 baseH = Integer.parseInt(args[1]);  
  148.                 addition = args[2];  
  149.             } else if (args.length >= 2) {  
  150.                 baseW = Integer.parseInt(args[0]);  
  151.                 baseH = Integer.parseInt(args[1]);  
  152.             } else if (args.length >= 1) {  
  153.                 addition = args[0];  
  154.             }  
  155.         } catch (NumberFormatException e) {  
  156.   
  157.             System.err  
  158.                     .println("right input params : java -jar xxx.jar width height w,h_w,h_..._w,h;");  
  159.             e.printStackTrace();  
  160.             System.exit(-1);  
  161.         }  
  162.   
  163.         new GenerateValueFiles(baseW, baseH, addition).generate();  
  164.     }  
  165.   
  166. }  


同时我提供了jar包,默认情况下,双击即可生成,使用说明:

下载地址见文末,内置了常用的分辨率,默认基准为480*320,当然对于特殊需求,通过命令行指定即可:

例如:基准 1280 * 800 ,额外支持尺寸:1152 * 735;4500 * 3200;

按照

java -jar xx.jar width height width,height_width,height

上述格式即可。

到此,我们通过编写一个工具,根据某基准尺寸,生成所有需要适配分辨率的values文件,做到了编写布局文件时,可以参考屏幕的分辨率;在UI给出的设计图,可以快速的按照其标识的px单位进行编写布局。基本解决了适配的问题。

本方案思想已经有公司投入使用,个人认为还是很不错的,如果大家有更好的方案来解决屏幕适配的问题,欢迎留言探讨或者直接贴出好文链接,大家可以将自己的经验进行分享,这样才能壮大我们的队伍~~。

注:本方案思想来自Android Day Day Up 一群的【blue-深圳】,经其同意编写此文,上述程序也很大程度上借鉴了其分享的源码。在此标识感谢,预祝其创业成功!

===>后期更新


Android屏幕适配 Android屏幕适配方案 阅读详情

相关推荐

Android屏幕适配方案总结

一、基础知识 1.Android中常用的距离单位 px(像素):每个px对应屏幕上的一个点。 dip或dp:(device independent pixels,设备独立像素):一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dip=1px.单随着屏幕的密度改变,dip和px的换算也会发生改变 sp(scaled pixels, 比例像素):主要处理字体的大小,可以根据用户的字体大小首选项进行缩放。 in(英寸):标准长度单位,1 英寸=2.54 厘米。 mm(毫米):标准长度

汉堡怪兽 7964

【Android】之屏幕适配

Android 系统能发展到今天,离不开其开源性,但是随着越来越多的设备接入 Android 系统,并对 Android 系统进行各种各样的定制,导致长期以来出现了各种碎片化严重的问题。例如,Android 屏幕尺寸多种多样,如 5 寸、5.9 寸、6 寸、6.1 寸 等等,当然,屏幕分辨率也是多种多样,这很容易导致同一元素在不同手机上显示的效果不同的问题,因此,Android 应用开发中的屏幕适配工作也越来越重要。本篇文章就介绍一下 Android 中屏幕适配相关的知识。

yang553566463的博客 7140

android屏幕适配工具

android屏幕适配 ,生成values-1280x720,values-1920x1080等的工具

Android屏幕适配方案,水得我都震惊了

文章目录前言 前言 没有大佬们的辛勤创作,就没有我们搬运工啥事,感动~。总的来说屏幕适配系列的课程讲得一般,刘海屏适配中列出来的各大厂商的参考文档已经算这里面比较有参考价值的资源了。 提示:以下是本篇文章正文内容 一、自定义像素适配 二、手写百分比布局适配 三、修改系统density, densityDpi适配 四、刘海屏适配 五、详解网易云音乐屏幕适配 UI系列文章 ...

让技术为我所用 416

ICC2 实战秘籍:create_workspace 命令全解析

必选项:工作区名称,这可是创建工作区的 “身份证”,必不可少。技术数据选项匹配:优先考虑用 -technology 直接加载技术文件,这是获取最新、最准确技术数据的首选路径;要是已经有合适的技术库了,那 -use_technology_lib 引用现有技术库也能快速上手。精度设置优先规则:技术文件自动配置排在第一位,能自动适配就别手动操心;要是自动配置不理想,那就显式指定 scale_factor;实在没要求,就用默认配置,但得清楚它的精度限制。

weixin_50820814的博客 1124

PCIe中ACS知识小记

虚拟机内部的访问数据显而易见是带的GPA地址。而目前几乎所有的PCIe 设备都带ACS control,所以它们可以单独assign给不同的VM,但是随之而来的就是即使两个GPU同时assign给同一个VM,由于ACS的存在,他们之间也不会有真正的物理层面的P2P访问。每一个TLP都自带一个address(寻址类TLP),同时每一个endpoint,PCIe switch都自带一段BIOS配置的地址空间范围,一旦这个TLP的address落入某个设备的地址范围,那么这个TLP就属于这个设备并消费。

Summer的博客 5078

一种非常简单的Android屏幕适配方案

转载请作明出处: 前言 不知道大家有没有看过前一段时间今日头条技术团队发表的一篇关于Android屏幕适配的文章:一种极低成本的Android屏幕适配方式。没有看过的朋友可以先看看了解一下再回来,可以更好的理解。我是无意中点开的这篇文章,但是看过之后眼前一亮——-Android屏幕适配要是真的这么简单,那些辛辛苦苦没日没夜做适配的前辈们是不是死得太惨了。。。。。。。 测试与思考 不得不说今...

一种简单粗暴的Android屏幕适配方案 8700

QCustomPlot实战:从入门到精通的数据可视化

本文详细介绍了如何使用QCustomPlot进行数据可视化,从基础环境搭建到高级图表定制,涵盖实时监控、多坐标系联动等实战技巧。基于Qt的QCustomPlot库以其强大的绘图能力和灵活的API,帮助开发者快速实现专业级数据可视化效果。

weixin_29003437的博客 115

安卓屏幕适配方案小结

屏幕适配这东西话说我还真没怎么好好研究过,一直用的都是头条那个适配方案,最近有些时间,看了看一些文章,稍稍整理一下吧!不想写太多,大致把各方案从别人那搬运过来(有点像小偷),本文尽量就挑重点,搬运的出处都会写清楚的! 屏幕相关说明 常用单位 px: pixel,像素,电子屏幕上组成一幅图画或照片的最基本单元 pt: point,点,印刷行业常用单位,等于1/72英寸,1pt= (DPI / 72) px。 ppi: pixel per inch,每英寸像素数,该值越高,则屏幕越细腻 dpi: dot pe

silencefly的博客 458

【产品经理修炼之道】- 优惠券系统从入门到精通(二)

在电商平台中,优惠券的使用场景与频次都很高。那么如何做好一个优惠券系统呢?本文总结了相关流程和设计思路,希望对你有所帮助。上一篇与大家分享了架构中的前端应用、生命周期、优惠券管理中OpenAPI 、基础系统,今天继续与大家分享架构图中优惠券模板部分。

xiaoli8748的专栏 1292

社区版 ABAP MCP 能不能读取 SAP S/4HANA 公有云开发对象,我的判断是能试,但不能当成已被 SAP 背书的标准通道

文章摘要:当前存在多个社区项目(如mcp-abap-adt、mcp-abap-abap-adt-api等)通过包装ABAP ADT能力为MCP Server,使AI开发工具能读取ABAP对象。这些项目技术上依赖ADT HTTP API或SAP官方ADT language server,但针对SAP S/4HANA Cloud Public Edition的完整适配仍存在挑战。SAP官方已通过VS Code扩展提供ADT MCP能力,而社区方案在云环境下需遵循ABAP Cloud的严格限制,仅能访问已授权的开

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 89

android 主流的屏幕适配方案

1、宽高限定符适配 1.1 原理: 就是穷举市面上所有的Android手机的宽高像素值,设定一个基准的分辨率,其他分辨率都根据这个基准分辨率来计算,在不同的尺寸文件夹内部,根据该尺寸编写对应的dimens文件 1.2 缺点: 这个方案有一个致命的缺陷,那就是需要精准命中才能适配,比如1920x1080的手机就一定要找到1920x1080的限定符,否则就只能用统一的默认的dimens文件了。而使用默认的尺寸的话,UI就很可能变形,简单说,就是容错机制很差。 1.3 集成 1.3.1 dimens文件生成工具

zhang106209的博客 4220

Spring AI 项目实战(十):Spring Boot + AI + DeepSeek 构建智能合同分析技术实践(附完整源码)

摘要:基于Spring AI的智能合同审核系统开发 本文介绍了基于Spring Boot 3.2.0和Spring AI 1.0.0-M4构建的智能合同审核系统。系统采用分层架构设计,整合DeepSeek API实现文档解析、条款提取和风险分析功能。核心技术栈包括Spring AI、H2数据库、Apache POI/PDFBox等文档处理工具,实现了合同条款语义分析、异常识别和审核报告自动生成。项目解决了传统人工审核效率低、主观性强等问题,为合同管理提供了智能化解决方案。文章详细阐述了系统架构设计、技术选型

博客 654

安卓屏幕适配解决方案

安卓屏幕适配解决方案 国内安卓手机众多,由于安卓是开源的,不同厂商都可以定制属于自己的系统,定制这就导致了屏幕的不同意,给开发人员带来了很多困扰啊,屏幕适配就是很明显的一个问题。 我们先引入几个概念 dp px dpi density dp:dp=dip只是说法不同 px:像素 (这个就不用多说了) dpi:每英寸的像素点数。 density:每平方英寸像素点数。 这里给出他们之间的换算公式:...

weixin_41078100的博客 1406

ORB-SLAM3算法2之EuRoc开源数据集运行ORB-SLAM3生成轨迹并用evo工具评估轨迹

ORB-SLAM3算法1 已成功编译安装ORB-SLAM3到本地,本篇目的是用EuRoc开源数据来运行ORB-SLAM3,并生成轨迹,最后用evo评估工具来评估ORB-SLAM3生成的轨迹和真值轨迹。

重点记录机器人和自动驾驶相关领域的技术,尤其是计算机视觉,视觉SLAM等,不仅有前言文献或必备算法的学习,也会有实际应用的点滴经验 3762

大数据在电力行业的应用案例解析-【电力技术】(九)大数据在电力储能运维中的深度应用(含故障预测代码)

大数据技术为电力储能运维提供了“精准化、智能化、高效化”的解决方案,破解了传统运维的核心痛点,实现了储能系统从“被动抢修”到“主动运维”的转型,为新型电力系统建设提供了重要支撑。当前,随着储能产业的快速发展,大数据与储能运维的融合将更加深入,未来将结合人工智能、物联网、区块链等技术,实现储能运维的全流程智能化——从设备故障的提前预警,到寿命的精准预测,再到运维策略的自动优化、调度协同的实时响应,进一步提升储能系统的安全性、经济性与可靠性。

getusushu的博客 88

Android今日头条的屏幕适配方案

今日头条的屏幕适配方案是一种基于动态调整设备密度(density)的适配方法,其核心原理是通过修改系统默认的屏幕密度参数,使得不同分辨率和尺寸的设备能够按照设计图的尺寸比例显示界面元素。

zhukui66的专栏 1470

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Android屏幕适配最优方案

屏幕适配主要从图片和距离(文字)进行下手。从以往的方式适配方式中,开发者可能会考虑各种各样的分辨率,比如480*800、1280*800、1920*1080等,为此在资源文件夹里面创建了一大堆子文件夹,那么有什么更好的方式吗?首先我们看下我的android studio模拟其中一些流行的镜像的屏幕参数信息 上面举了两个例子,其实看了好几个发现大部分的屏幕虽然分辨率各种各样,但是dp...

深耕技术 1041

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

android屏幕适配density,Android屏幕适配方案分析

为什么要屏幕适配Android开发过程中我们常用的尺寸单位有px、dp,还有一种sp一般是用于字体的大小。但是由于px是像素单位,比如我们通常说的手机分辨例如1920*1080都是px的单位。现在Android屏幕分辨率碎片化720x1280、1080x1920、2280x1080,这就造成例如187px会在各个分辨率的机型上都是显示一样大小的,那肯定不是我们想要的效果,所以用px单位我们是难以达...

weixin_34916566的博客 1311

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

总结常用的Android屏幕适配方案

本文主要介绍了目前常用的四种屏幕适配方案:dp适配、宽高限定符适配、今日头条density适配以及sw限定符适配,文中概括了各种适配的思路和实现,并贴上了深入学习的参考链接,希望能帮助大家更好地进行屏幕适配的工作

--Joern的物联领域-- 1206

一文读懂 Android 主流屏幕适配方案

以上介绍的三种方案各有特点,这里来做个总结今日头条方案。优点:可以直接使用设计稿中的 dp 值,无需生成多套 dimens 文件进行映射,因此不会增大 apk 体积。此外,此方案的 UI 还原度在三种方案中应该是最高的了,其它两种方案都需要精准命中屏幕尺寸后才能达到此方案的还原度。缺点:由于此方案会影响到应用全局,因此如果我们引入了一些第三方库的话,三方库中的界面也会随之被影响到,可能会造成效果变形,此时就需要进行额外处理了宽高限定符方案。

金戈鐡馬 5006

android头条的状态栏_今日头条屏幕适配方案落地研究

声明|本文作者但,我知道,转载请联系作者 链接:http://t.cn/Ai9lKqyw来源:博客园目录前言各平板数据比较为什么看起来更小了?(头条方案跟最小宽度方案比较)smallesWidth 方案迁移优缺点issue附录(适配核心代码)前言现在给大家推荐一种极低版本的 Android 屏幕适配方案,就是今日头条适配方案,“极低成本”这四个字正是今日头条的适配文章标题。众所周知,安卓的屏幕碎片...

weixin_35037351的博客 277

Android 最稳定屏幕适配方案

转载注明出处:http://blog.youkuaiyun.com/wolfking0608/article/details/78828252 我想做安卓的朋友们,很多即便是做了好几年的安卓,对屏幕的各种适配,有时候也会弄的比较头痛!即便是采用了各种是配方法,但是有时候,感觉还是不是很满意! 经过和很多大神讨论,沟通和参考,我总结的这个屏幕适配方案,是目前公认最合理并且最简单的:  废话

MaFarmer的博客 462
上一篇: ArrayList.addAll(),clone(),数据深浅拷贝问题
下一篇: iOS 部署cocoPos简书
Code_Alone
博客等级 码龄9年 1粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值