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>

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

相关文章
|
2月前
|
人工智能 监控 安全
java基于微服务架构的智慧工地监管平台源码带APP
劳务管理: 工种管理、分包商管理、信息采集、班组管理、花名册、零工采集、 现场统计、考勤管理、考勤明细、工资管理、零工签证
287 4
|
2月前
|
开发框架 移动开发 前端开发
Uni-App常用事件
Uni-App常用事件
35 2
|
2月前
|
传感器 人工智能 数据可视化
Java智慧工地监管一体化云平台APP源码 SaaS模式
安全隐患排查 1.可在电脑端、手机端对安全隐患数据进行记录、查询 2.能够实现安全隐患发起、整改、复查的闭环管理 3.具备对安全隐患数据进行统计、可视化分析、信息推送等功能 4.包含对危险性较大的分部分项工程进行巡查记录功能
62 4
|
5天前
|
存储 Java Linux
Android系统获取event事件回调等几种实现和原理分析
Android系统获取event事件回调等几种实现和原理分析
26 0
|
12天前
|
Android开发 开发者
Android网络和数据交互: 请解释Android中的AsyncTask的作用。
Android&#39;s AsyncTask simplifies asynchronous tasks for brief background work, bridging UI and worker threads. It involves execute() for starting tasks, doInBackground() for background execution, publishProgress() for progress updates, and onPostExecute() for returning results to the main thread.
11 0
|
12天前
|
网络协议 安全 API
Android网络和数据交互: 什么是HTTP和HTTPS?在Android中如何进行网络请求?
HTTP和HTTPS是网络数据传输协议,HTTP基于TCP/IP,简单快速,HTTPS则是加密的HTTP,确保数据安全。在Android中,过去常用HttpURLConnection和HttpClient,但HttpClient自Android 6.0起被移除。现在推荐使用支持TLS、流式上传下载、超时配置等特性的HttpsURLConnection进行网络请求。
10 0
|
18天前
|
监控 数据可视化 安全
智慧工地SaaS可视化平台源码,PC端+APP端,支持二开,项目使用,微服务+Java++vue+mysql
环境实时数据、动态监测报警,实时监控施工环境状态,有针对性地预防施工过程中的环境污染问题,打造文明生态施工,创造绿色的生态环境。
14 0
智慧工地SaaS可视化平台源码,PC端+APP端,支持二开,项目使用,微服务+Java++vue+mysql
游戏直播APP平台开发多少钱成本:定制与成品源码差距这么大
开发一款游戏直播APP平台所需的费用是多少?对于计划投身这一领域的投资者来说,首要关心的问题之一就是。本文将探讨两种主要的开发模式——定制开发与成品源码二次开发的成本差异及其优劣势。
|
1月前
|
传感器 人工智能 数据可视化
Java智慧工地监管一体化云平台APP源码 SaaS模式
高支模监测:高支模立杆及倾斜角度,高支模立杆的荷载,架体的水平位移以及模板沉降情况,当检测数据超过预警值时,实时报警。
32 2
|
1月前
|
人工智能 监控 前端开发
Java智慧城管系统源码 数字城管APP系统源码 城市管理综合执法监督系统源码
Java编写的智慧城管系统源码,包含数字城管APP和综合执法监督系统,运用物联网、云计算等技术实现城市全面智慧管理。系统采用微服务架构,Java开发,结合vue前端框架和SpringBoot后端框架,支持MySQL数据库和uniapp移动端。功能模块包括执法办案、视频分析、统计分析等,提升案件办理和监管效能,促进行政执法创新,实现电子送达和非接触执法。
20 1