HarmonyOS实战—滑动事件的三个动作
创始人
2025-05-02 20:50:29
0

 [[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.  
  2.     ohos:id="$+id:dl" 
  3.     xmlns:ohos="http://schemas.huawei.com/res/ohos" 
  4.     ohos:height="match_parent" 
  5.     ohos:width="match_parent" 
  6.     ohos:alignment="center" 
  7.     ohos:orientation="vertical"> 
  8.  
  9.     
  10.         ohos:id="$+id:text1" 
  11.         ohos:height="match_content" 
  12.         ohos:width="match_content" 
  13.         ohos:background_element="$graphic:background_ability_main" 
  14.         ohos:layout_alignment="horizontal_center" 
  15.         ohos:text="$string:mainability_HelloWorld" 
  16.         ohos:text_size="40vp" 
  17.         /> 
  18.  
  19.  

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

 

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...