Android App事件交互中辨别缩放与旋转手指的讲解与实战(附源码 可直接使用)

简介: Android App事件交互中辨别缩放与旋转手指的讲解与实战(附源码 可直接使用)

运行有问题或需要源码请点赞关注收藏后评论区留言~~~

一、辨别缩放与旋转手势

一个手指的滑动只能识别手势的滑动方向,两个手指的滑动才能识别更复杂的手势动作,如两个手指张开可表示放大操作,两个手指并拢可以表示缩小操作,两个手指交错旋转表示旋转操作,而旋转方向又可以细分为顺时针旋转和逆时针旋转

由于两个手指各有自己的按下与松开事件,都有对应的触摸起点和终点,因此只能依次记录两个手指的起点与终点坐标,根据着四个点的位置关系就能算出手势的动作类别,至于缩放类型与旋转手势的区分,则需要计算第一个手势起点和终点的连线,以及第二个手势起点和终点的连线,再判断两根连线是倾向于在相同方向上缩放还是倾向于绕着连线中点旋转

判别示意图如下

运行效果如下

虚拟机可以按住ctrl和鼠标左键模仿操作,当然连接真机操作更加便捷

代码如下

Java类

package com.example.event;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.graphics.PointF;
import android.os.Bundle;
import android.widget.TextView;
import com.example.event.util.PointUtil;
import com.example.event.widget.MultiTouchView;
@SuppressLint("DefaultLocale")
public class ScaleRotateActivity extends AppCompatActivity {
    private TextView tv_desc; // 声明一个文本视图对象
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scale_rotate);
        tv_desc = findViewById(R.id.tv_desc);
        MultiTouchView mtv_gesture = findViewById(R.id.mtv_gesture);
        // 设置多点触摸视图的手势滑动监听器
        mtv_gesture.setSlideListener((firstBeginP, firstEndP, secondBeginP, secondEndP) -> {
            // 上次两个触摸点之间的距离
            float preWholeDistance = PointUtil.distance(firstBeginP, secondBeginP);
            // 当前两个触摸点之间的距离
            float nowWholeDistance = PointUtil.distance(firstEndP, secondEndP);
            // 主要点在前后两次落点之间的距离
            float primaryDistance = PointUtil.distance(firstBeginP, firstEndP);
            // 次要点在前后两次落点之间的距离
            float secondaryDistance = PointUtil.distance(secondBeginP, secondEndP);
            if (Math.abs(nowWholeDistance - preWholeDistance) >
                    (float) Math.sqrt(2) / 2.0f * (primaryDistance + secondaryDistance)) {
                // 倾向于在原始线段的相同方向上移动,则判作缩放动作
                float scaleRatio = nowWholeDistance / preWholeDistance;
                String desc = String.format("本次手势为缩放动作,%s为%f",
                        scaleRatio>=1?"放大倍数":"缩小比例", scaleRatio);
                tv_desc.setText(desc);
            } else { // 倾向于在原始线段的垂直方向上移动,则判作旋转动作
                // 计算上次触摸事件的旋转角度
                int preDegree = PointUtil.degree(firstBeginP, secondBeginP);
                // 计算本次触摸事件的旋转角度
                int nowDegree = PointUtil.degree(firstEndP, secondEndP);
                String desc = String.format("本次手势为旋转动作,%s方向旋转了%d度",
                        nowDegree>preDegree?"顺时针":"逆时针", Math.abs(nowDegree-preDegree));
                tv_desc.setText(desc);
            }
        });
    }
}

XML文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <TextView
        android:id="@+id/tv_desc"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="5dp"
        android:text="请两指同时按压并缩放或旋转,再观察手势结果"
        android:textColor="@color/black"
        android:textSize="17sp" />
    <com.example.event.widget.MultiTouchView
        android:id="@+id/mtv_gesture"
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:background="@color/white" />
</LinearLayout>

创作不易 觉得有帮助请点赞关注收藏~~~

相关文章
HarmonyOS NEXT仓颉开发语言实战案例:外卖App
仓颉语言实战分享,教你如何用仓颉开发外卖App界面。内容包括页面布局、导航栏自定义、搜索框实现、列表模块构建等,附完整代码示例。轻松掌握Scroll、List等组件使用技巧,提升HarmonyOS应用开发能力。
HarmonyOS NEXT仓颉开发语言实战案例:电影App
周末好!本文分享使用仓颉语言重构ArkTS实现的电影App案例,对比两者在UI布局、组件写法及语法差异。内容包括页面结构、列表分组、分类切换与电影展示等。通过代码演示仓颉在HarmonyOS开发中的应用。##仓颉##ArkTS##HarmonyOS开发
HarmonyOS NEXT仓颉开发语言实战案例:健身App
本期分享一个健身App首页的布局实现,顶部采用Stack容器实现重叠背景与偏移效果,列表部分使用List结合Scroll实现可滚动内容。代码结构清晰,适合学习HarmonyOS布局技巧。
HarmonyOS NEXT仓颉开发语言实战案例:小而美的旅行App
本文分享了一个旅行App首页的设计与实现,使用List容器搭配Row、Column布局完成个人信息、功能列表及推荐模块的排版,详细展示了HarmonyOS下的界面构建技巧。
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
2040 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1298 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1363 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
移动开发 Android开发
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
619 0
|
缓存 小程序 视频直播
基于uni-app+vite5+vue3实战短视频+直播+聊天app应用
基于uniapp+vue3+vite5从0-1实战搭建仿抖音/微信直播带货商城。集短视频+聊天+直播功能于一体。实现全屏沉浸式切换短视频/直播,支持编译运行到h5+小程序端+app端。
744 4
|
存储 移动开发 监控
App Trace功能实战:一键拉起、快速安装与免提写邀请码的应用实践
App Trace系统通过一键拉起、快速安装和免提写邀请码三大功能,显著提升用户转化率、安装成功率和邀请注册率。结合深度技术实现与优化,助力公司用户增长,成为移动端核心基础设施。

热门文章

最新文章