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>

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

相关文章
|
6月前
|
Android开发 数据安全/隐私保护 开发者
Android自定义view之模仿登录界面文本输入框(华为云APP)
本文介绍了一款自定义输入框的实现,包含静态效果、hint值浮动动画及功能扩展。通过组合多个控件完成界面布局,使用TranslateAnimation与AlphaAnimation实现hint文字上下浮动效果,支持密码加密解密显示、去除键盘回车空格输入、光标定位等功能。代码基于Android平台,提供完整源码与attrs配置,方便复用与定制。希望对开发者有所帮助。
125 0
|
4月前
|
存储 Android开发 数据安全/隐私保护
Thanox安卓系统增加工具下载,管理、阻止、限制后台每个APP运行情况
Thanox是一款Android系统管理工具,专注于权限、后台启动及运行管理。支持应用冻结、系统优化、UI自定义和模块管理,基于Xposed框架开发,安全可靠且开源免费,兼容Android 6.0及以上版本。
408 4
|
7月前
|
数据采集 JSON 网络安全
移动端数据抓取:Android App的TLS流量解密方案
本文介绍了一种通过TLS流量解密技术抓取知乎App热榜数据的方法。利用Charles Proxy解密HTTPS流量,分析App与服务器通信内容;结合Python Requests库模拟请求,配置特定请求头以绕过反爬机制。同时使用代理IP隐藏真实IP地址,确保抓取稳定。最终成功提取热榜标题、内容简介、链接等信息,为分析热点话题和用户趋势提供数据支持。此方法也可应用于其他Android App的数据采集,但需注意选择可靠的代理服务。
322 11
移动端数据抓取:Android App的TLS流量解密方案
|
1月前
|
缓存 移动开发 JavaScript
如何优化UniApp开发的App的启动速度?
如何优化UniApp开发的App的启动速度?
422 139
|
1月前
|
移动开发 JavaScript weex
UniApp开发的App在启动速度方面有哪些优势和劣势?
UniApp开发的App在启动速度方面有哪些优势和劣势?
298 137
|
2月前
|
移动开发 小程序 Android开发
基于 uni-app 开发的废品回收类多端应用功能与界面说明
本文将对一款基于 uni-app 开发的废品回收类多端应用,从多端支持范围、核心功能模块及部分界面展示进行客观说明,相关资源信息也将一并呈现。
138 0
|
1月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
238 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
1月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
204 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
1月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
523 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
下一篇
oss云网关配置