[文章]

#HarmonyOS征文#—HarmonyOS滑动事件的三个动作

2021-7-29 16:53:11  766 鸿蒙OS 鸿蒙学习 鸿蒙系统 HarmonyOS HarmonyOS征文
分享
3
1. 滑动事件的三个动作
  • 接口名:TouchEventListener
  • 滑动事件里面分为三个动作:按下不松,移动,抬起。
PRIMARY_POINT_DOWN:按下不松。
POINT_MOVE:移动。
PRIMARY_POINT_UP:抬起。
  • 方法返回值:
true 表示继续执行后面的动作。
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.     <Text
  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. </DirectionalLayout>
  19. MainAbilitySlice

  20.     采用当前类作为实现类接口的方式编写

  21. package com.xdr630.listenerapplication.slice;

  22. import com.xdr630.listenerapplication.ResourceTable;
  23. import ohos.aafwk.ability.AbilitySlice;
  24. import ohos.aafwk.content.Intent;
  25. import ohos.agp.components.Component;
  26. import ohos.agp.components.DirectionalLayout;
  27. import ohos.agp.components.Text;
  28. import ohos.multimodalinput.event.TouchEvent;

  29. public class MainAbilitySlice extends AbilitySlice implements Component.TouchEventListener {

  30.     Text text1 = null;

  31.     @Override
  32.     public void onStart(Intent intent) {
  33.         super.onStart(intent);
  34.         super.setUIContent(ResourceTable.Layout_ability_main);

  35.         //1.先找到整个布局对象
  36.         DirectionalLayout dl = (DirectionalLayout) findComponentById(ResourceTable.Id_dl);
  37.         text1 = (Text) findComponentById(ResourceTable.Id_text1);

  38.         //2.给整个布局添加滑动事件
  39.         //当我们在整个布局滑动的时候,就会调用本类中的onTouchEvent方法
  40.         //在按下 移动、松开的过程,代码会不断去调用本类中的 onTouchEvent方法
  41.         dl.setTouchEventListener(this);
  42.     }

  43.     @Override
  44.     public void onActive() {
  45.         super.onActive();
  46.     }

  47.     @Override
  48.     public void onForeground(Intent intent) {
  49.         super.onForeground(intent);
  50.     }

  51.     @Override
  52.     public boolean onTouchEvent(Component component, TouchEvent touchEvent) {
  53.         //参数1:component表示滑动的组件(布局也是一种组件,所以也可以用component表示布局对象)
  54.         //实际上此时代表的就是DirectionalLayout布局对象,这个布局是铺满整个屏幕的
  55.         //参数2:touchEvent表示动作对象(按下、滑动、抬起)

  56.         //获取当前手指对屏幕进行操作(按下、滑动、抬起)
  57.         int action = touchEvent.getAction();
  58.         // 1:表示按下操作
  59.         // 2:表示松开操作
  60.         // 3. 表示滑动/移动操作

  61.         if (action == TouchEvent.PRIMARY_POINT_DOWN){
  62.             //只要写按下时需要运行的代码即可
  63.             text1.setText("按下");
  64.         }else if (action == TouchEvent.POINT_MOVE){
  65.             //移动或滑动
  66.             text1.setText("移动");
  67.         }else if (action == TouchEvent.PRIMARY_POINT_UP){
  68.             //松开或抬起
  69.             text1.setText("松开");
  70.         }
  71.         return true;
  72.     }
  73. }
复制代码
  • 运行:
  • 按下:
  • 移动:
  • 松开:

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方法。
  • 【本文正在参与“有奖征文 | HarmonyOS征文大赛”活动】
    https://bbs.elecfans.com/jishu_2098584_1_1.html

评论

您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发文章
快速回复
扫一扫分享
返回顶部 返回列表