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. 因为是要实现 ...
随机推荐
- 【01】HTML_day01_03-HTML常用标签
typora-copy-images-to: media 第01阶段.前端基础.HTML常用标签 学习目标 理解: 相对路径三种形式 应用 排版标签 文本格式化标签 图像标签 链接 相对路径,绝对路径 ...
- 汇桔网被曝拖欠12月份工资至今,强制买产品,CEO称去年交易额超400亿
三言财经消息,近日有汇桔网员工爆料,汇桔网拖欠12月工资至今,通知延迟到4月才发放. 此外爆料还指出,"各种手法逼迫大家离开,员工要么继续忍受,要么主动离职,要么停薪留职.都不同意只能仲裁. ...
- django-分页(非海量数据)
views.py class AnalysisDataHandler(View): def get(self, request): analysis_data = MonitorCenterDataA ...
- 【WCF Restful】Post传参示范
1.传多个参数 接口定义:(ResponseFormat与RequestFormat分别将相应参数序列化.请求参数反序列化) [OperationContract] [WebInvoke(UriTem ...
- GUI之JavaFX
一.JavaFX不深究系列,目的只是为了尝试使用GUI的方式来生成桌面应用. 二.JavaFX是一个强大的图形和多媒体处理工具包集合,它允许开发者来设计.创建.测试.调试和部署富客户端程序,并且和Ja ...
- LeetCode 145. 二叉树的后序遍历 (用栈实现后序遍历二叉树的非递归算法)
题目链接:https://leetcode-cn.com/problems/binary-tree-postorder-traversal/ 给定一个二叉树,返回它的 后序 遍历. 示例: 输入: [ ...
- Uva1363(余数性质/减少枚举量)
题意: 输入正整数n和k(范围均为1e9),求∑(k mod i),i从1~n 解法: 首先这道题直接暴力亲测会超时. 之后我们写几组数据之后可以发现当k/i的商相同的时候他们的余数成一个等差数列,而 ...
- 免费生成二维码接口,可直接嵌入到web项目中,附带嵌入方法,任意颜色二维码,任意大小二维码!
在线体验连接:http://www.zhaimaojun.top/qrcode/ 你是否在项目中寻找方便而且免费的可以直接嵌入到项目中的二维码生成工具呢?你找到了这里,说明你已经找到了!不要犹豫直接拿 ...
- SpringJpa CRUD 代码生成器
利用业余时间撸了一个Spring Jpa代码生成器jpa-codegen. 简介 这是一款基于Freemarker模板驱动的代码生成器. 依据现有的实体类代码,自动生成CRUD代码,解放双手,加快开发 ...
- 886. 求组合数 II(模板)
数据范围较大, a,b都是1e5 直接根据公式预处理 1/i就是求i的逆元(逆元求法:mod为质数,逆元就是 i^(mod-2)%mod ) O(N*logN) import java.util.S ...