首先,在CGPointUtils中定义一些方法。
头文件:
#import <CoreGraphics/CoreGraphics.h>
#define degreesToRadian(x) (M_PI * x / 180.0)
#define radiansToDegrees(x) (180.0 * x / M_PI)
#define HWX(x) (int)(x - screen.size.height / 2)
#define HWY(x) (int)(screen.size.width - x)
CGFloat distanceBetweenPoints(CGPoint first, CGPoint second);
CGFloat angleBetweenPoints(CGPoint first, CGPoint second);
CGFloat angleBetweenLines(CGPoint line1Start, CGPoint line1End, CGPoint line2Start, CGPoint lin2End);
实现文件:
#include "CGPointUtils.h"
#include <math.h>
CGFloat distanceBetweenPoints(CGPoint first, CGPoint second) {
CGFloat deltaX = second.x - first.x;
CGFloat deltaY = second.y - first.y;
return sqrt(deltaX * deltaX + deltaY * deltaY);
}
CGFloat angleBetweenPoints(CGPoint first, CGPoint second) {
CGFloat height = second.y - first.y;
CGFloat width = first.x - second.x;
CGFloat rads = atan(height / width);
return radiansToDegrees(rads);
}
CGFloat angleBetweenLines(CGPoint line1Start, CGPoint line1End, CGPoint line2Start, CGPoint line2End) {
CGFloat a = line1End.x - line1Start.x;
CGFloat b = line1End.y - line1Start.y;
CGFloat c = line2End.x - line2Start.x;
CGFloat d = line2End.y - line2Start.y;
CGFloat rads = acos(((a * c) + (b * d)) / ((sqrt(a * a + b * b)) * (sqrt(c * c + d * d))));
return radiansToDegrees(rads);
}
然后,看一下具体的示例。
头文件:
#import <UIKit/UIKit.h>
#import "CGPointUtils.h"
@interface CheckPleaseViewController : UIViewController {
IBOutlet UILabel *label;
CGPoint lastPreviousPoint;
CGPoint lastCurrentPoint;
CGFloat lineLengthSoFar;
}
@property (nonatomic, retain) IBOutlet UILabel *label;
- (void)eraseLabel;
@end
实现文件:
#define kMinimumCheckMarkAngle 50
#define kMaximumCheckMarkAngle 135
#define kMinimumCheckMarkLength 10
#import "CheckPleaseViewController.h"
@implementation CheckPleaseViewController
@synthesize label;
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
CGPoint point = [touch locationInView:self.view];
lastPreviousPoint = point;
lastCurrentPoint = point;
lineLengthSoFar = 0.0f;
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
CGPoint previousPoint = [touch previousLocationInView:self.view];
CGPoint currentPoint = [touch locationInView:self.view];
CGFloat angle = angleBetweenLines(lastPreviousPoint, lastCurrentPoint, previousPoint, currentPoint);
if((angle >= kMinimumCheckMarkAngle) && (angle <= kMaximumCheckMarkAngle) && (lineLengthSoFar > kMinimumCheckMarkLength)){
label.text = @"Checkmark";
[self performSelector : @selector(eraseLabel) withObject:nil afterDelay:1.6f];
}
lineLengthSoFar += distanceBetweenPoints(previousPoint, currentPoint);
lastPreviousPoint = previousPoint;
lastCurrentPoint = currentPoint;
}
- (void)eraseLabel {
label.text = @"";
}
- (void)dealloc {
[label release];
[super dealloc];
}
@end
分享到:
相关推荐
本篇将深入探讨自定义手势(gesture)和手势识别,特别是如何利用`GestureOverlayView`来实现这一功能。 **1. 自定义手势(Gesture)** 自定义手势是指开发者根据应用需求定义的一系列连续的触摸动作,例如绘制特定...
在安卓(Android)平台上,用户自定义手势识别是一项高级功能,允许用户通过特定的手势来触发应用程序或系统级别的操作,从而提升操作效率和个性化体验。本文将深入探讨这一技术,包括其工作原理、实现方式以及如何...
本示例主要关注如何在Android应用中实现手势解锁功能,包括基础的手势解锁逻辑以及自定义手势识别。 一、手势解锁基本原理 手势解锁的核心在于识别用户在触屏上绘制的连续点序列。系统记录用户设定的手势路径(一...
在给定的标题“seekbar自定义手势滑动星星图片变色”中,我们可以理解为开发者想要实现一个特殊的SeekBar,当用户通过手势滑动时,SeekBar上的星星图片颜色会随之变化。这样的功能可以增加应用的交互性和用户体验。 ...
自定义手势识别允许开发者根据特定需求设计和实现用户交互的新方式,使应用更加直观和友好。本文将深入探讨Android中的手势识别,尤其是如何自定义手势。 首先,理解Android的手势基础。Android系统提供了...
本项目"iOS自定义手势demo"聚焦于自定义手势识别器的实现,提供了四种特殊的手势:向右箭头(>)、向左箭头(<)、逆时针圆圈(o)以及双指向下(||)。接下来,我们将详细探讨这四种手势的实现原理及相关的iOS手势...
在Android游戏开发中,自定义手势是一种增强用户体验和交互性的关键技术。本文主要探讨的是输入法手势技术,这是一种允许用户通过特定的手势操作来触发游戏内特定事件的方法。例如,用户可以画个圆来切换背景,或者...
4. **添加自定义手势**:将自定义手势添加到你的视图控制器视图上,确保其识别范围覆盖整个屏幕,以实现全屏返回效果。 ```swift view.addGestureRecognizer(customGesture) ``` 5. **处理手势冲突**:由于现在有...
本项目“QGestureRecognizer.zip”聚焦于自定义手势识别,帮助开发者拓展用户界面的控制手段,使得应用程序更加人性化和高效。 首先,`QGestureRecognizer`是Qt提供的一种机制,它允许我们创建自定义的手势识别器,...
本资源“ios-自定义手势密码.zip”显然包含了实现这一功能的相关代码和资源,其中核心文件为“PNCLockView”。下面将详细介绍如何在iOS应用中实现自定义手势密码,以及涉及到的关键技术点。 首先,手势密码通常基于...
在这个主题中,"具有自定义手势的ViewControllers提供更好的用户体验",我们将深入探讨如何通过自定义手势增强UIViewController的功能,以及如何在Objective-C中实现这一目标。Ruby语言虽然在此项目中没有直接提及,...
【安卓自定义手势解锁应用】 在安卓操作系统中,手势解锁是一种流行且个性化的解锁方式,它为用户提供了方便快捷的解锁体验。本文将深入探讨如何使用Java编程语言在Android平台上开发一个自定义手势解锁应用。 一...
在Android开发中,自定义手势视图是一种提升用户体验的有效方式,它可以允许用户通过特定的手势进行操作,如解锁屏幕、启动应用或者执行特定功能。在这个名为"自定义手势视图_Java_下载.zip"的压缩包中,我们很可能...
在Android系统中,自定义手势密码是一种常见的用户身份验证方式,它允许用户通过在屏幕上绘制特定的图案来解锁设备或应用程序,提供了一种既便捷又个性化的安全保护。"LockPatternV"标签可能指的是实现这一功能的一...
自定义手势则允许你创建自己的手势识别器,通过重写其方法来识别特定的手势序列或动作。 总的来说,手势识别是iOS开发中的一个重要组成部分,它使应用更直观、更易用。正确理解和使用这些手势,可以极大地提升用户...
三、自定义手势行为 为了让视图随手指移动,我们需要在`handlePanGesture`方法中处理手势的识别状态。`UIPanGestureRecognizer`提供了多个状态,包括`.began`, `.changed`, `.ended`, `.cancelled`等。在`.changed`...
在Android开发中,自定义手势解锁视图是一种常见的功能,用于增强用户体验并提供安全的解锁方式。本示例是基于Java实现的自定义手势解锁视图项目,名为"GestureUnlock-master",它可以帮助开发者理解如何在Android...
本项目"ios-自定义手势解锁.zip"显然是一个利用Quartz2D库实现的手势解锁解决方案。Quartz2D是Apple提供的核心图形库,用于在iOS和Mac OS X平台上进行2D图形绘制。下面我们将深入探讨如何利用Quartz2D实现手势解锁...
在Android开发中,手势解锁是一种...以上就是关于自定义手势解锁View的详细知识讲解,涵盖了从基本原理到实现细节,再到用户体验和性能优化等多个方面。通过这些内容,开发者可以更好地理解和构建自己的手势解锁功能。