支付宝UI篇-扫码和AR

这里的UI实现,主要考验遮罩蒙板的使用。

具体看代码实现:代码链接

#import "IRCameraMask.h"

@implementation IRCameraMask
{
    CALayer *_bgLayer;
    CALayer *_mainLayer;
    CALayer *_scanLayer;

    float _radius;

    CABasicAnimation *_moveAnimation;
    CALayer *_moveLayer;
}

- (instancetype)init
{
    return [self initWithFrame:[UIScreen mainScreen].bounds];
}

- (instancetype)initWithFrame:(CGRect)frame
{
    return [self initWithFrame:frame type:2];
}

- (instancetype)initWithFrame:(CGRect)frame type:(int)type;
{
    self = [super initWithFrame:frame];
    if (self)
    {
        _type = type;

        float edge    = 37;
        float radius2 = (self.bounds.size.width - 2 *edge);
        _radius = radius2/2.0;

        _bgLayer = [CALayer layer];
        [self.layer addSublayer:_bgLayer];

        float width = radius2+2;
        _scanLayer = [CALayer layer];
        _scanLayer.frame = CGRectMake(0, 0, width , width);
        [self.layer addSublayer:_scanLayer];

        CALayer *maskLayer = [CALayer layer];
        maskLayer.frame    = _scanLayer.bounds;
        _scanLayer.mask    = maskLayer;

        CALayer *moveLayer = [CALayer layer];
        moveLayer.frame    = _scanLayer.bounds;
        [_scanLayer addSublayer:moveLayer];

        CABasicAnimation *moveAnimation = [CABasicAnimation animationWithKeyPath:@"position.y"];
        moveAnimation.duration    = 1.75;
        moveAnimation.repeatCount = HUGE_VALF;
        [moveLayer addAnimation:moveAnimation forKey:@"AnimationMoveY"];

        _moveAnimation = moveAnimation;
        _moveLayer     = moveLayer;

        _mainLayer = [CALayer layer];
        [self.layer addSublayer:_mainLayer];

        _bgLayer.frame    = self.bounds;
        _mainLayer.frame  = self.bounds;

        [self changeType:_type];
    }
    return self;
}

- (void)changeType:(int)type
{
    _type = type;

    float offY      = 25;
    float fromValue = -_radius;
    float toValue   = _radius + offY;
    NSString *maskName = @"camera-loupe-mask";
    NSString *moveNmae = @"5";
    UIImage *mainImage = [UIImage imageNamed:@"camera-mask"];

    CGPoint scanCenter = CGPointMake(self.center.x,self.center.y - offY);

    CGRect rect = CGRectMake(scanCenter.x - _radius, scanCenter.y - _radius, _radius*2, _radius*2);

    _scanRect      = rect;
    _scanScaleRect = [self getScanCrop:rect readerViewBounds:self.bounds];

    if (_type == 1)
    {
        fromValue   = scanCenter.y - 3*_radius;
        toValue     = scanCenter.y - _radius;
        maskName    = @"scan-loupe-mask";
        moveNmae    = @"scan_net";
        mainImage   = [self getRectImageWithRect:rect];

        _mainLayer.mask = nil;
    } else
    {
        UIBezierPath *path = [UIBezierPath bezierPathWithRect:self.bounds];
        UIBezierPath *circlePath = [UIBezierPath bezierPathWithArcCenter:scanCenter
                                                                  radius:_radius
                                                              startAngle:0
                                                                endAngle:2 *M_PI
                                                               clockwise:NO];
        [path appendPath:circlePath];

        CAShapeLayer *shapeLayer = [CAShapeLayer layer];
        shapeLayer.path = path.CGPath;
        _mainLayer.mask = shapeLayer;
    }
    _moveLayer.contents      = (id)[UIImage imageNamed:moveNmae].CGImage;
    _scanLayer.mask.contents = (id)[UIImage imageNamed:maskName].CGImage;
    _scanLayer.center        = scanCenter;
    _moveAnimation.fromValue = [NSNumber numberWithFloat:fromValue];
    _moveAnimation.toValue   = [NSNumber numberWithFloat:toValue];
    _mainLayer.contents      = (id)mainImage.CGImage;

    [self stopAnimating];
    [self startAnimating];
}

- (void)startAnimating
{
    [_moveLayer addAnimation:_moveAnimation forKey:@"AnimationMoveY"];
}

- (void)stopAnimating
{
    [_moveLayer removeAnimationForKey:@"AnimationMoveY"];
}

- (void)setImage:(UIImage *)image
{
    _image = image;
    _bgLayer.contents = (id)image.CGImage;
}

- (UIImage *)getRectImageWithRect:(CGRect)rect
{
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, 1.0);
    CGContextRef con = UIGraphicsGetCurrentContext();

    CGContextSetFillColorWithColor(con, [UIColor colorWithWhite:0 alpha:0.45].CGColor);
    CGContextFillRect(con, self.bounds);

    CGRect rects[] =
    {
        rect,
    };
    CGContextAddRects(con, rects, sizeof(rects)/sizeof(CGRect));

    CGContextSetBlendMode(con, kCGBlendModeClear);
    CGContextFillPath(con);

    UIImage *ima = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return ima;
}

#pragma mark-> 获取扫描区域的比例关系

- (CGRect)getScanCrop:(CGRect)rect readerViewBounds:(CGRect)readerViewBounds
{
    CGFloat x,y,width,height;

    x = (CGRectGetHeight(readerViewBounds)-CGRectGetHeight(rect))/2/CGRectGetHeight(readerViewBounds);
    y = (CGRectGetWidth(readerViewBounds)-CGRectGetWidth(rect))/2/CGRectGetWidth(readerViewBounds);
    width  = CGRectGetHeight(rect)/CGRectGetHeight(readerViewBounds);
    height = CGRectGetWidth(rect)/CGRectGetWidth(readerViewBounds);

    return CGRectMake(x, y, width, height);
}

@end
时间: 2024-10-03 09:04:24

支付宝UI篇-扫码和AR的相关文章

支付宝支付开发——当面付条码支付和扫码支付

关键字:支付宝 当面付 条码支付 扫码支付 二维码支付 订单查询 退款作者:方倍工作室原文: http://www.cnblogs.com/txw1958/p/alipay-f2fpay.html    本文介绍支付宝中当面付下属的条码支付.扫码支付.订单查询.退款申请的集成开发过程.   本文分为以下五个部分: 条码支付和扫码支付介绍 申请应用 密钥生成及配置 API及SDK集成 条码支付.扫码支付.订单查询.退款申请   注: 支付宝支付开发有一定的门槛,如果您愿意为知识付费来节省您宝贵的时

支付宝支付开发——当面付条码支付和扫码支付实例_php实例

本文介绍支付宝中当面付下属的条码支付.扫码支付.订单查询.退款申请的集成开发过程.  本文分为以下五个部分: 条码支付和扫码支付介绍 申请应用 密钥生成及配置 API及SDK集成 条码支付.扫码支付.订单查询.退款申请  一.条码支付及二维码支付介绍 1. 条码支付 条码支付是支付宝给到线下传统行业的一种收款方式.商家使用扫码枪等条码识别设备扫描用户支付宝钱包上的条码/二维码,完成收款.用户仅需出示付款码,所有收款操作由商家端完成.其使用场景如下: 业务流程: 使用步骤: 用户登陆支付宝钱包,点

微信支付宝扫码支付聚合系统

一.简介 微信支付宝扫码支付聚合系统,聚合了微信支付和支付宝的所有扫码支付模式.并支持微信支付服务商子商户模式.支持五种扫码技术.   二.主要功能 1. 微信扫码支付:包括扫码支付模式一.扫码支付模式二.刷卡支付.其中扫码支付模式一.扫码支付模式二是用户扫商家,刷卡支付是商家扫用户.包含5大扫码支付. 2. 支付宝扫码支付:包括扫码支付和条码支付.其中扫码支付是用户扫商家,条码支付是商家扫用户 3. 支持微信服务商子商户模式:包括扫码支付模式二.刷卡支付.子商户没有扫码支付模式一. 4. 数据

C# MVC 微信支付教程系列之扫码支付代码实例_C#教程

今天,我们来一起探讨一下这个微信扫码支付.何为扫码支付呢?这里面,扫的码就是二维码了,就是我们经常扫一扫的那种二维码图片,例如,我们自己添加好友的时候,可以通过输入对方的微信号,也可以扫一扫对方的二维码.扫码支付,作为,微信支付里面,不可或缺的一个功能,对商品的支付提供了极为方便的体验,用途也非常的多. 例如我们在地铁.公交站常见的那些自动售货机(不错,就是那种投硬币,就可以自动出货的那种机器)中都用到.微信(支付宝)的扫码支付的出现,大大的减少了这方面的风险,近些年来,二维码的应用越来越广,甚

ASP.NET Core 2.0 支付宝当面付之扫码支付

原文:ASP.NET Core 2.0 支付宝当面付之扫码支付 前言 自从微软更换了CEO以后,微软的战略方向有了相当大的变化,不再是那么封闭,开源了许多东西,拥抱开源社区,.NET实现跨平台,收购xamarin并免费提供给开发者等等.我本人是很喜欢.net的,并希望.net core能够崛起.我是从.net core 1.1的时候开始使用的,到现在的.net core 2.0..net core 2.0比1.1有了一些改变,api也增加了很多,用着更顺手了,最近在做asp.net core 对

PHP 接入微信扫码支付总结(总结篇)_php实例

微信扫码支付分为两种模式, 模式一比较复杂,需要公众号配置回调地址. 模式二比较简单,只需要在代码中配置回调地址就可以了. 我这次使用的是模式二. 需要配置参数, const APPID = 'xxx'; const MCHID = 'xxx'; const KEY = 'xxx'; const APPSECRET = 'xxx'; 配置公众号的appid,appsecret.以及微信支付的mchid与key. 生成二维码,这个页面需要自己去美化,不像支付宝那样自带效果. require_onc

PHP 接入微信扫码支付总结(总结篇)

微信扫码支付分为两种模式, 模式一比较复杂,需要公众号配置回调地址. 模式二比较简单,只需要在代码中配置回调地址就可以了. 我这次使用的是模式二. 需要配置参数, const APPID = 'xxx'; const MCHID = 'xxx'; const KEY = 'xxx'; const APPSECRET = 'xxx'; 配置公众号的appid,appsecret.以及微信支付的mchid与key. 生成二维码,这个页面需要自己去美化,不像支付宝那样自带效果. require_onc

百度糯米团购怎么用支付宝扫码支付?

  1.抢购自己看中的百度糯米团. 2.在付款方式中选择支付宝. 3.点击支付后,收到支付宝专用二维码,特别加密安全有保障! 4.接下来使用手机支付宝钱包扫码功能扫描专属二维码并输入支付密码即可支付成功. 是不是非常方便呢!如果支付宝开通小额免支付密码服务连密码都不用输入哦,非常省事

支付宝二维码扫码支付使用技巧?

1)在手机中安装并且打开支付宝钱包,然后我们在如图所示所示位置点击支付宝后点击右上角的图标(用于扫描二维码.条形码.银行卡).   2)在这里我们会看到自己在淘宝或天猫商品后,进入支付宝收银台页面,选择付款方式为扫码支付 3)再后支付宝扫描工具对准二维码,听到手机"嘀"就会跳转到支付界面,输入支付密码,确定支付.   支付宝钱包支持智能手机系统包括有Apple.Android.Symbian.Windows Phone了从这里来看几乎所有的手机都可以使用支付宝来支付了哦.