android 代码实现模拟用户点击、滑动等操作
/**
* 模拟用户点击
*
* @param view 要触发操作的view
* @param x 相对于要操作view的左上角x轴偏移量
* @param y 相对于要操作view的左上角y轴偏移量
*/
private static void analogUserClick(View view, float x, float y) {
if (view == null) {
return;
}
LogUtil.e(TAG_POINT, "正在模拟点击操作:p->" + x + "," + y);
long downTime = SystemClock.uptimeMillis();//模拟按下去的时间 long eventTime = downTime;//事件发生时间 MotionEvent downEvent = MotionEvent.obtain(downTime, eventTime,
ACTION_DOWN, x, y, 0);
view.onTouchEvent(downEvent); eventTime = eventTime + 90;//离开屏幕时间 MotionEvent upEvent = MotionEvent.obtain(downTime, eventTime,
MotionEvent.ACTION_UP, x, y, 0);
view.onTouchEvent(upEvent); //回收事件
downEvent.recycle();
upEvent.recycle();
}
/**
* 模拟用户滑动操作
*
* @param view 要触发操作的view
* @param type 模拟操作类型:均匀滑动、快速滑动
* @param p1x 滑动的起始点x坐标
* @param p1y 滑动的起始点y坐标
* @param p2x 滑动的终点x坐标
* @param p2y 滑动的终点y坐标
*/
private static void analogUserScroll(View view, final int type, final float p1x, final float p1y, final float p2x, final float p2y) {
LogUtil.e(TAG_POINT, "正在模拟滑屏操作:p1->" + p1x + "," + p1y + ";p2->" + p2x + "," + p2y);
if (view == null) {
return;
}
long downTime = SystemClock.uptimeMillis();//模拟按下去的时间 long eventTime = downTime; float pX = p1x;
float pY = p1y;
int speed = 0;//快速滑动
float touchTime = 116;//模拟滑动时发生的触摸事件次数 //平均每次事件要移动的距离
float perX = (p2x - p1x) / touchTime;
float perY = (p2y - p1y) / touchTime; boolean isReversal = perX < 0 || perY < 0;//判断是否反向:手指从下往上滑动,或者手指从右往左滑动
boolean isHandY = Math.abs(perY) > Math.abs(perX);//判断是左右滑动还是上下滑动 if (type == USER_TOUCH_TYPE_1) {//加速滑动
touchTime = 10;//如果是快速滑动,则发生的触摸事件比均匀滑动更少
speed = isReversal ? -20 : 20;//反向移动则坐标每次递减
} //模拟用户按下
MotionEvent downEvent = MotionEvent.obtain(downTime, eventTime,
ACTION_DOWN, pX, pY, 0);
view.onTouchEvent(downEvent); //模拟移动过程中的事件
List<MotionEvent> moveEvents = new ArrayList<>();
boolean isSkip = false;
for (int i = 0; i < touchTime; i++) { pX += (perX + speed);
pY += (perY + speed);
if ((isReversal && pX < p2x) || (!isReversal && pX > p2x)) {
pX = p2x;
isSkip = !isHandY;
} if ((isReversal && pY < p2y) || (!isReversal && pY > p2y)) {
pY = p2y;
isSkip = isHandY;
}
eventTime += 20.0f;//事件发生的时间要不断递增
MotionEvent moveEvent = getMoveEvent(downTime, eventTime, pX, pY);
moveEvents.add(moveEvent);
view.onTouchEvent(moveEvent);
if (type == USER_TOUCH_TYPE_1) {//加速滑动
speed += (isReversal ? -70 : 70);
}
if (isSkip) {
break;
}
} //模拟手指离开屏幕
MotionEvent upEvent = MotionEvent.obtain(downTime, eventTime,
MotionEvent.ACTION_UP, pX, pY, 0);
view.onTouchEvent(upEvent); //回收触摸事件
downEvent.recycle();
for (int i = 0; i < moveEvents.size(); i++) {
moveEvents.get(i).recycle();
}
upEvent.recycle();
}
private static MotionEvent getMoveEvent(long downTime, long evntTime, float x, float y) {
return MotionEvent.obtain(downTime, evntTime,
MotionEvent.ACTION_MOVE, x, y, 0);
}
android 代码实现模拟用户点击、滑动等操作的更多相关文章
- Android开发——后台获取用户点击位置坐标(可获取用户支付宝密码)
1. getevent命令 我们首先是根据adb shell getevent命令获取到被点击位置的信息. 这里要说明的是,不同的手机手机获得的点击输出是不一样的.以我的真机为例,输出如下 本文原创, ...
- Android Splash界面支持用户点击 直接进入主界面
转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/23613403 现在大部分APP都有Splash界面,下面列一下Splash页面的 ...
- 模拟用户点击弹出新页面不会被浏览器拦截_javascript技巧
原文:http://www.html5cn.com.cn/article/zxzx/3195.html 相信用过window.open的小伙伴们都遇到过被浏览器拦截导致页面无法弹出的情况:我们换下思路 ...
- Android OnGestureListener用法 识别用户手势 左右滑动
Android可以识别用户的手势(即用户用手指滑动的方向),通过用户不同的手势,从而做出不同的处理 需要使用OnGestureListener 比如说看电子书的时候翻页,或者要滑动一些其他内容 直接上 ...
- 使用appium模拟用户发送短信
一段简单粗糙的代码.主要是实现的功能是模拟用户发送短信的功能. python版本3.5.2 appium版本1.4.16.1 from appium import webdriver desired_ ...
- 在SoapUI中模拟用户操作
SoapUI作为一款接口测试工具,具有极大的灵活性和拓展性.它可以通过安装插件,拓展其功能.Selenium作为一款Web自动化测试插件可以很好的与SoapUI进行集成.如果要在SoapUI中模拟用户 ...
- Android代码模拟物理、屏幕点击事件
一.应用中模拟物理和屏幕点击事件 例如,模拟对某个view的点击事件 private void simulateClick(View view, float x, float y) { long do ...
- Android随笔之——用shell脚本模拟用户按键、触摸操作
之前写过两篇关于Android中模拟用户操作的博客(其实用一篇是转载的),现在就来讲讲用shell脚本来模拟用户按键操作.本次的目标是用shell脚本打开微信并在其搜索框中搜索相关内容. 本文的模拟功 ...
- Android与.Net交互模拟用户屏幕操作添加APN和网络4G/3G切换
前几天接到一个需求,我们的客户需要对手机网络接入点进行可用性测试,简单点说就是需要实现Android上的APN配置的添加,APN切换网络模式4G/3G/2G切换,我要调研下写个demo. 因为是要实现 ...
随机推荐
- 在qt5中使用qtmqtt库
qtmqtt库源码下载链接 链接:https://pan.baidu.com/s/1TyqbLX5x17mwhAX-OJiorw 提取码:i6ww perl安装下载链接 链接:https://pan. ...
- include 和require 区别
include和require的区别 1.include() 包含文件 2.include_once(filename)如果已经包含,则不再执行include_once 3.requirerequi ...
- 服务端性能测试工具校验v1.2
服务端性能测试工具校验v1.2 想知道压力工具实际并发多少,想知道压力工具统计响应数据准不准,来试试这款校准工具. 更新说明: 1.修正总接收请求显示上限. 2.随着响应时间增加,自动增加处理线程. ...
- SpringBoot整合NoSql--(三)Redis集群
(1)集群原理 在Redis集群中,所有的Redis节点彼此互联,节点内部使用二进制协议优化传输速度和带宽. 当一个节点挂掉后,集群中超过半数的节点检测失效时才认为该节点已失效.不同于Tomcat集群 ...
- JavaScript对象模型概念
1.对象的概念 JavaScript只有函数对象才有类的概念,因此创建一个对象,必须使用函数对象.(ES6中可以直接声明一个class,实质上也是一个函数对象). 函数对象的内部有[[Construc ...
- LINUX系统(CentOS7安装)一之JDK8的安装
JDK 的安装系统安装就不做过多介绍,大家从网上寻找安装步骤进行安装,不过我推荐大家进行安装时选择桌面图形化格式进行安装,方便做一部分操作,同时在安装过程中选择英文模式,同时我自己在安装的过程中发现使 ...
- 整理了Linux常用命令变量
查看信息命令 ls 查看当前目录下面的所有文件 -a 显示所有文件(包括隐藏文件) -l 显示所有文件(包括文件的详细信息) 格式: ls 参数 目录路径(绝对/相对) cd 切换目录 格式: cd ...
- js的reduce累加器
reduce为数组中每一个元素执行回调函数,不包括被删除或未被赋值的 https://www.jianshu.com/p/e375ba1cfc47
- Auto-Encoder(自编码器)原理
1.无监督学习 无监督学习和监督学习是机器学习的两个方向,监督学习主要适用于已经标注好的数据集(如mnist分类问题),无监督学习则是希望计算机完成复杂的标注任务,简单的解释就是——教机器自己学习,它 ...
- 剑指offer-面试题49-丑数-空间换时间
/* 题目: 求从1开始的第n个丑数. */ /* 思路: 按顺序列出各个丑数. */ #include<iostream> #include<cstring> #includ ...