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>

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

相关文章
|
3月前
|
XML Java 数据库
安卓项目:app注册/登录界面设计
本文介绍了如何设计一个Android应用的注册/登录界面,包括布局文件的创建、登录和注册逻辑的实现,以及运行效果的展示。
234 0
安卓项目:app注册/登录界面设计
|
3天前
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
|
2月前
|
JSON JavaScript 前端开发
harmony-chatroom 自研纯血鸿蒙OS Next 5.0聊天APP实战案例
HarmonyOS-Chat是一个基于纯血鸿蒙OS Next5.0 API12实战开发的聊天应用程序。这个项目使用了ArkUI和ArkTS技术栈,实现了类似微信的消息UI布局、输入框光标处插入文字、emoji表情图片/GIF动图、图片预览、红包、语音/位置UI、长按语音面板等功能。
101 2
|
3月前
|
缓存 前端开发 Android开发
Android实战之如何截取Activity或者Fragment的内容?
本文首发于公众号“AntDream”,介绍了如何在Android中截取Activity或Fragment的屏幕内容并保存为图片。包括截取整个Activity、特定控件或区域的方法,以及处理包含RecyclerView的复杂情况。
31 3
|
3月前
|
JavaScript 小程序 开发者
uni-app开发实战:利用Vue混入(mixin)实现微信小程序全局分享功能,一键发送给朋友、分享到朋友圈、复制链接
uni-app开发实战:利用Vue混入(mixin)实现微信小程序全局分享功能,一键发送给朋友、分享到朋友圈、复制链接
563 0
|
3月前
|
Android开发
Android实战之如何快速实现自动轮播图
本文介绍了在 Android 中使用 `ViewPager2` 和自定义适配器实现轮播图的方法,包括添加依赖、布局配置、创建适配器及实现自动轮播等步骤。
119 0
|
3月前
|
Android开发
Android开发显示头部Bar的需求解决方案--Android应用实战
Android开发显示头部Bar的需求解决方案--Android应用实战
27 0
|
3月前
|
安全 网络安全 Android开发
深度解析:利用Universal Links与Android App Links实现无缝网页至应用跳转的安全考量
【10月更文挑战第2天】在移动互联网时代,用户经常需要从网页无缝跳转到移动应用中。这种跳转不仅需要提供流畅的用户体验,还要确保安全性。本文将深入探讨如何利用Universal Links(仅限于iOS)和Android App Links技术实现这一目标,并分析其安全性。
403 0
|
4月前
|
XML 数据库 Android开发
10分钟手把手教你用Android手撸一个简易的个人记账App
该文章提供了使用Android Studio从零开始创建一个简单的个人记账应用的详细步骤,包括项目搭建、界面设计、数据库处理及各功能模块的实现方法。
|
27天前
|
搜索推荐 前端开发 API
探索安卓开发中的自定义视图:打造个性化用户界面
在安卓应用开发的广阔天地中,自定义视图是一块神奇的画布,让开发者能够突破标准控件的限制,绘制出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战技巧,逐步揭示如何在安卓平台上创建和运用自定义视图来提升用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开新的视野,让你的应用在众多同质化产品中脱颖而出。
53 19