不是在屏幕上线性滑动
Posted
技术标签:
【中文标题】不是在屏幕上线性滑动【英文标题】:Not linear swipe over screen 【发布时间】:2016-08-07 06:48:35 【问题描述】:我正在开发一个类似机器人的 android 应用(用于控制其他应用) 目前,我在其他应用程序上执行 Taps 和 2 点线性滑动,创建服务并使用 SU 访问运行 /system/bin/input swipe/tap 命令 (这适用于顶部的任何东西)
我想知道如何进行 3+ 点非线性滑动。
我知道可以通过使用 c/c++ 代码并导入库来实现,但我不知道该怎么做。
【问题讨论】:
“类机器人”应用?您是指自动化还是可能的非法控制? 更像是自动化重复性任务 只要确定您使用的是哪个“机器人”定义。 :-) @JohnnyLynch 两个问题:3+ 点非线性滑动是什么意思?你是什么意思“使用c ++代码并导入库”?您可能在谈论 JNI 和原生编程吗? @LBes 3+ 点非线性滑动 超过 2 点滑动我的意思是弯曲滑动或 TouchDown>TouchMove(到不同的 x,y 点)>TouchUp 是的,我在谈论 JNI 和本机编程. 【参考方案1】:好的,所以我将这个答案基于您的上一条评论,我想您知道如何使用 JNI,并且我假设您希望使用本机代码根据手指位置处理所有计算。这就是我从您的评论(和问题)中理解的。
因此,您首先需要通过 Java 代码恢复触摸事件,如下所示:(请注意,我在这里处理的手指不超过 3 个以及相关的可能错误)。
public class MainActivity extends ... implements View.OnTouchListener
@Override
public boolean onTouch(View v, MotionEvent event)
//First compute RAW coordinates of each touch event
float rawPosX[] = new float[3];
float rawPosY[] = new float[3];
int [] ids = new int[3];
int nbFingers = event.getPointerCount() ;
for (int i = 0; i < nbFingers; i++)
rawPosX[i] = //RawX of each point I assume you have that code already
rawPosY[i] = //RawY of each point I assume you have that code already
ids[i] = event.getPointerId(i);
switch (event.getActionMasked())
case MotionEvent.ACTION_POINTER_DOWN:
int index = event.getActionIndex();
int id = event.getPointerId(index);
NativeApp.addFinger(rawPosX[index], rawPosY[index], id);
break ;
case MotionEvent.ACTION_POINTER_UP:
int index = event.getActionIndex();
int id = event.getPointerId(index);
NativeApp.removeFinger(id);
break ;
case MotionEvent.ACTION_MOVE:
for (int i = 0; i < nbFingers; ++i)
NativeApp.updateFingerPositions(rawPosX[i], rawPosY[i], ids[i]);
break ;
那么在你的原生代码中你应该有以下函数:
JNIEXPORT void JNICALL Package_updateFingerPositions(JNIEnv* env, jobject obj, jfloat x, jfloat y, jint fingerID);
JNIEXPORT void JNICALL Package_addFinger(JNIEnv* env, jobject obj, jfloat x, jfloat y, jint fingerID);
JNIEXPORT void JNICALL Package_removeFinger(JNIEnv* env, jobject obj, jint fingerID);
还有以下向量:
//This is considering you have a Vector3 class, which I often have myself. But you can easily adapt it with `std::tuple`. I use a Vector3 so as to store the x and y position
std::vector<Vector3> fingerPositions ;
std::vector<Vector3> previousFingerPositions ;
我不打算详细介绍 addFinger() 和 removeFinger() 函数,因为它们很容易编码。但是在更新中你应该有这样的东西:
JNIEXPORT void JNICALL Package_updateFingerPositions(float x, float y, int fingerID)
int position = getFingerPos(fingerID); // This returns the position of the finger with this Id in your vector storing the finger positions.
Vector3 pos(x,y, fingerID); // To update your previousFingerPositions vector
if(position == -1)
return ;
//Remember to update everything first
previousFingerPositions [position] = fingerPositions[position] ;
fingerPositions[position] = pos ;
if(fingerPositions.size() == 3)
//That's what you want here.
//You can do your computation here and use the previous positions for the computations that you need
请注意:此代码根本没有优化,完全未经测试。其中可能存在错误,但这是我可以从移动设备上做的最好的事情。希望对您有所帮助,希望我能正确理解您的问题。
【讨论】:
以上是关于不是在屏幕上线性滑动的主要内容,如果未能解决你的问题,请参考以下文章
Airtest IDE 自动化测试9 - swipe 滑动屏幕