HarmonyOS实战—滑动事件的坐标和返回值

简介: HarmonyOS实战—滑动事件的坐标和返回值

1. 滑动事件获取手指位置

  • 滑动事件的三个动作:

在这里插入图片描述

  • 获取手指的位置就涉及到坐标的概念,通过获取到 x、y、z就可以缺任意一个点的位置

在这里插入图片描述

  • 手机中的坐标:

在这里插入图片描述

  • 除了 x、y轴,还有z轴,在鸿蒙手机当中,完整的坐标如下,是一个立体的三维体系,但平时z轴用的非常少,一般情况只需考虑x、y轴就行了。

在这里插入图片描述

  • 结合滑动事件的三个动作坐标来分析滑动

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2. 获取按下时手指的位置(坐标)

  • 获取的这些数据其实都被鸿蒙操作系统封装到TouchEvent这个动作对象当中,通过动作去调用getPointerPosition 方法,需要传递一个值。鸿蒙系统支持多手指的操作,比如:可以用两个手指对图片进行放大或缩小,所以在getPointerPosition需要传递一个索引,一个手指操作传递的值为0,表示要获取的是第一个手指的位置,他的位置也是封装成一个对象,再用坐标对象分别获取到x、y坐标。
    //获取按下时手指的位置(坐标)
    MmiPoint point = touchEvent.getPointerPosition(0);
    //x、y表示按下时手指的位置
    float x = point.getX();
    float y = point.getY();
    text1.setText(x + "---" + y);

3. 实现案例:把按下、移动、松开的位置分别设置到文本框当中

  • 新建项目:ListenerApplication4

ability_main

  • 采用默认生成的Text文本内容,在此基础上给DirectionalLayout布局和Text组件分别加上id
<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
    ohos:id="$+id:dl"
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:height="match_parent"
    ohos:width="match_parent"
    ohos:alignment="center"
    ohos:orientation="vertical">

    <Text
        ohos:id="$+id:text1"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:background_element="$graphic:background_ability_main"
        ohos:layout_alignment="horizontal_center"
        ohos:text="$string:mainability_HelloWorld"
        ohos:text_size="40vp"
        />

</DirectionalLayout>

MainAbilitySlice

  • 采用当前类作为实现类接口的方式编写
package com.xdr630.listenerapplication.slice;

import com.xdr630.listenerapplication.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.components.Component;
import ohos.agp.components.DirectionalLayout;
import ohos.agp.components.Text;
import ohos.multimodalinput.event.TouchEvent;

public class MainAbilitySlice extends AbilitySlice implements Component.TouchEventListener {

    Text text1 = null;

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

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

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

    @Override
    public void onActive() {
        super.onActive();
    }

    @Override
    public void onForeground(Intent intent) {
        super.onForeground(intent);
    }

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

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

        if (action == TouchEvent.PRIMARY_POINT_DOWN){
            //只要写按下时需要运行的代码即可
            //获取按下时手指的位置(坐标)
            MmiPoint point = touchEvent.getPointerPosition(0);
            //x、y表示按下时手指的位置
            float x = point.getX();
            float y = point.getY();
            text1.setText(x + "---" + y);
        }else if (action == TouchEvent.POINT_MOVE){
            //移动或滑动
            //获取按下时手指的位置(坐标)
            MmiPoint point = touchEvent.getPointerPosition(0);
            //x、y表示按下时手指的位置
            float x = point.getX();
            float y = point.getY();
            text1.setText(x + "---" + y);
        }else if (action == TouchEvent.PRIMARY_POINT_UP){
            //松开或抬起
           //获取按下时手指的位置(坐标)
            MmiPoint point = touchEvent.getPointerPosition(0);
            //x、y表示按下时手指的位置
            float x = point.getX();
            float y = point.getY();
            text1.setText(x + "---" + y);
        }
        return true;
    }
}
  • 运行:

在这里插入图片描述

  • 按下并且移动鼠标时,坐标数值就会随着鼠标的移动而变化

在这里插入图片描述

4. 根据手指的位置来确定是上、下、左、右哪个滑动

  • 首先把按下时的 x、y 移动onTouchEvent方法外面去,因为如果没有移动外面去,当第一次按下的时候就会调用onTouchEvent方法,接着就会调用按下时的位置,获取到x、y坐标并设置到文本框里,设置完以后整个方法就么有了,获取完后就从内存中消失了,按下时的x、y的值也就消失了。
  • 所以在方法外定义x、y,因为获取到的是小数,要定义为float类型

在这里插入图片描述

  • 移动的位置就不需要获取了,只要按下和松开的位置进行对比就可以判断是上、下、左、右的哪个滑动了
  • 右滑

在这里插入图片描述

  • 下滑

在这里插入图片描述

  • 把上述代码进行如下修改
  • onTouchEvent方法外定义x、y的位置

在这里插入图片描述

    //记录按下手指的位置
    float startX = 0;
    float startY = 0;
  • onTouchEvent方法里的if判断作出如下修改
    if (action == TouchEvent.PRIMARY_POINT_DOWN){
        MmiPoint point = touchEvent.getPointerPosition(0);
        //x、y表示按下时手指的位置
        startX = point.getX();
        startY = point.getY();
    }else if (action == TouchEvent.POINT_MOVE){
        //移动的位置就不需要获取了,只要按下和松开的位置进行对比就可以判断是上、下、左、右的哪个滑动了
    }else if (action == TouchEvent.PRIMARY_POINT_UP){
        //松开或抬起
        MmiPoint point = touchEvent.getPointerPosition(0);
        //x、y表示按下时手指的位置
        float endX = point.getX();
        float endY = point.getY();
        //拿着按下时的位置跟松开时手指的位置进行比对
        if (endX > startX){
            text1.setText("右滑");
        }else if (endX < startX){
            text1.setText("左滑");
        }else if (endY > startY){
            text1.setText("下滑");
        }else if (endY < startY) {
            text1.setText("上滑");
        }
  • 运行:

在这里插入图片描述

  • 按下后鼠标从左往右移动,然后松开

在这里插入图片描述

  • 按下后鼠标从右往左移动,然后松开

在这里插入图片描述

  • 按下后鼠标从上往下移动,然后松开

在这里插入图片描述

  • 按下后鼠标从下往上移动,然后松开

在这里插入图片描述

  • 此时还有一个明显的bug,那就是当鼠标从最最左边上面的点到最右边下面的点,既有下滑也有右滑

5. 滑动事件bug处理

  • 当我们滑动的时候,滑的不直,滑的有点斜
  • 斜着滑,可以对Y变化的范围(斜的幅度)做一个规定,假设变化为100,如果你滑的时候变化了超过了100,那就认为这是一个无效的滑动,如果没有超过,才认为这是一个有效的滑动

在这里插入图片描述

  • 解决bug:

添加个绝对值,防止两者大小相减出现复数

    if (endX > startX && Math.abs(endY - startY) < 100){
        text1.setText("右滑");
    }else if (endX < startX && Math.abs(endY - startY) < 100){
        text1.setText("左滑");
    }else if (endY > startY && Math.abs(endX - startX) < 100){
        text1.setText("下滑");
    }else if (endY < startY && Math.abs(endX - startX) < 100) {
        text1.setText("上滑");
    }
  • 运行,当斜的幅度超过100时,就会认为这是个无效的滑动,就不会显示这个滑动的动作
  • 但运行斜的幅度不超过100,就会显示正确的滑动效果

在这里插入图片描述

6. onTouchEvent方法的返回值

  • 如果为true,表示所有的动作都会触发当前方法并执行对应的代码
  • 如果为false,表示只有一个动作会触发当前方法并执行对应的代码,后续的动作就不会触发当前方法
  • 滑动事件的三个动作:按下——>移动——>松开,当为true时,这三个动作都会执行onTouchEvent方法并执行下面对应的代码。为false时,只有按下这个动作会触发 onTouchEvent方法并执行下面对应的代码

7. 验证onTouchEvent方法的返回值对滑动事件三个动作的影响

  • 上述代码不变,onTouchEvent方法改动如下:
public boolean onTouchEvent(Component component, TouchEvent touchEvent) {

        count++;

        int action = touchEvent.getAction();
        
        if (action == TouchEvent.PRIMARY_POINT_DOWN){
            text1.setText("按下");
        }else if (action == TouchEvent.POINT_MOVE){
            text1.setText("移动");
        }else if (action == TouchEvent.PRIMARY_POINT_UP){
            text1.setText("松开");
        }
        //如果为true,表示所有的动作都会触发当前方法并执行对应的代码
        //如果为false,表示只有一个动作会触发当前方法并执行对应的代码,后续的动作就不会触发当前方法了
        return false;
    }
  • 运行后,当按下后再移动、松开。显示的文本依赖不变,说明返回值为false,只有按下这个动作会触发 onTouchEvent方法并执行下面对应的代码,移动、松开都不会执行onTouchEvent方法。

在这里插入图片描述

  • 把上面的返回值改为true,运行后。发现文本显示的值都会随着按下、移动、松开的动作进行变化

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 所以滑动事件一般都写true
目录
相关文章
|
16天前
|
存储 调度 数据安全/隐私保护
鸿蒙Flutter实战:13-鸿蒙应用打包上架流程
鸿蒙应用打包上架流程包括创建应用、打包签名和上传应用。首先,在AppGallery Connect中创建项目、APP ID和元服务。接着,使用Deveco进行手动签名,生成.p12和.csr文件,并在AppGallery Connect中上传CSR文件获取证书。最后,配置签名并打包生成.app文件,上传至应用市场。常见问题包括检查签名配置文件是否正确。参考资料:[应用/服务签名](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-signing-V5)。
45 3
鸿蒙Flutter实战:13-鸿蒙应用打包上架流程
|
16天前
|
开发工具 芯片 开发者
鸿蒙Flutter实战:12-使用模拟器开发调试
本文介绍了如何在 M 系列芯片的 Mac 电脑上使用模拟器进行鸿蒙 Flutter 开发和调试。主要内容包括:创建 Flutter 项目、签名、创建模拟器、运行 Flutter 项目以及常见问题的解决方法。适用于希望在鸿蒙系统上开发 Flutter 应用的开发者。
35 2
鸿蒙Flutter实战:12-使用模拟器开发调试
|
13天前
|
监控 UED 开发者
鸿蒙next版开发:订阅应用事件(ArkTS)
在HarmonyOS 5.0中,ArkTS引入了强大的应用事件订阅机制,允许开发者订阅和处理系统或应用级别的事件,这对于监控应用行为、优化用户体验和进行性能分析至关重要。本文详细介绍了如何在ArkTS中订阅应用事件,并提供了示例代码,包括导入模块、创建观察者、设置事件参数等步骤。通过这些方法,开发者可以更智能地管理和响应应用事件。
66 11
|
12天前
|
监控 开发者 UED
鸿蒙5.0版开发:订阅卡死事件(ArkTS)
在HarmonyOS 5.0中,开发者可以通过ArkTS订阅应用的卡死事件,以便在应用卡死时进行处理。本文详细介绍如何在ArkTS中订阅卡死事件,并提供示例代码。通过导入hiAppEvent和hilog模块,设置自定义参数,添加事件观察者,开发者可以监控应用稳定性并在问题发生时快速定位原因。示例代码展示了如何创建按钮订阅卡死事件,并在事件发生时通过回调函数处理和记录日志。
38 5
|
12天前
|
监控 开发者 UED
鸿蒙5.0版开发:订阅资源泄漏事件(ArkTS)
在HarmonyOS 5.0中,资源泄漏是常见问题,尤其在多线程和复杂应用逻辑下。ArkTS提供了hiAppEvent模块来订阅和处理资源泄漏事件,帮助开发者监控和优化应用性能。本文详细介绍了如何在ArkTS中订阅资源泄漏事件,并提供了示例代码。通过导入hiAppEvent和hilog模块,添加事件观察者并实现回调函数,可以在资源泄漏事件发生时进行自定义处理,如记录日志、发送通知或执行资源清理操作。
46 4
|
21天前
|
UED
<大厂实战经验> Flutter&鸿蒙next 中使用 initState 和 mounted 处理异步请求的详细解析
在 Flutter 开发中,处理异步请求是常见需求。本文详细介绍了如何在 `initState` 中触发异步请求,并使用 `mounted` 属性确保在适当时机更新 UI。通过示例代码,展示了如何安全地进行异步操作和处理异常,避免在组件卸载后更新 UI 的问题。希望本文能帮助你更好地理解和应用 Flutter 中的异步处理。
62 3
|
21天前
|
JavaScript API 开发工具
<大厂实战场景> ~ Flutter&鸿蒙next 解析后端返回的 HTML 数据详解
本文介绍了如何在 Flutter 中解析后端返回的 HTML 数据。首先解释了 HTML 解析的概念,然后详细介绍了使用 `http` 和 `html` 库的步骤,包括添加依赖、获取 HTML 数据、解析 HTML 内容和在 Flutter UI 中显示解析结果。通过具体的代码示例,展示了如何从 URL 获取 HTML 并提取特定信息,如链接列表。希望本文能帮助你在 Flutter 应用中更好地处理 HTML 数据。
102 1
|
20天前
|
移动开发 资源调度 IDE
鸿蒙Taro实战:01-搭建开发环境
本文介绍了如何使用 Taro 4.x 框架搭建鸿蒙应用开发环境。主要内容包括:下载并配置 DevEco IDE,创建鸿蒙项目,安装 Taro 4.x,初始化 Taro 项目,配置鸿蒙插件和编译配置,修改 `package.json`,运行 Taro 和鸿蒙项目。通过本文,读者可以快速上手鸿蒙应用开发。
|
21天前
|
JSON Dart 数据格式
<大厂实战场景> ~ flutter&鸿蒙next处理后端返回来的数据的转义问题
在 Flutter 应用开发中,处理后端返回的数据是常见任务,尤其涉及转义字符时。本文详细探讨了如何使用 Dart 的 `dart:convert` 库解析包含转义字符的 JSON 数据,并提供了示例代码和常见问题的解决方案,帮助开发者有效处理数据转义问题。
116 0
|
7天前
|
Android开发
鸿蒙开发:自定义一个简单的标题栏
本身就是一个很简单的标题栏组件,没有什么过多的技术含量,有一点需要注意,当使用沉浸式的时候,注意标题栏的位置,需要避让状态栏。
鸿蒙开发:自定义一个简单的标题栏