如何实现折起来的效果

news2025/1/10 17:10:53

如何实现范围裁剪和旋转效果。

日常

我还是希望自己的博客能够存在一些温度,而不是冷冰冰的技术分享,我希望留下专属于我自己的个性,就像鸿洋和郭霖的公众号一样。他们会在自己的博客顶端随便写一下最近的新闻什么的,而我不同,虽然我也对时政比较感兴趣,我还是更加倾向于随便写点什么,比如说自己的爱好,动漫什么的。

前言

请添加图片描述

具体实现结果就是上述的效果,那么我们应该如何实现上述的效果?一如既往,大象装冰箱,分三步怎么进行操作?分而治之即可。

  1. 获取图片

  2. 绘制上半部分

  3. 绘制下半部分

正文

获取图片

图片的获取其实之前已经提到过好多次了,这里就不赘述了。

在继续说后续的操作之前我们需要明确一些细节。首先,我们需要让自己的图片居中于整个视图的中心,这个时候就需要明确一点,我们并不能无脑的从视图的顶端进行绘制,而是需要根据视图中心的位置和图片的高度来动态的计算出开始绘制视图的起始位置,因为在我们的案例中,图片的高度并不确定。

//存储裁剪的范围
private val rect: Rect = Rect()
override fun onDraw(canvas: Canvas) {
    super.onDraw(canvas)
	//获取头像图片
    val bitmap = R.drawable.avatar.getBitmap(context, width / 2)
    canvas.save()
    //根据图片的获取结果来动态地设置裁剪范围
    rect.apply {
        left = 0
		//裁剪的顶部位置是:视图的正中央的高度-图片高度/2
        top = height / 2 - bitmap.height / 2
        //因为我们这里的用例比较简单,所以可以粗略地直接根据width进行裁剪
        right = width
		//裁剪的底部位置是:视图的正中央高度+图片高度/2
        bottom = height / 2 + bitmap.height / 2
    }
绘制图片上半部分区域

前面我们已经提到了,我们获取到了图片上半部分的区域位置,现在,我们根据上半部分的区域位置来对绘制位置进行裁剪,然后进行上半部分的视图的绘制操作。

canvas.save()
rect.apply {
    left = -width / 2
    top = -height / 2
    right = width / 2
    bottom = 0
}
canvas.clipRect(rect)
canvas.translate(-width / 2f, -height / 2f)
canvas.drawBitmap(bitmap, width / 4f, height / 2f - bitmap.height / 2, paint)
canvas.restore()
绘制图片下半部分区域

前面,我们已经完成了上半部分的图片区域的绘制,现在我们将进行图片下半部分区域的绘制。
之前我们已经提到过,图片下半部分区域的绘制是在图片上半部分区域的基础上添加一层画布的平移和旋转效果。
这里我们就需要重新设置裁剪区域。

同理,我们首先依然是需要根据视图中心的位置和图片高度来完成对于图片下半部分的裁剪区域的设置。

然后我们这里就需要定义一个Camera类,这个类的作用的模拟画布的旋转效果,设置一个相机点来作为“光源”,来将旋转后的画布上的图像投影到x0y平面上。这里需要注意的是,canvas.translate()移动的是画布,而不是画布里面的图片;并且图片的绘制并不是是基于x0y坐标轴来绘制的,而是基于画布的坐标轴来进行绘制的。好,说明这些后,我们继续我们的后续操作。我们的Camera存在默认的坐标轴(0,0,-8),Camera的投影方向默认为z轴正方向。

这样一来,因为我们图片的中心并不是(0,0,0),投影就并不会符合我们的意愿。

这个时候就需要在应用camera的旋转效果之前,先对画布进行移动,使图片的中心刚好位于坐标轴远点,然后进行camera的应用,进行画布的翻转,然后在实际绘制图片之前,将画布移动回原来的位置,一切就完成了。如下:

canvas.save()
rect.apply {
    left = -width / 2
    top = 0
    right = width / 2
    bottom = height / 2
}
canvas.translate(width / 2f, height / 2f)
camera.applyToCanvas(canvas)
canvas.clipRect(rect)
canvas.translate(-width / 2f, -height / 2f)
canvas.drawBitmap(bitmap, width / 4f, height / 2f - bitmap.height / 2, paint)
canvas.restore()

itmap(bitmap, width / 4f, height / 2f - bitmap.height / 2, paint)
canvas.restore()


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

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

相关文章

msvcr110.dll丢失的解决方法哪种好,推荐这个4种解决方法

Msvcr110.dll是Microsoft Visual Studio 2012的运行时组件之一。这个DLL文件包含一些用于Windows操作系统的C函数库。当程序需要这些函数时,它们会被加载到内存中,以便程序可以使用它们。 当计算机提示“msvcr110.dll丢失”时,可能出现以下影…

基于matlab使用接收机工作特征 (ROC) 曲线评估相干和非相干系统性能

一、前言 此示例说明如何使用接收机工作特征 (ROC) 曲线评估相干和非相干系统的性能。该示例假设检测器在加性复杂高斯白噪声环境中工作。 ROC曲线通常用于评估雷达或声纳探测器的性能。ROC 曲线是给定信噪比 (SNR) 的检测概率 &a…

介绍CSDN的阅览器

大家好!今天给大家一款由csdn官方打造的一个界面阅览器 意思就是靠我们自带的阅览器改变他的外观方式,这就是我用了CSDN阅览器之后的效果图 然后我们也可以清晰看到我们整个界面,对于我们经常写csdn博客的小伙伴来说是很方便,因为…

配电室动环监控系统的功能与应用

来源:山东仁科www.rkckth.com 六月天的 【配电室】,表面 “ 风平浪静 ”,实则 “ 多面夹击 ”。 步入六月份的夏季由高温掌控,为营造舒适凉爽的生活环境,人们的用电量也进入“汛期”,急速上涨&#xff0c…

亚信前端面试真题

目录 1.如何设置一个元素不可见? 2.谷歌浏览器设置比12px还小的字体? 3.深拷贝实现方法???????? 4.防抖节流实现原理???? 5.遍历循环数组方法????? 6.vue的双向绑定????? 7.compute和watche…

【MySQL高级篇笔记-InnoDB数据存储结构 (中) 】

此笔记为尚硅谷MySQL高级篇部分内容 目录 一、数据库的存储结构:页 1、磁盘与内存交互基本单位:页 2、页结构概述 3、页的大小 4、页的上层结构 二、页的内部结构 1、分三个部分看 2、从数据页角度看B 树如何查询 三、InnoDB行格式(或记录格式) 四、区、段与碎片区…

测试环境一键发布

背景 目前公司项目发布测试环境不够自动化,每次需要手动打包并且手动更新,影响开发效率 流程图 而且因为是本地手动发布,容易失误造成一些不必要的麻烦: 远端代码有更新,忘记拉取代码 快速发布,本地代码…

Redis7实战加面试题-高阶篇(Redis为什么快?高性能设计之epoll和IO多路复用深度解析)

多路复用要解决的问题 并发多客户端连接,在多路复用之前最简单和典型的方案:同步阻塞网络IO模型 这种模式的特点就是用一个进程来处理一个网络连接(一个用户请求),比如一段典型的示例代码如下。 直接调用 recv 函数从一个 socket 上读取数据…

Nginx:Nginx优化与防盗链

Nginx:Nginx优化与防盗链 一、配置Nginx隐藏版本号二、修改Nginx用户与组三、配置Nginx网页缓存时间3.1 修改配置文件3.2 页面缓存验证 四、配置Nginx实现连接超时五、更改Nginx运行进程数六 、配置Nginx实现网页压缩功能七、配置Nginx实现防盗链 一、配置Nginx隐藏…

[数据集][目标检测]目标检测数据集蜜蜂4073张1类别VOC格式

出品方:未来自主研究中心(FIRC) 数据集格式:Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件,仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数):7398 标注数量(xml文件个数):7398 标注类别数&#xff…

如何利用宝塔面板快速搭建Wordpress网站?

本章教程,主要介绍一下,如何利用宝塔面板快速搭建Wordpress网站。 目录 一、 前置条件 二、 打开宝塔面板 三、解析域名 四、安装界面 五、主题安装 六、网站预览 一、 前置条件 需要准备一台Linux服务器,系统版本使用centos 7.X。 使用…

这两个PPT素材网站很多大佬都在用

01 OfficePLUS是一款基于Microsoft Office的专业辅助工具,能够为用户提供更加高效、便捷的办公体验。该工具针对多个版本的Office软件进行优化和定制,提供了丰富的功能和实用的设计资源,如PPT模板、Word模板、Excel模板等。 OfficePLUS的主…

除了ChatGPT,还有哪些好用的AI工具?(建议收藏)

目前市面上的AI工具非常多,本文对他们进行了汇总整理,大家可以按需下载或者使用哦~ 一、AI对话聊天工具 1、New Bing(AI对话搜索) https://cn.bing.com 有点像ChatGPT版的必应,可以帮你搜索问题、回答问题、写文案、写…

简单分析jsjiami.v6加密逻辑

代码案例: var _0xodRjsjiami.com.v6,_0xodR_function(){return[‮_0xodR],_0x4311[_0xodR,TMOw51jPALDkw,w6LDqcOhw7PCqQ,I8OkP0zDs8KF,fyjCv8OB,CMOdEk5b,OnthccOZHXXDoA,UnDCrcKvw61VAsKNw7TCoRN8wpkhFVzCgA40woV6wrTCtMOXbXo,CMOiwohCXsKhw4PDq8KKw5MbPMOnWVjC…

基于LayUI+Servlet的权限管理系统的设计

权限管理是所有后台系统的都会涉及的一个重要组成部分,主要目的是对不同的人访问资源进行权限的控制,避免因权限控制缺失或操作不当引发的风险问题,如操作错误,隐私数据泄露等问题。本系统基于JSPServletJDBCLayUI的技术&#xff…

Java并发体系-第三阶段-JUC并发包-[2]-CompleableFuture,SynchronousQueue

Phaser工具(有时间就了解一下,下面还有队列) 简介 java7中引入了一种新的可重复使用的同步屏障,称为移相器Phaser。Phaser拥有与CyclicBarrier和CountDownLatch类似的功能. 但是这个类提供了更加灵活的应用。CountDownLatch和CyclicBarrier都是只适用于固定数量的…

(5)NUC980先来点个灯如何设置开启自启动

嵌入式Linux开机启动过程: 可以分为以下几个步骤: CPU复位:开机时,CPU会执行复位操作,将内存的内容清空,寄存器的初始值复位。 ROM启动:CPU会从ROM中读取启动程序,将其加载到内存中…

【阅读笔记】时间序列之TPA-LSTM(含Pytorch代码实现)

本文作为自己阅读论文后的总结和思考,不涉及论文翻译和模型解读,适合大家阅读完论文后交流想法,关于论文翻译可以查看参考文献。论文地址:https://arxiv.org/abs/1809.04206 TPA-LSTM 一. 全文总结二. 研究方法三. 结论四. 创新点…

C++ 学习 ::【基础篇:13】:C++ 类的基本成员函数:类类型成员的初始化与构造函数问题

本系列 C 相关文章 仅为笔者学习笔记记录,用自己的理解记录学习!C 学习系列将分为三个阶段:基础篇、STL 篇、高阶数据结构与算法篇,相关重点内容如下: 基础篇:类与对象(涉及C的三大特性等&#…

科技云报道:数字化时代,企业终端安全防护该“上新”了!

科技云报道原创。 随着云计算、大数据、物联网等创新技术的加速落地,企业原有的网络边界被打破,各种终端设备如:笔记本电脑、台式机、平板电脑、智能手机、物联网终端等成为了新的安全边界。 在此背景下,想确保企业高效办公的灵活…