图片碎片化mask动画
动画 图片 碎片 Mask
2023-09-14 08:57:30 时间
// 图片2
self.tranformFadeViewTwo = [[TranformFadeView alloc] initWithFrame:self.view.bounds];
self.tranformFadeViewTwo.contentMode = UIViewContentModeScaleAspectFill;
self.tranformFadeViewTwo.verticalCount = 2;
self.tranformFadeViewTwo.horizontalCount = 12;
self.tranformFadeViewTwo.center = self.view.center;
[self.tranformFadeViewTwo buildMaskView];
self.tranformFadeViewTwo.fadeDuradtion = 1.f;
self.tranformFadeViewTwo.animationGapDuration = 0.1f;
[self.view addSubview:self.tranformFadeViewTwo];
[self.tranformFadeViewTwo fadeAnimated:YES];
// timer
self.timer = [[GCDTimer alloc] initInQueue:[GCDQueue mainQueue]];
[self.timer event:^{
if (self.type == TYPE_ONE) {
self.type = TYPE_TWO;
[self.view sendSubviewToBack:self.tranformFadeViewTwo];
self.tranformFadeViewTwo.image = [self currentImage];
[self.tranformFadeViewTwo showAnimated:NO];
[self.tranformFadeViewOne fadeAnimated:YES];
} else {
self.type = TYPE_ONE;
[self.view sendSubviewToBack:self.tranformFadeViewOne];
self.tranformFadeViewOne.image = [self currentImage];
[self.tranformFadeViewOne showAnimated:NO];
[self.tranformFadeViewTwo fadeAnimated:YES];
} timeIntervalWithSecs:6];
[self.timer start];
- (UIImage *)currentImage {
self.count = ++self.count % self.images.count;
return self.images[self.count];
@end
Android性能优化 | 大图做帧动画卡?优化帧动画之 SurfaceView滑动窗口式帧复用 继上篇用“SurfaceView逐帧解析&帧复用”优化了帧动画内存性能后,一个更复杂的问题浮出水面:帧动画时间性能。这一篇试着让每帧素材大小 1MB 的帧动画流畅播放的同时不让内存膨胀。
// // TranformFadeView.h // TransformationFadeView // Created by XianMingYou on 15/4/16. // Copyright (c) 2015年 XianMingYou. All rights reserved. #import UIKit/UIKit.h @interface TranformFadeView : UIView * Image显示方式 @property (nonatomic) UIViewContentMode contentMode; * 要显示的相片 @property (nonatomic, strong) UIImage *image; * 垂直方向方块的个数 @property (nonatomic) NSInteger verticalCount; * 水平的个数 @property (nonatomic) NSInteger horizontalCount; * 开始构造出作为mask用的view - (void)buildMaskView; * 渐变动画的时间 @property (nonatomic) NSTimeInterval fadeDuradtion; * 两个动画之间的时间间隔 @property (nonatomic) NSTimeInterval animationGapDuration; * 开始隐藏动画 * @param animated 是否执行动画 - (void)fadeAnimated:(BOOL)animated; * 开始显示动画 * @param animated 时候执行动画 - (void)showAnimated:(BOOL)animated; @end
// // TranformFadeView.m // TransformationFadeView // Created by XianMingYou on 15/4/16. // Copyright (c) 2015年 XianMingYou. All rights reserved. #import "TranformFadeView.h" #define STATR_TAG 0x19871220 @interface TranformFadeView () * 图片 @property (nonatomic, strong) UIImageView *imageView; * 所有的maskView @property (nonatomic, strong) UIView *allMaskView; * maskView的个数 @property (nonatomic) NSInteger maskViewCount; * 存储maskView的编号 @property (nonatomic, strong) NSMutableArray *countArray; @implementation TranformFadeView * 初始化并添加图片 * @param frame frame值 - (void)initImageViewWithFrame:(CGRect)frame { self.imageView = [[UIImageView alloc] initWithFrame:frame]; self.imageView.layer.masksToBounds = YES; [self addSubview:self.imageView]; - (instancetype)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { [self initImageViewWithFrame:self.bounds]; return self; - (void)buildMaskView { // 如果没有,就返回空 if (self.horizontalCount 1 || self.verticalCount 1) { return; // 承载所有的maskView self.allMaskView = [[UIView alloc] initWithFrame:self.bounds]; self.maskView = self.allMaskView; // 计算出每个view的尺寸 CGFloat height = self.frame.size.height; CGFloat width = self.frame.size.width; CGFloat maskViewHeight = self.verticalCount = 1 ? height : (height / self.verticalCount); CGFloat maskViewWidth = self.horizontalCount = 1 ? width : (width / self.horizontalCount); // 用以计数 int count = 0; // 先水平循环,再垂直循环 for (int horizontal = 0; horizontal self.horizontalCount; horizontal++) { for (int vertical = 0; vertical self.verticalCount; vertical++) { CGRect frame = CGRectMake(maskViewWidth * horizontal, maskViewHeight * vertical, maskViewWidth, maskViewHeight); UIView *maskView = [[UIView alloc] initWithFrame:frame]; maskView.frame = frame; maskView.tag = STATR_TAG + count; maskView.backgroundColor = [UIColor blackColor]; [self.allMaskView addSubview:maskView]; count++; self.maskViewCount = count; // 存储 self.countArray = [NSMutableArray array]; for (int i = 0; i self.maskViewCount; i++) { [self.countArray addObject:@(i)]; * 策略模式一 * @param inputNumber 输入 * @return 输出 - (NSInteger)strategyNormal:(NSInteger)inputNumber { NSNumber *number = self.countArray[inputNumber]; return number.integerValue; - (void)fadeAnimated:(BOOL)animated { if (animated == YES) { for (int i = 0; i self.maskViewCount; i++) { UIView *tmpView = [self maskViewWithTag:[self strategyNormal:i]]; [UIView animateWithDuration:(self.fadeDuradtion = 0.f ? 1.f : self.fadeDuradtion) delay:i * (self.animationGapDuration = 0.f ? 0.2f : self.animationGapDuration) options:UIViewAnimationOptionCurveLinear animations:^{ tmpView.alpha = 0.f; } completion:^(BOOL finished) { } else { for (int i = 0; i self.maskViewCount; i++) { UIView *tmpView = [self maskViewWithTag:i]; tmpView.alpha = 0.f; - (void)showAnimated:(BOOL)animated { if (animated == YES) { for (int i = 0; i self.maskViewCount; i++) { UIView *tmpView = [self maskViewWithTag:[self strategyNormal:i]]; [UIView animateWithDuration:(self.fadeDuradtion = 0.f ? 1.f : self.fadeDuradtion) delay:i * (self.animationGapDuration = 0.f ? 0.2f : self.animationGapDuration) options:UIViewAnimationOptionCurveLinear animations:^{ tmpView.alpha = 1.f; } completion:^(BOOL finished) { } else { for (int i = 0; i self.maskViewCount; i++) { UIView *tmpView = [self maskViewWithTag:i]; tmpView.alpha = 1.f; * 根据tag值获取maskView * @param tag maskView的tag值 * @return tag值对应的maskView - (UIView *)maskViewWithTag:(NSInteger)tag { return [self.maskView viewWithTag:tag + STATR_TAG]; #pragma mark - setter getter. @synthesize contentMode = _contentMode; - (void)setContentMode:(UIViewContentMode)contentMode { _contentMode = contentMode; self.imageView.contentMode = contentMode; - (UIViewContentMode)contentMode { return _contentMode; @synthesize image = _image; - (void)setImage:(UIImage *)image { _image = image; self.imageView.image = image; - (UIImage *)image { return _image; @end
细节
使用的时候动态切换图片就可以了,实际上只需要创建出2个view.
Android性能优化 | 大图做帧动画卡?优化帧动画之 SurfaceView滑动窗口式帧复用 继上篇用“SurfaceView逐帧解析&帧复用”优化了帧动画内存性能后,一个更复杂的问题浮出水面:帧动画时间性能。这一篇试着让每帧素材大小 1MB 的帧动画流畅播放的同时不让内存膨胀。
相关文章
- 按钮在执行frame动画的时候怎么响应触发事件?
- 根据UIScrollView的contentOffset值精确控制动画
- 变换CALayer锚点实现模拟时钟的动画
- 动画之属性动画
- 收藏提示动画效果
- Qt编写自定义控件33-图片切换动画
- 使用 Busy Dialog 动画阻止 SAP UI5 应用按钮短时间内快速被点击试读版
- 介绍一个好用的静态图片合成为 gif 动画的在线网站
- Atitit 视频编码与动画原理attilax总结
- 使用uniapp中自带的进度条组件加动画demo效果(整理)
- 前端进阶必学必会动画学习之Animate.css的使用与解析:一个强大而酷炫的CSS3动画库Animate.css使用方法教程
- Android 自定义倒计时圆环动画酷炫效果
- 高性能Web动画和渲染原理系列(4)“Compositor-Pipeline演讲PPT”学习摘要【华为云技术分享】
- 下拉刷新动画研究
- QT图片旋转动画
- uwp之图片旋转动画实现