iOS动画进阶 - 实现类似美颜相机的相机启动动画

Xamarin.Forms调用设备相机:MediaPicker权限配置与图片持久化避坑指南 移动开发中,调用相机拍摄或从相册选取图片是常见功能,但开发者常面临权限配置、临时文件处理、平台差异等挑战。本文将围绕Xamarin.Forms框架,介绍如何使用MediaPicker封装系统相机与相册能力,并深入解析Android与iOS双端的权限声明与运行时请求。同时,针对拍摄后临时文件易被系统回收、Android 13路径访问异常、EXIF方向旋转等高频问题,提供一套完整的图片持久化与适配方案,帮助开发者构建稳定可靠的跨平台图片采集功能。 阅读详情

如果移动端访问不佳,可以访问我的个人博客

最近在写一个相册的demo,偶尔看到了美拍的相机过载动画觉得很有意思,就想在我的相册demo中加入一个这种特效,下面把我的想法和实现过程给大家分享一下

先上效果图:(demo地址)

效果图

步骤分析

这个动效看起来很有特色但是实现起来是非常简单的,只需要用到CALayer和CAShapeLayer做为展示层,然后通过CABasicAnimation实现动画就行了~

  • 用两个CALayer来呈现启动的image
  • 通过UIBezierPath和CAShapeLayer来画出具有曲线的CAShapeLayer
  • 然后将曲线的CAShapeLayer做为CALayer的mask
  • 最后通过CABasicAnimation做一个简单的位移动画

先绘制上半部分的layer

/**
     绘制上半部分的layer
     */
    private func configTopShapeLayer() {
        //绘制贝斯尔曲线
        let topBezier:UIBezierPath = UIBezierPath()
        topBezier.moveToPoint(CGPointMake(-1, -1))
        topBezier.addLineToPoint(CGPointMake(bounds.width+1, -1))
        topBezier.addCurveToPoint(CGPointMake(bounds.width/2.0+1, bounds.height/2.0+1), controlPoint1: CGPointMake(bounds.width+1, 0+1), controlPoint2: CGPointMake(343.5+1, 242.5+1))
        topBezier.addCurveToPoint(CGPointMake(-1, bounds.height+2), controlPoint1: CGPointMake(31.5+2, 424.5+2), controlPoint2: CGPointMake(0+2, bounds.height+2))
        topBezier.addLineToPoint(CGPointMake(-1, -1))
        topBezier.closePath()
        //创建一个CAShapeLayer,将绘制的贝斯尔曲线的path给CAShapeLayer
        let topShape = CAShapeLayer()
        topShape.path = topBezier.CGPath
        //给topLayer设置contents为启动图
        topLayer.contents = launchImage?.CGImage
        topLayer.frame = bounds
        layer.addSublayer(topLayer)
        //将绘制后的CAShapeLayer做为topLayer的mask
        topLayer.mask = topShape
    }

绘制后的结果是这样的:

绘制后的结果

然后以同样的原理绘制下半部分的layer

/**
     绘制下半部分的layer
     */
    private func configBottomShapeLayer() {
        //绘制贝斯尔曲线
        let bottomBezier:UIBezierPath = UIBezierPath()
        bottomBezier.moveToPoint(CGPointMake(bounds.width, 0))
        bottomBezier.addCurveToPoint(CGPointMake(bounds.width/2.0, bounds.height/2.0), controlPoint1: CGPointMake(bounds.width, 0), controlPoint2: CGPointMake(343.5, 242.5))
        bottomBezier.addCurveToPoint(CGPointMake(0, bounds.height), controlPoint1: CGPointMake(31.5, 424.5), controlPoint2: CGPointMake(0, bounds.height))
        bottomBezier.addLineToPoint(CGPointMake(bounds.width, bounds.height))
        bottomBezier.addLineToPoint(CGPointMake(bounds.width, 0))
        bottomBezier.closePath()
        //创建一个CAShapeLayer,将绘制的贝斯尔曲线的path给CAShapeLayer
        let bottomShape = CAShapeLayer()
        bottomShape.path = bottomBezier.CGPath
        //给bottomLayer设置contents为启动图
        bottomLayer.contents = launchImage?.CGImage
        bottomLayer.frame = bounds
        layer.addSublayer(bottomLayer)
        //将绘制后的CAShapeLayer做为bottomLayer的mask
        bottomLayer.mask = bottomShape
    }

这里注意的是画的贝斯尔曲线上半部分的要整体向下平移1到2个像素,为了防止贝斯尔曲线画曲线导致的锯齿效果,下面是下半部分完成后的效果图:

这里写图片描述

最后给两个layer一个位移动画

/**
     展开的动画
     */
    func starAnimation() {
        //创建一个CABasicAnimation作用于CALayer的anchorPoint
        let topAnimation = CABasicAnimation.init(keyPath: "anchorPoint")
        //设置移动路径
        topAnimation.toValue = NSValue.init(CGPoint: CGPointMake(1, 1))
        //动画时间
        topAnimation.duration = 0.6
        //设置代理,方便完成动画后移除当前view
        topAnimation.delegate = self
        //设置动画速度为匀速
        topAnimation.timingFunction = CAMediaTimingFunction.init(name: kCAMediaTimingFunctionLinear)
        //设置动画结束后不移除点,保持移动后的位置
        topAnimation.removedOnCompletion = false
        topAnimation.fillMode = kCAFillModeForwards
        topLayer.addAnimation(topAnimation, forKey: "topAnimation")

        //创建一个CABasicAnimation作用于CALayer的anchorPoint
        let bottomAnimation = CABasicAnimation.init(keyPath: "anchorPoint")
        //设置移动路径
        bottomAnimation.toValue = NSValue.init(CGPoint: CGPointMake(0, 0))
        //动画时间
        bottomAnimation.duration = 0.6
        //设置动画速度为匀速
        bottomAnimation.timingFunction = CAMediaTimingFunction.init(name: kCAMediaTimingFunctionLinear)
        //设置动画结束后不移除点,保持移动后的位置
        bottomAnimation.removedOnCompletion = false
        bottomAnimation.fillMode = kCAFillModeForwards
        bottomLayer.addAnimation(bottomAnimation, forKey: "topAnimation")
    }

        /**
     动画完成后移除当前view
     */
    internal override func animationDidStop(anim: CAAnimation, finished flag: Bool)           
    {
        if flag {
            removeFromSuperview()
        }
    }

这里为了方便观察,我将动画时间变长了,下面是完成后的效果图:

这里写图片描述

到这里这个动效就完成的差不多了,希望大家能学到东西,如果大家有更好的实现办法也可以给我提意见,我学习学习,谢谢大家观看,另外附加demo地址,喜欢的可以关注一下

swift-美颜相机基于GPUImage 基于GPUImage实现的美颜相机,常见的功能: 滤镜选择, 聚焦,人脸追踪,闪光灯,延时拍照,前后摄像头切换, 历史浏览,裁剪均有实现 页面布局用的是masonry 立即下载

相关推荐

仿美图秀秀(美颜相机)马赛克功能Android源码

仿造美图秀秀功能,和美颜相机相似的涂鸦马赛克功能,有手指初冬的预览框效果

iOS开发之UI篇(6)—— 动画效果

UIView本身封装了一些常用的动画:基础动画、关键帧动画及转场动画。对于一般的iOS开发基本能满足,如果需要更多自定义的动画效果,那就使用核心动画CoreAnimation。

看影成痴 630

swift-基于GPUImage的人脸磨皮美白提亮的美颜滤镜

基于GPUImage的人脸磨皮、美白、提亮的美颜滤镜。GPUImageBeautifyFilter是一个自定义的美颜滤镜,可以用来处理实时视频流或者是静态图片

iOS 相机打开动画效果

- (void)addHollowOpenToView:(UIView *)view { //注释掉拍照的动画         CATransition *animation = [CATransition animation];         animation.duration = 0.5f;         animation.delegate = self;

了悟生死大事 1586

美颜相机、滤镜

美颜相机 、滤镜 、剪裁美颜相机 、滤镜 、剪裁美颜相机 、滤镜 、剪裁美颜相机 、滤镜 、剪裁美颜相机 、滤镜 、剪裁美颜相机 、滤镜 、剪裁美颜相机 、滤镜 、剪裁美颜相机 、滤镜 、剪裁美颜相机 、滤镜 、剪裁美颜相机 、滤镜 、剪裁美颜相机 、滤镜 、剪裁美颜相机 、滤镜 、剪裁

swift-MARFaceBeauty一款类似于FaceU的美颜相机

MARFaceBeauty一款类似于FaceU的美颜相机,支持大部分基础功能:美颜,对焦,前后摄像头转换,过场动画...

ios 动画(抖动,入场动画,组动画)

//1.图片抖动 //使用帧动画 设置旋转 路径 CAKeyframeAnimation *rotationAnii = [CAKeyframeAnimation animation]; rotationAni.keyPath=@"transform.rotation"; //计算好旋转的弧度 CGFloat angle=M_PI_*0.3; //设置旋转路径 rotationAni.valu

liwateryi的专栏 1458

基于Stigmergy的团队LLM wiki协作机制与FastAPI工程实践

大语言模型驱动的知识管理正在改变个人笔记与团队文档的维护方式,但当多人共同维护一个维基时,如何避免版本覆盖、上下文丢失和幻觉污染成为核心挑战。Stigmergy这一源自生物学的协作机制提供了新思路:通过共享环境中的痕迹(如评论、标记、修订历史)实现异步协作,无需实时沟通或中心协调者。本文将原理落地为可工程化的系统,设计Page、Revision、Trace三大实体,并结合向量索引与LLM审查流程,最终用FastAPI与SQLite搭建一个最小可运行原型。从白蚁筑巢到团队知识库,Stigmergy让每个参与者

weixin_34174322的博客 364

iOS-美颜相机 by GPUImage

之前网上有个段子说:日本女人靠化妆,韩国女人靠整容,中国女人靠美颜足以证明相机美颜功能在中国地位是多么高,关于美颜相机的 App 在中国是那么的火其实美颜相机的实现原理很简单,就是给采集到的图像通过添加滤镜进行渲染核心代码创建相机/** sessionPreset: swift 3.0 AVCaptureSessionPreset640x480 swift 4.0 AVCapt

Mazy's Blog 2366

CrossOver实战:在Mac上流畅运行《梦幻西游》端游与搬砖指南

在跨平台应用开发与系统兼容性领域,如何让为特定操作系统设计的软件在其他平台上运行,是一个经典的技术挑战。其核心原理在于通过兼容层或转译技术,将程序的系统调用和图形接口指令实时转换为目标系统能理解的格式。这项技术的价值在于极大地扩展了硬件设备的软件生态,让用户无需依赖虚拟机或双系统即可无缝使用关键应用。在游戏、专业工具等场景中,这能显著提升工作效率和用户体验。本文以经典端游《梦幻西游》为例,详细解析如何在搭载Apple Silicon或Intel芯片的Mac上,借助CrossOver这一成熟的兼容层方案,构建

weixin_30129025的博客 571

Java云上香云祭祀线上祭祀系统小程序源码

云上香云祭祀线上祭祀系统”,不仅是一种祭祀方式的创新,更是对传统文化的一次深情致敬。它让我们明白,无论时代如何变迁,对亲人的怀念与尊重永远不会改变。在这个特别的平台上,让我们共同守护那份跨越时空的爱与思念,让心灵得以安放,让生命之树常青。🌳。

2401_84413757的博客 804

iOS相机开发终极指南:AVFoundation自定义拍照与录像完全攻略

在iOS应用开发中,相机功能是许多应用的核心组件之一。无论你是要开发社交应用、电商平台还是工具类应用,掌握iOS相机开发技术都至关重要。TimLiu-iOS项目作为一个全面的iOS开发资源集合,为开发者提供了丰富的相机相关库和工具,帮助大家快速实现高质量的拍照和录像功能。 本文将为你详细介绍如何在iOS应用中利用AVFoundation框架实现自定义相机功能,并推荐TimLiu-iOS项目中优秀

gitblog_00589的博客 1107

微信取证不求人:最新免费DAT解码工具使用指南(含闪退解决方案)

本文提供了一份详细的微信DAT文件免费解码工具使用指南。针对用户常见的图片无法查看问题,手把手教学如何安全获取并操作开源图形化工具,将加密的DAT文件一键还原为JPG/PNG图片。文章重点剖析了DAT文件的加密原理,并给出了详细的步骤解决工具运行中最常见的“程序闪退”等疑难杂症,帮助普通用户轻松完成微信取证。

m0n1o2p的博客 479

【Android 美颜相机】第二天:Android-GPUImage Sample模块源码解析

本文解析了Android-GPUImage库的Sample模块架构,重点分析其核心功能实现。主要内容包括: 目录结构解析:详细说明了Sample模块的代码组织,包括核心Activity(MainActivity、GalleryActivity、CameraActivity)和工具类(CameraLoader、GPUImageFilterTools等)的职责划分。 MainActivity实现:剖析了启动页面的权限校验逻辑,包括相机和存储权限的动态申请流程,以及权限回调处理机制。 构建配置:分析了模块的Gra

u012739527的博客 1264

避坑指南:新手爬百度图片3个致命错,改完批量保存本地(亲测有效)

新手爬百度图片的核心是“绕开静态HTML,抓准API接口+处理反爬+提取原图”,改完本文提到的3个核心错,就能稳定批量保存高清图片。这套思路可复用在其他图片网站(如必应图片、360图片),只需修改API接口和参数即可。如果想进一步优化,可添加代理IP池、多线程下载(新手不建议,容易触发反爬)、图片去重等功能!

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1587

ArcMap|时空地理加权回归(GTWR)

ArcGIS的GTWR插件下载地址:https://www.researchgate.net/publication/329518786_GTWR_ADDIN_Valid_till_Dec_31_2022 更详细的操作参考: https://www.bilibili.com/video/BV1fR4y1M7xB?spm_id_from=333.999.0.0 https://blog.youkuaiyun.com/weixin_40008135/article/details/112693520 双击“GTWR_Be

个人学习笔记 1万+

Swift图像处理实战:播放Gif动画与图片滤镜效果实现

在iOS应用开发中,图像处理是提升用户体验的重要环节。GitHub加速计划中的swift2/Swift项目提供了丰富的Swift基础知识和实战案例,本文将介绍如何使用Swift实现Gif动画播放和图片滤镜效果,帮助开发者快速掌握这两项实用技能。 ## 一、轻松实现Gif动画播放功能 Gif动画在移动应用中广泛用于展示动态效果,Swift通过ImageIO框架提供了原生的Gif处理能力。项目中的

gitblog_00940的博客 340

光学测量仿真软件:Zygo_(5).Zygo的数据处理与分析方法

通过上述综合案例,我们可以看到Zygo中的数据处理与分析方法是如何一步一步应用于实际数据的。从数据导入到预处理,再到滤波、表面分析、缺陷检测和数据可视化,每一步都至关重要,最终确保了数据的准确性和可靠性。处理后的数据还可以导出为多种格式,便于在其他软件中进行进一步的处理或报告。希望这个案例能够帮助您更好地理解和应用Zygo中的数据处理与分析方法。

kkchenjj的博客 947

媒体捕捉-iOS中的人脸识别

配置会话:配置AVCaptureSession,添加AVCaptureDeviceInput,添加AVCaptureOutput启动会话:AVCaptureSession startRunning停止会话(如果需要)AVCaptureSession stopRunning。具体实现在这里就贴代码了,有需要可以查看这篇文章媒体捕捉-iOS自定义二维码扫描功能-优快云博客。以上就是使用AV Foundation进行人脸检测的所有关键步骤,已经实现了一个比较粗糙的人脸识别的用户界面。

weixin_39339407的博客 1596

【云原生】Docker可视化工具Portainer使用详解

Docker可视化工具Portainer使用详解

congge 1万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

GPUImage框架:iOS图像处理与实时滤镜开发指南

GPU加速是移动端图像处理的核心技术,通过OpenGL ES实现硬件级性能优化。GPUImage作为iOS平台知名开源框架,采用管道式设计实现滤镜链式处理,支持125+内置滤镜和自定义GLSL着色器开发。其核心价值在于实时处理能力,相比CPU方案可提升3-5倍性能,广泛应用于美颜相机、视频特效等场景。通过纹理管理和帧缓冲对象优化,开发者可构建高性能的实时滤镜处理流水线,典型应用包括Instagram风格滤镜、计算机视觉预处理等。

weixin_30924239的博客 318

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

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

Android Weekly #36 :把事情做好不是重点,如何找到正确的事才是关键

技术文章过去一周 Android 相关的技术文章精选,以及过去一周发现的经典文章沉思录| 开篇:Kotlin 的「丑与美」,以及「最佳实践」[1]:Kotlin 其实是一个非常宽泛的话题,除了语法特性层面的「丑」与「美」,其实还有许多能聊的东西,比如:编程范式、DSL 设计、数据结构与算法、设计模式,KMM、Compose Multiplatform。这些内容,我都会尝试...

Gracker的专栏 711

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

WINCC7.3破解文件

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

阿里云Queen智能美化特效SDK如何接入iOS

在Xcode项目的“Build Phases”设置中,添加SDK所需的依赖库,包括但不限于CoreMedia、AVFoundation、UIKit等。首先,您需要在阿里云官方网站注册并登录,然后在产品列表中找到Queen智能美化特效服务,按照指引完成订购并获取SDK包。将下载的iOS版SDK解压后,将其中的.a静态库文件和必要的资源文件(如.bundle文件)添加到您的Xcode项目中。以上就是大致的接入流程,具体细节请参考阿里云官方提供的Queen SDK iOS版开发者指南。

qq_51503664的博客 912

iOS GPUImage Plus 开源项目教程

iOS GPUImage Plus 开源项目教程 项目介绍 iOS GPUImage Plus 是一个基于 OpenGL ES 的高性能图像处理库,它继承了 GPUImage 的核心功能,并在此基础上进行了扩展和优化。该库支持多种图像滤镜和视频处理效果,适用于开发需要实时图像处理的 iOS 应用。 项目快速启动 环境配置 克隆项目: git clone https://github.com/w...

gitblog_01118的博客 697

从开发者的角度分析iOS应如何省电

说明 网上关于iPhone如何省电的文章很多.但是基本没有讲原理. 而在生活中,很多人在使用iPhone中有着明显的错误的省电习惯. 本文从iOS开发者的角度,对iOS的各项功能和技术进行说明,得出合理的省电技巧,以供大家参考. 如果你对省电原理没有兴趣,请直接到文章最后,查看如何省电的方法. 哪些功能(硬件)是耗电大户 网络下载 wifi和4G都是耗电大户,但是要知道手机上的网络模块并...

weixin_34080903的博客 340
上一篇: iOS开发小结 - UIView的坐标转换
下一篇: iOS开发小结 - AFNetworking的Post失败,关于requestSerializer的正确使用
W_C__L
W_C__L 领域专家: 移动开发技术领域 领域专家: 移动开发技术领域
博客等级 码龄14年 194粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值