Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> UI高級--觸摸與手勢

UI高級--觸摸與手勢

編輯:關於Android編程

1.觸摸事件的處理方式

 (1)事件類型
     觸摸事件(觸摸手機屏幕)
     運動事件(如微信的搖一搖)
     遠程控制事件(如藍牙)
(2)響應者類通過復寫以下方法,可以監聽觸摸事件
//當一個或多個手指觸碰屏幕時
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
// 當一個或多個手指在屏幕上移動時
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
// 當一個或多個手指離開屏幕時
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
//當觸摸序列被諸如電話呼入這樣的系統事件所取消時
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

(3)UITouch觸摸對象
當用戶觸摸視圖時,調用視圖如下方法:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
     UITouch *touch = [touches anyObject];
     NSInteger tapNumber = [touch tapCount];
   }

這裡寫圖片描述

當用戶觸摸屏幕時,事件會被封裝成一個event實例,
包含了觸摸事件相關的信息,event實例包含著若干個UITouch實例,一個touch表示一個手指.

UITouch類中的常用屬性:

window:觸摸時產生所處的窗口 view::觸摸產生時所在的視圖
tapCount:tapCount表示短時間內輕擊屏幕的次數.(可根據該屬性判斷單擊,雙擊或更多)
phase:觸摸事件在屏幕上的一個周期,即觸摸開始,觸摸點移動,觸摸結束,還有中途取消,
phase可以查看當前觸摸事件在一個周期中所處的狀態, phase的類是 UITouchPahse,其枚舉型包含:
UITouchPahseBegan(觸摸開始) UITouchPahseMoved(接觸點移動)
UITouchPahseStationary(接觸點無移動)
UITouchPahseEnded(觸摸結束)
<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjwvYmxvY2txdW90ZT4NCjxwPjxjb2RlPlVJVG91Y2jA4NbQtcSzo9PDt723qDo8L2NvZGU+PC9wPg0KPHByZSBjbGFzcz0="brush:java;"> //函數返回一個CGpoint類型的值,表示觸摸在view上的位置,返回的位置是針對view的坐標系 - (CGPoint)locationInView:(UIView *)view CGPointview view; //記錄了前一個坐標值 - (CGPoint)previousLocationInView:(UIView *)view CGPoint ;

2.事件傳遞的過程

 事件的傳遞:
     從事件發生到其處理的對象,傳遞要經過特殊的一
     段過程。當用戶點擊設備屏 幕時,iOS捕捉到一系
     列的觸摸,將其打包到UIEvent對象中並放置到應
     用程序 活動事件隊列中。UIApplication對象
     從事件隊列中取出最前面的事件並將其分 發。通
     常,其發送事件給應用程序的主窗口——UIWindow
     實例,再由窗口對 象發送事件給『第一響應者 
     (觸摸的視圖)』處理。

這裡寫圖片描述
這裡寫圖片描述

這裡寫圖片描述

3.響應者鏈的基本概念

     響應者對象是一個能接收並處理事件的對象。
     UIResponser是所有響應者對 象的基類。該基
     類定義了一系列編程接口,不但為事件處理進行服
     務而且還提 供了通用的響應行為處理。
     UIApplication, UIView(包括UIWindow), 
     UIViewController都直接或間接的繼承自
     UIResponser,所有的這些類的實例 都是響應者
     對象。

事件響應者鏈:

當用戶與視圖交互時,將會 消息傳遞給視圖控制器,如果 不存在控制器,傳遞給父視圖.

如果不處理該消息,則繼續 將消息向上傳遞

最上層的視圖如果也不處理, 將事件交予Window對象

最後交由UIApplication實例, 如果不處理,丟棄事件
這裡寫圖片描述

事件分發和響應過程如下圖:
這裡寫圖片描述

事件的攔截:
userInteractionEnable = NO;
hidden = YES;
alpha = 【0——0.01】范圍

4.手勢識別

UIGestureRecognizer:
    UIGestureRecognizer類,用於檢測、識別用戶
    使用設備時所用的手勢。它是一 個抽象類,定義了
    所有手勢的基本行為。以下是
    UIGestureRecognizer子類,用 於處理具體的用
    戶手勢行為:
UITapGestureRecognizer(輕擊) UIPinchGestureRecognizer(捏合) UIPanGestureRecognizer(平移) UISwipeGestureRecognizer(輕掃) UIRotationGestureRecognizer(旋轉) UILongPressGestureRecognizer(長按)
  //1 單擊
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapAction:)];
    [imageV addGestureRecognizer:tap];

    //2 雙擊
    UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(doubleTapAction:)];
    doubleTap.numberOfTapsRequired = 2;
    [imageV addGestureRecognizer:doubleTap];

    //雙擊失敗了才算單擊(雙擊成功就是雙擊)
    [tap requireGestureRecognizerToFail:doubleTap];


    //3 長按
    //allowableMovement:允許抖動的范圍
    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPressAction:)];
    [imageV addGestureRecognizer:longPress];


    //4 輕掃
    UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipeAction:)];

    //屬性:設置輕掃的方向(默認 右)
//    swipe.direction = UISwipeGestureRecognizerDirectionRight;
    [imageV addGestureRecognizer:swipe];

    //5 移動
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panAction:)];

    //輕掃和移動的沖突,一旦有沖突,默認移動
    //輕掃失敗算移動  (輕掃成功就是輕掃)
    [pan requireGestureRecognizerToFail:swipe];

    //6 旋轉
    UIRotationGestureRecognizer *rotation = [[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(rotationAction:)];
    [imageV addGestureRecognizer:rotation];

    //7 捏合
    UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(pinchAction:)];
    [imageV addGestureRecognizer:pinch];

以上方法的實現:

-(void)pinchAction:(UIPinchGestureRecognizer*)pinch{

    /*屬性
     scale:縮放的大小比例
     velocity:縮放的速度
     */
    if (pinch.state ==UIGestureRecognizerStateChanged) {
        NSLog(@"一直捏合");
        CGFloat pScale  =pinch.scale;
        pinch.view.transform = CGAffineTransformMakeScale(pScale, pScale);

    }else if (pinch.state == UIGestureRecognizerStateEnded){

        NSLog(@"捏合結束");
        [UIView animateWithDuration:0.2 animations:^{

                    pinch.view.transform =CGAffineTransformIdentity;
        }]; 
    }
}

-(void)rotationAction:(UIRotationGestureRecognizer*)rotation{

    /*
     rotation:旋轉的弧度 角度:0~360   弧度:0~2π
     velocity:旋轉的速度
     */
    if (rotation.state == UIGestureRecognizerStateChanged) {
        NSLog(@"一直旋轉");

        CGFloat angle = rotation.rotation;

        rotation.view.transform = CGAffineTransformMakeRotation(angle);



    }else if (rotation.state == UIGestureRecognizerStateEnded){

        NSLog(@"旋轉結束");
        [UIView animateWithDuration:0.2 animations:^{

                    rotation.view.transform = CGAffineTransformIdentity;
        }];



    }
}

-(void)panAction:(UIPanGestureRecognizer*)pan{

//    NSLog(@"移動...");
    //設置當前位置的坐標(相對 起始點 )
     CGPoint p1 =[pan translationInView:imageV];
    NSLog(@"p1 = %@",NSStringFromCGPoint(p1));

    //移動點的速度
//    CGPoint v1 = [pan velocityInView:imageV];
//    NSLog(@"v1 = %@",NSStringFromCGPoint(v1));

    //設置當前位置
//    CGPoint p2 = CGPointMake(100, 100);
//    [pan setTranslation:p2 inView:imageV];
}
-(void)swipeAction:(UISwipeGestureRecognizer*)swipe{

    NSLog(@"輕掃");
}

-(void)longPressAction:(UILongPressGestureRecognizer*)longPress
{
//    NSLog(@"長按");
    if (longPress.state == UIGestureRecognizerStateBegan) {

        NSLog(@"長按開始");
    }else if (longPress.state ==UIGestureRecognizerStateEnded){

        NSLog(@"長按結束");
    }

}

-(void)tapAction:(UITapGestureRecognizer*)tap{

    NSLog(@"單擊");

}
-(void)doubleTapAction:(UITapGestureRecognizer*)tap{

    NSLog(@"雙擊");
}
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved