HarmonyOS实战—滑动事件的三个动作

系统 OpenHarmony
滑动事件里面分为三个动作:按下不松,移动,抬起。在按下 、移动、松开的过程,代码会不断去调用本类中的 onTouchEvent方法。

 [[415600]]

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

Table of Contents

1. 滑动事件的三个动作

2. 实现案例:按下、移动或松开都要修改文本的内容

3. 按下、滑动、松开 参数说明

4. 验证 按下、 移动、松开的过程,代码会不断去调用本类中的 onTouchEvent方法

1. 滑动事件的三个动作

  • 接口名:TouchEventListener
  • 滑动事件里面分为三个动作:按下不松,移动,抬起。
  1. PRIMARY_POINT_DOWN:按下不松。 
  2. POINT_MOVE:移动。 
  3. PRIMARY_POINT_UP:抬起。 
  • 方法返回值:
  1. true 表示继续执行后面的动作。 
  2. false 表示不会继续执行后面的动作。 
  • 涉及到如下三个动作,根据用户按下位置和松下位置,就可以辨别用户是上、下、左、或右滑动。

  • 如:可以辨别出用户是向右滑动(简称:右滑)

  • 如:可以辨别出用户是向下滑动(简称:下滑)

2. 实现案例:按下、移动或松开都要修改文本的内容

  • 因为要在整个屏幕上滑动,所以要给最外面的布局DirectionalLayout设置滑动事件,加个id
  • 按下、移动或抬起都要修改文本的内容
  • 新建项目:ListenerApplication4

代码实现

ability_main

  • 采用默认生成的Text文本内容,在此基础上给DirectionalLayout布局和Text组件分别加上id
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <DirectionalLayout 
  3.     ohos:id="$+id:dl" 
  4.     xmlns:ohos="http://schemas.huawei.com/res/ohos" 
  5.     ohos:height="match_parent" 
  6.     ohos:width="match_parent" 
  7.     ohos:alignment="center" 
  8.     ohos:orientation="vertical"
  9.  
  10.     <Text 
  11.         ohos:id="$+id:text1" 
  12.         ohos:height="match_content" 
  13.         ohos:width="match_content" 
  14.         ohos:background_element="$graphic:background_ability_main" 
  15.         ohos:layout_alignment="horizontal_center" 
  16.         ohos:text="$string:mainability_HelloWorld" 
  17.         ohos:text_size="40vp" 
  18.         /> 
  19.  
  20. </DirectionalLayout> 

MainAbilitySlice

  • 采用当前类作为实现类接口的方式编写
  1. package com.xdr630.listenerapplication.slice; 
  2.  
  3. import com.xdr630.listenerapplication.ResourceTable; 
  4. import ohos.aafwk.ability.AbilitySlice; 
  5. import ohos.aafwk.content.Intent; 
  6. import ohos.agp.components.Component; 
  7. import ohos.agp.components.DirectionalLayout; 
  8. import ohos.agp.components.Text; 
  9. import ohos.multimodalinput.event.TouchEvent; 
  10.  
  11. public class MainAbilitySlice extends AbilitySlice implements Component.TouchEventListener { 
  12.  
  13.     Text text1 = null
  14.  
  15.     @Override 
  16.     public void onStart(Intent intent) { 
  17.         super.onStart(intent); 
  18.         super.setUIContent(ResourceTable.Layout_ability_main); 
  19.  
  20.         //1.先找到整个布局对象 
  21.         DirectionalLayout dl = (DirectionalLayout) findComponentById(ResourceTable.Id_dl); 
  22.         text1 = (Text) findComponentById(ResourceTable.Id_text1); 
  23.  
  24.         //2.给整个布局添加滑动事件 
  25.         //当我们在整个布局滑动的时候,就会调用本类中的onTouchEvent方法 
  26.         //在按下 移动、松开的过程,代码会不断去调用本类中的 onTouchEvent方法 
  27.         dl.setTouchEventListener(this); 
  28.     } 
  29.  
  30.     @Override 
  31.     public void onActive() { 
  32.         super.onActive(); 
  33.     } 
  34.  
  35.     @Override 
  36.     public void onForeground(Intent intent) { 
  37.         super.onForeground(intent); 
  38.     } 
  39.  
  40.     @Override 
  41.     public boolean onTouchEvent(Component component, TouchEvent touchEvent) { 
  42.         //参数1:component表示滑动的组件(布局也是一种组件,所以也可以用component表示布局对象) 
  43.         //实际上此时代表的就是DirectionalLayout布局对象,这个布局是铺满整个屏幕的 
  44.         //参数2:touchEvent表示动作对象(按下、滑动、抬起) 
  45.  
  46.         //获取当前手指对屏幕进行操作(按下、滑动、抬起) 
  47.         int action = touchEvent.getAction(); 
  48.         // 1:表示按下操作 
  49.         // 2:表示松开操作 
  50.         // 3. 表示滑动/移动操作 
  51.  
  52.         if (action == TouchEvent.PRIMARY_POINT_DOWN){ 
  53.             //只要写按下时需要运行的代码即可 
  54.             text1.setText("按下"); 
  55.         }else if (action == TouchEvent.POINT_MOVE){ 
  56.             //移动或滑动 
  57.             text1.setText("移动"); 
  58.         }else if (action == TouchEvent.PRIMARY_POINT_UP){ 
  59.             //松开或抬起 
  60.             text1.setText("松开"); 
  61.         } 
  62.         return true
  63.     } 
  • 运行:

  • 按下:

  • 移动:

  • 松开:

3. 按下、滑动、松开 参数说明

可以看到1、2、3数字分别表示PRIMARY_POINT_DOWN(按下)、PRIMARY_POINT_UP(松开)、POINT_MOVE(移动),所以上面代码的参数也可以直接用数字代替,但为了更直观表达,建议使用参数,一目了然。

如:使用数字表示

  1. if (action == 1){ 
  2.         //只要写按下时需要运行的代码即可 
  3.         text1.setText("按下"); 
  4.     }else if (action == 3){ 
  5.         //移动或滑动 
  6.         text1.setText("移动"); 
  7.     }else if (action == 2){ 
  8.         //松开或抬起 
  9.         text1.setText("松开"); 
  10.     } 

4. 验证 按下、 移动、松开的过程,代码会不断去调用本类中的 onTouchEvent方法

  • 在上述代码的基础上,定义成员变量计数器 int count = 0

  • onTouchEvent方法被调用一次,就给加上一次

  • 把count放在每次操作的后面

  • 当按下时,是第一次调用,count应该为1 

  • 移动的时候随着鼠标不断移动,也就会不断地调用onTouchEvent方法,count就会递增

  • 当松开后,也会调用一次,count在前面数值的基础上加1

所以,经过验证:

在 按下 、移动、松开的过程,代码会不断去调用本类中的 onTouchEvent方法。

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

 

责任编辑:jianghua 来源: 鸿蒙社区
相关推荐

2010-08-04 14:02:08

Flex事件机制

2013-08-01 10:16:06

Linux

2021-08-06 14:35:26

鸿蒙HarmonyOS应用

2023-04-26 11:14:11

IT领导者远程工作

2022-04-28 16:54:13

事件响应网络安全安全工具

2020-06-11 09:00:27

SDN网络架构网络

2022-06-22 08:50:53

ERP系统CTO

2022-02-21 14:14:03

SSH加密密钥

2018-02-25 07:23:23

2010-09-02 16:46:52

SOAP协议

2011-12-20 10:41:36

程序员

2023-06-14 20:58:05

2017-09-30 06:45:25

2013-12-13 13:23:29

马云阿里巴巴

2022-05-16 08:43:33

CIOIT咨询

2023-12-21 16:25:23

WeChatSnapchatShopee

2010-06-28 11:08:32

BitTorrent协

2022-09-25 23:37:48

比特币数字货币加密货币

2021-08-11 08:47:31

SASE网络安全零信任

2010-11-15 10:50:43

Oracle启动模式
点赞
收藏

51CTO技术栈公众号