不是在屏幕上线性滑动

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
    


请注意:此代码根本没有优化,完全未经测试。其中可能存在错误,但这是我可以从移动设备上做的最好的事情。希望对您有所帮助,希望我能正确理解您的问题。

【讨论】:

以上是关于不是在屏幕上线性滑动的主要内容,如果未能解决你的问题,请参考以下文章

autojs怎么上滑屏幕

如何获得可访问性滑动以正确导航子视图集合?

线性布局不会填满整个屏幕

Airtest IDE 自动化测试9 - swipe 滑动屏幕

解决 RecyclerView AppBarLayout 滑动不顺畅的问题

touch移动触屏滑动事件