android中如何使用一张图片适配不同尺寸的APP引导页

在我们平常开发的过程中在做引导页适配的时候,有时候会犯难,怎么样作图可以将各种不同尺寸分辨率的手机都适配好也就是不变形不拉伸,官方给的说法也只是做多套图去适配不同的分辨率,遇到全屏展示引导这种问题的时候就有些力不从心了。接下来我们就展示一下如何使用一张图来适配市面上的绝大部分手机:

这个办法是反编译微信得出的想法,微信的包里面只有一张1920*1080的图,我们观察了微信在不同尺寸手机上的展示效果,它肯定是没有变形的,根据这个思路,我们发现它在适配不同的手机对图片做了缩放裁剪等处理。


接下来我们就实现一下如何对图片进行适当的缩放及裁剪:

大伙也都看到了,我们选择了两台具有代表性的设备:一台分辨率是800*480,一台是1152*1920.这两台设备的高宽比是不一样的。

为了适配这两台代表性的设备,首先我们需要对图片进行等比缩放:

我们需要先行计算将要放大的图片的高度:

将要放大的图片的高度=原图的宽度*屏幕的高度/屏幕的宽度;

上面这个计算公式不用我说为什么吧,小学就学过的。至于原图放大会模糊的问题,一般屏幕的宽度最大也就是1080,只是魅族有些奇葩会是1152,如果担心这个问题的话,请美工给图的时候,直接按照1152的宽来就好了。


其次,我们为了良好的展示在节目上,面对于不同尺寸屏幕的手机,它们的高宽比是不一样的,所以我们的基本思想就是以宽度为基准,放大图片,然后以中心为准裁剪多余的部分(对于图片高度不足裁剪的手机,可能才疏学浅,还没见过)。

贴代码:

package com.sahadev.guide;import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Point;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.view.View;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.view.Window;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {requestWindowFeature(Window.FEATURE_NO_TITLE);super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);scaleImage(this, findViewById(R.id.rootView), R.drawable.guide);}public static void scaleImage(final Activity activity, final View view, int drawableResId) {// 获取屏幕的高宽Point outSize = new Point();activity.getWindow().getWindowManager().getDefaultDisplay().getSize(outSize);// 解析将要被处理的图片Bitmap resourceBitmap = BitmapFactory.decodeResource(activity.getResources(), drawableResId);if (resourceBitmap == null) {return;}// 开始对图片进行拉伸或者缩放// 使用图片的缩放比例计算将要放大的图片的高度int bitmapScaledHeight = Math.round(resourceBitmap.getHeight() * outSize.x * 1.0f / resourceBitmap.getWidth());// 以屏幕的宽度为基准,如果图片的宽度比屏幕宽,则等比缩小,如果窄,则放大final Bitmap scaledBitmap = Bitmap.createScaledBitmap(resourceBitmap, outSize.x, bitmapScaledHeight, false);view.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {@Overridepublic boolean onPreDraw() {//这里防止图像的重复创建,避免申请不必要的内存空间if (scaledBitmap.isRecycled())//必须返回truereturn true;// 当UI绘制完毕,我们对图片进行处理int viewHeight = view.getMeasuredHeight();// 计算将要裁剪的图片的顶部以及底部的偏移量int offset = (scaledBitmap.getHeight() - viewHeight) / 2;// 对图片以中心进行裁剪,裁剪出的图片就是非常适合做引导页的图片了Bitmap finallyBitmap = Bitmap.createBitmap(scaledBitmap, 0, offset, scaledBitmap.getWidth(),scaledBitmap.getHeight() - offset * 2);if (!finallyBitmap.equals(scaledBitmap)) {//如果返回的不是原图,则对原图进行回收scaledBitmap.recycle();System.gc();}// 设置图片显示view.setBackgroundDrawable(new BitmapDrawable(context.getResources(), finallyBitmap));return true;}});}
}

最后看实际运行效果:

 1. 2. 3. 

 4. 5.

1.MX4 1152*1920

2.SAMSUNG G7106 720*1280

3.HTC D316d 540*960

4.NUBIA X6 1920*1080

5.HUAWEI Y330-C00 480*800

怎么样,效果还不错吧,不过肉眼几乎看不出来它们是否变形,如果有疑问,可以使用PS对他们进行等比缩放,然后叠加测试效果。比例相同的分辨率显示效果是一致的,如果比例不同会有一部分偏差,所以在美工设计图片的时候,请不要在最顶部以及最底部设置特殊标志,以免被裁剪。


最后注意scaleImage()方法请不要被外部多次调用,否则该方法内会生成多个Bitmap对象,容易造成内存溢出。

PS:scaleImage()方法内部针对于绘制测量的多次调用做了处理,避免了重复绘制与重复测量造成的多次Bitmap对象创建,可以放心使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479605.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

还在用Tensorboard?机器学习实验管理平台大盘点

文 | SisyphusBJ源 | Pytorch Lightningwandb.aicomet.mlneptune.aiallegro trainsmlflowguild.aisacredtest-tubetensorboard相信很多同学看到上面这个列表的第一印象是懵的。我们先看下机器学习实验管理平台 到底是做神马滴:一句话概括就是:&#xff0…

论文浅尝 | 利用图 Transformer 实现基于知识图谱的文本生成

论文笔记整理:谭亦鸣,东南大学博士生,研究方向为跨语言知识图谱问答。来源:NAACL2019链接:https://arxiv.org/pdf/1904.02342.pdf本文关注如何从信息抽取结果(特别是知识图谱)出发,生…

LeetCode 230. 二叉搜索树中第K小的元素(中序遍历)

文章目录1. 题目信息2. 解题2.1 中序递归2.2 中序循环写法1. 题目信息 给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。 说明: 你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。 示例 1:输入: root …

Apache Doris在美团外卖数仓中的应用实践

序言 美团外卖数据仓库技术团队负责支撑日常业务运营及分析师的日常分析,由于外卖业务特点带来的数据生产成本较高和查询效率偏低的问题,他们通过引入Apache Doris引擎优化生产方案,实现了低成本生产与高效查询的平衡。并以此分析不同业务场景…

Feign 简介和使用

声明式服务消费Feign一、简介二、使用Feign实现服务消费者三、实现普通的服务提供者四、Feign服务调用测试五、Feign消费者测试负载均衡服务熔断一、简介 Feign是Netflix公司开发的一个声明式的REST调用客户端; Ribbon负载均衡、Hystrix服务熔断是我们Spring Cloud…

论文浅尝 | 面向自动问题生成的跨语言训练

论文笔记整理:谭亦鸣,东南大学博士生,研究方向为跨语言知识图谱问答。来源:ACL 2019链接:https://128.84.21.199/pdf/1906.02525.pdf动机现有问题生成方法需要大量的“文本-问题”有标注数据对作为训练数据集&#xff…

再见,Spark!Flink已成气候!

身为大数据工程师,你还在苦学Spark、Hadoop、Storm,却还没搞过Flink?醒醒吧!刚过去的2020双11,阿里在Flink实时计算技术的驱动下全程保持了“如丝般顺滑”,基于Flink的阿里巴巴实时计算平台简直强无敌。最恐…

Java线程池实现原理及其在美团业务中的实践

随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流。使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器。J.U.C提供的线程池:ThreadPoolExecutor类,帮助开发人员管理线程并方便地执行并行任务。了解并合理使…

Zuul 简介和使用

Zuul背景Zuul的作用Zuul API网关Zuul请求过滤Zuul路由规则Zuul异常处理背景 通过之前的学习,我们知道注册中心Eureka,可以讲服务注册到该注册中心,Ribbon和Feign可以实现服务负载均衡地调用,Hystrix可以实现服务熔断,…

技术动态 | 知识图谱上的实体链接

本文转载自公众号:知识工场 1、什么是实体链接实体链接(entity linking)就是将一段文本中的某些字符串映射到知识库中对应的实体上。比如对于文本“郑雯出任复旦大学新闻学院副院长”,就应当将字符串“郑雯”、“复旦大学…

卖萌屋学术站开放注册啦!寻募种子用户,超多特权放出!

文:夕小瑶消失一个多月的小夕又突然出现啦!要问小夕最近业余时间在做什么,那就是跟小伙伴们开发学术站啦~(等...等再肝一版,小夕就继续给大家写文章(。 ́︿ ̀。)众所周知,卖萌屋学术…

LeetCode 11. 盛最多水的容器(双指针)

文章目录1. 题目信息2. 解题1. 题目信息 给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。 在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。 找出其中的两条线,…

WSDM Cup 2020检索排序评测任务第一名经验总结

1.背景 第13届“国际网络搜索与数据挖掘会议”(WSDM 2020)于2月3日在美国休斯敦召开,该会议由SIGIR、SIGKDD、SIGMOD和SIGWEB四个专委会共同协调筹办,在互联网搜索、数据挖掘领域享有很高学术声誉。本届会议论文录用率仅约15%,并且WSDM历来注…

ltp︱基于ltp的无监督信息抽取模块

ltp︱基于ltp的无监督信息抽取模块:https://zhuanlan.zhihu.com/p/44890664 无监督信息抽取较多都是使用哈工大的ltp作为底层框架。那么基于ltp其实有了非常多的小伙伴进行了尝试,笔者私自将其归纳为:事件抽取(三元组…

Eureka 简介和使用

Eureka 服务注册与发现服务注册与发现Eureka与Zookeeper的比较ZooKeeper保证CPEureka保证APEureka是什么?Eureka原理SpringBoot、Spring Cloud 和 Eureka 版本选择Eureka单机搭建搭建Eureka服务端搭建Eureka客户端的服务提供者搭建Eureka客户端的服务消费者Eureka集…

论文浅尝 | XQA:一个跨语言开放域问答数据集

论文笔记整理:刘晓臻,东南大学计算机科学与工程学院本科生。Citation: Liu, J., Lin, Y., Liu, Z., & Sun, M. (2019,July). XQA: A Cross-lingual Open-domain Question Answering Dataset. InProceedings of the 57th Conference of the Associati…

深度CTR预估模型中的特征自动组合机制演化简史

文 | 杨旭东源 | 知乎众所周知,深度学习在计算机视觉、语音识别、自然语言处理等领域最先取得突破并成为主流方法。但是,深度学习为什么是在这些领域而不是其他领域最先成功呢?我想一个原因就是图像、语音、文本数据在空间和时间上具有一定的…

LeetCode 94. 二叉树的中序遍历(中序遍历)

文章目录1. 题目信息2. 解题2.1 递归2.2 循环,必须掌握1. 题目信息 给定一个二叉树,返回它的中序 遍历。 示例:输入: [1,null,2,3]1\2/3输出: [1,3,2]进阶: 递归算法很简单,你可以通过迭代算法完成吗? 来源:力扣&am…

想进美团不知道选哪个技术岗位?这里有一份通关秘籍!

春暖花开,美团春招已经启动,针对校招和社招开放了几千个职位,其中很大部分都是技术岗位。 随着互联网的高速发展,技术岗位在不断地细分,比如软件开发不仅分为前端和后端,前端会分为Web、iOS和Android三个方…

哈工大LTP本地安装及python调用

原文链接:https://blog.csdn.net/yangfengling1023/article/details/84559848 LTP即哈工大语言技术平台云,是基于云计算技术的中文自然语言处理服务平台 在线使用的网址:https://www.ltp-cloud.com/ github网址:https://github.c…