/**
* 模拟用户点击
*
* @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 代码实现模拟用户点击、滑动等操作的更多相关文章

  1. Android开发——后台获取用户点击位置坐标(可获取用户支付宝密码)

    1. getevent命令 我们首先是根据adb shell getevent命令获取到被点击位置的信息. 这里要说明的是,不同的手机手机获得的点击输出是不一样的.以我的真机为例,输出如下 本文原创, ...

  2. Android Splash界面支持用户点击 直接进入主界面

    转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/23613403 现在大部分APP都有Splash界面,下面列一下Splash页面的 ...

  3. 模拟用户点击弹出新页面不会被浏览器拦截_javascript技巧

    原文:http://www.html5cn.com.cn/article/zxzx/3195.html 相信用过window.open的小伙伴们都遇到过被浏览器拦截导致页面无法弹出的情况:我们换下思路 ...

  4. Android OnGestureListener用法 识别用户手势 左右滑动

    Android可以识别用户的手势(即用户用手指滑动的方向),通过用户不同的手势,从而做出不同的处理 需要使用OnGestureListener 比如说看电子书的时候翻页,或者要滑动一些其他内容 直接上 ...

  5. 使用appium模拟用户发送短信

    一段简单粗糙的代码.主要是实现的功能是模拟用户发送短信的功能. python版本3.5.2 appium版本1.4.16.1 from appium import webdriver desired_ ...

  6. 在SoapUI中模拟用户操作

    SoapUI作为一款接口测试工具,具有极大的灵活性和拓展性.它可以通过安装插件,拓展其功能.Selenium作为一款Web自动化测试插件可以很好的与SoapUI进行集成.如果要在SoapUI中模拟用户 ...

  7. Android代码模拟物理、屏幕点击事件

    一.应用中模拟物理和屏幕点击事件 例如,模拟对某个view的点击事件 private void simulateClick(View view, float x, float y) { long do ...

  8. Android随笔之——用shell脚本模拟用户按键、触摸操作

    之前写过两篇关于Android中模拟用户操作的博客(其实用一篇是转载的),现在就来讲讲用shell脚本来模拟用户按键操作.本次的目标是用shell脚本打开微信并在其搜索框中搜索相关内容. 本文的模拟功 ...

  9. Android与.Net交互模拟用户屏幕操作添加APN和网络4G/3G切换

    前几天接到一个需求,我们的客户需要对手机网络接入点进行可用性测试,简单点说就是需要实现Android上的APN配置的添加,APN切换网络模式4G/3G/2G切换,我要调研下写个demo. 因为是要实现 ...

随机推荐

  1. Erlang/Elixir精选-第6期(20200113)

    精选文章 Implementing languages on the Erlang VM. -Robert Virding. 因为视频没有显示PPT,PPT可以在点击这里下载. leex - lexi ...

  2. html基本标签表单实现交互原理,单选框,复选框,下拉框介绍

    表单是什么?表单是前端和服务器做交互的一种机制,表单收集用户输入信息,之后发送或者提交给服务器.用户在输入的信息称之为内容,内容的文本分为普通和密码型,用户通过单选框.复选框.下拉框(也就是下拉菜单) ...

  3. UESTC 1324 卿学姐与公主 分块板子

    #include<iostream> #include<cmath> using namespace std; ; //表示当前数在哪一块里面 int belong[maxn] ...

  4. 1.泛型(Generic)

    一.泛型 泛型就是封装,将重复的工作简单化 1.泛型方法 public static void Show<T>(T tParameter) { Console.WriteLine(&quo ...

  5. Umi 小白纪实(二)—— model 的注册与使用

    Umi 通常会搭配 Dva 使用,用于管理页面状态和逻辑 一.注册 model 首先需要在 .umirc.js 中启用 dva 插件 export default { plugins: [ ['umi ...

  6. Spring Boot源码(四):Bean装配

    为了演示Spring中对象是如何创建并放到spring容器中,这里新建一个maven项目: 其中pom.xm文件中只引入了一个依赖: <dependencies> <dependen ...

  7. java学习笔记之IO编程—字节流和字符流

    1. 流的基本概念 在java.io包里面File类是唯一一个与文件本身有关的程序处理类,但是File只能够操作文件本身而不能操作文件的内容,或者说在实际的开发之中IO操作的核心意义在于:输入与输出操 ...

  8. Android数据存储之Application

    Application是Android的一大组件,在APP运行过程中有且仅有一个Application对象,它类似于javaweb中的session,贯穿整个生命周期. Application中适合保 ...

  9. thinkphp5.0 insert添加数据

    首先引入文件:use think\Db; public function zhuce(){ $username = input("username");//手机号 $passwor ...

  10. Pair类模板

    >Pair的实现是一个结构体而不是一个类< 1.标准头文件 #include<utility> 似乎无需引入该文件,在std命名空间内也有pair类型 2.格式为:templa ...