在iOS上增加手势锁屏、解锁功能

在一些涉及个人隐私的场景下,尤其是当移动设备包含太多私密信息时,为用户的安全考虑是有必要的。

桌面版的QQ在很多年前就考虑到用户离开电脑后隐私泄露的危险,提供了“离开电脑自动锁定”或者“闲置锁定”等类似功能,具体我也忘了。

而在iPhone版的QQ上,也提供了手势锁的功能。如下图:



我在上一篇博文中简单提到如何根据手指移动画线条,而这里是进一步的版本,仍然只是粗糙原型:



具体的代码实现如下:

//
//  ViewController.m
//  GestureLock
//
//  Created by Jason Lee on 12-9-26.
//  Copyright (c) 2012年 Jason Lee. All rights reserved.
//

#import "ViewController.h"

#define LOCK_POINT_TAG      1000

@interface ViewController ()

@property (nonatomic, strong) UIImageView *imageView;

@property (nonatomic, assign) CGPoint lineStartPoint;
@property (nonatomic, assign) CGPoint lineEndPoint;

@property (nonatomic, strong) NSMutableArray *buttonArray;
@property (nonatomic, strong) NSMutableArray *selectedButtons;

@property (nonatomic, assign) BOOL drawFlag;

@property (nonatomic, strong) UIImage *pointImage;
@property (nonatomic, strong) UIImage *selectedImage;

@end

@implementation ViewController

- (void)dealloc
{
    [super dealloc];
    //
    [_imageView release];
    [_buttonArray release];
    [_selectedButtons release];
    [_pointImage release];
    [_selectedImage release];
}

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
    
    _imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
    [self.view addSubview:self.imageView];
    self.imageView.backgroundColor = [UIColor whiteColor];
    
    [self createLockPoints];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - Trace Touch Point

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    if (touch) {
        for (UIButton *btn in self.buttonArray) {
            CGPoint touchPoint = [touch locationInView:btn];
            if ([btn pointInside:touchPoint withEvent:nil]) {
                self.lineStartPoint = btn.center;
                self.drawFlag = YES;
                
                if (!self.selectedButtons) {
                    self.selectedButtons = [NSMutableArray arrayWithCapacity:9];
                }
                
                [self.selectedButtons addObject:btn];
                [btn setImage:self.selectedImage forState:UIControlStateNormal];
            }
        }
    }
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    if (touch && self.drawFlag) {
        self.lineEndPoint = [touch locationInView:self.imageView];
        
        for (UIButton *btn in self.buttonArray) {
            CGPoint touchPoint = [touch locationInView:btn];
            
            if ([btn pointInside:touchPoint withEvent:nil]) {
                BOOL btnContained = NO;
                
                for (UIButton *selectedBtn in self.selectedButtons) {
                    if (btn == selectedBtn) {
                        btnContained = YES;
                        break;
                    }
                }
                
                if (!btnContained) {
                    [self.selectedButtons addObject:btn];
                    [btn setImage:self.selectedImage forState:UIControlStateNormal];
                }
            }
        }
        
        self.imageView.image = [self drawUnlockLine];
    }
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self outputSelectedButtons];
    
    self.drawFlag = NO;
    self.imageView.image = nil;
    self.selectedButtons = nil;
}

#pragma mark - Create Lock Points

- (void)createLockPoints
{
    self.pointImage = [UIImage imageNamed:@"blue_circle"];
    self.selectedImage = [UIImage imageNamed:@"yellow_circle"];
    
    float marginTop = 100;
    float marginLeft = 45;
    
    float y;
    for (int i = 0; i < 3; ++i) {
        y = i * 100;
        float x;
        for (int j = 0; j < 3; ++j) {
            x = j * 100;
            UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
            [btn setImage:self.pointImage forState:UIControlStateNormal];
            [btn setImage:self.selectedImage forState:UIControlStateHighlighted];
            btn.frame = (CGRect){x+marginLeft, y+marginTop, self.pointImage.size};
            [self.imageView addSubview:btn];
            btn.userInteractionEnabled = NO;
            btn.tag = LOCK_POINT_TAG + i * 3 + j;
            
            if (!self.buttonArray) {
                self.buttonArray = [NSMutableArray arrayWithCapacity:9];
            }
            [self.buttonArray addObject:btn];
        }
    }
}

#pragma mark - Draw Line

- (UIImage *)drawUnlockLine
{
    UIImage *image = nil;
    
    UIColor *color = [UIColor yellowColor];
    CGFloat width = 5.0f;
    CGSize imageContextSize = self.imageView.frame.size;
    
    UIGraphicsBeginImageContext(imageContextSize);
    
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    CGContextSetLineWidth(context, width);
    CGContextSetStrokeColorWithColor(context, [color CGColor]);
    
    CGContextMoveToPoint(context, self.lineStartPoint.x, self.lineStartPoint.y);
    for (UIButton *selectedBtn in self.selectedButtons) {
        CGPoint btnCenter = selectedBtn.center;
        CGContextAddLineToPoint(context, btnCenter.x, btnCenter.y);
        CGContextMoveToPoint(context, btnCenter.x, btnCenter.y);
    }
    CGContextAddLineToPoint(context, self.lineEndPoint.x, self.lineEndPoint.y);
    
    CGContextStrokePath(context);
    
    image = UIGraphicsGetImageFromCurrentImageContext();
    
    UIGraphicsEndImageContext();
    
    return image;
}

#pragma mark - 

- (void)outputSelectedButtons
{
    for (UIButton *btn in self.selectedButtons) {
        [btn setImage:self.pointImage forState:UIControlStateNormal];
        NSLog(@"Selected-button's tag : %d\n", btn.tag);
    }
}

@end

Jason Lee @ Hangzhou

微博:@思禽饮霜

原文地址:http://blog.csdn.net/jasonblog/article/details/8024674


  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VB实现鼠标手势,根据移动鼠标的方向让程序作出某种反应。我的实现思路:   鼠标移动,如果把这些点都用直线连起来,就会形成一条轨迹线,鼠标手势就和现实生活中的打手势是一样的,   只要分析鼠标的轨迹符合某种规律就完成设定的某些操作。如何去分析一条轨迹线呢,一次鼠标移动的点是非常多的,而且精度也是相差深远,所以我实现的是比较简单的鼠标手势。   我的思路是这样的:鼠标的水平移动方向只有两种情况左和右,垂直方向也只有两种情况上和下,当鼠标的移动   幅度大于10个像素(水平x或垂直y坐标和旧的坐标点相减的绝对值大于或等于10),则捕获这个点,分析和上一次捕获的坐标点的相对位置,如果x坐标的差值小于0则水平方向是向左移动(其他方向一样),由于每次鼠标移动的轨迹都不会很精确,所以我设定的是如果差值小于3个像素点,则认为是0没有移动,我现在分析这两个点,如果水平方向是向左移动,则记录为L,向右则记录为R,如果没有移动则记录为0,垂直方向是一样的,如果向上则记录为U,向下则记录为D,没有移动则记录为0。现在我可以用一个长度为2的字符串记录下这个坐标点的情况了,例如:LU表示水平方向是向左移动,垂直方向是向上移动,0D表示水平方向没有移动,垂直方向向下移动,把这个字符串保存到数组或者集合中。当鼠标释放的时候,已经捕捉了非常多的坐标点,我是比较简单的鼠标手势,精度要求也不高,所以我从这所有坐标点中只取四个点作分析,怎么取这四个点呢?假设变量nPos为坐标点的个数除以四,表示平均的间隔个数,第一个点取第一个,第二个点取第nPos个,第三个取第nPos*2个,第四个点取最后一个。   现在是分析这四个坐标点的时候了,把这四个坐标点连成一个字符串。以下是可能出现的情况:   R0R0R0:R0表示水平方向向右移动,垂直方向没有移动,四个都是R0,表示轨迹向右;   0U0U0U:0U表示水平方向没有移动,垂直方向向上移动,四个都是0U,表示轨迹向上;   R*U*L*D:这个表示向右移动再向上移动,再向左移动,再向下移动,可以认为是逆时针画圈,当然精度不是很高   但是足够用了(如果你要求不是很高)。   至于其他点,可以用同样的思想去分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值