动态壁纸滑动手势

Live wallpaper swiper gestures

我正在完成我的动态壁纸,除了性能问题外它运行良好,现在我应用了一个有助于滑动手势和触摸检测的脚本。

public void onTouchEvent(MotionEvent touchevent) 

                {
        SharedPreferences prefs = PreferenceManager  
                .getDefaultSharedPreferences(getBaseContext());
                    if (prefs.getBoolean("Touch_lock_key",true))
                    {  
                             switch (touchevent.getAction())
                             {
                                    // when user first touches the screen we get x and y coordinate
                                     case MotionEvent.ACTION_DOWN: 
                                     {
                                         x1 = touchevent.getX();
                                         y1 = touchevent.getY();
                                         break;
                                    }
                                     case MotionEvent.ACTION_MOVE: 
                                     {
                                         x2 = touchevent.getX();
                                         y2 = touchevent.getY(); 

                                         //right swipe

                                         if (x1-x2< 0 ) 
                                         {

                                            try {

                                                mImagesArrayIndex++;
                                                Thread.sleep(SeekBarPreference1.mCurrentValue1);
                                            } catch (InterruptedException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                            }
                                          }

                                         // left swipe
                                         if (x1-x2>0 )
                                         {
                                             try {

                                                    mImagesArrayIndex--;
                                                    Thread.sleep(SeekBarPreference1.mCurrentValue1);
                                                } catch (InterruptedException e) {
                                                    // TODO Auto-generated catch block
                                                    e.printStackTrace();
                                                }
                                         }


                                         break;
                                     }
                             }
                             return;
                }

                }

如您所见,我使用 .getaction 函数来管理触摸和滑动手势。它的工作但不像我预期的那样。问题是:

  1. 对触摸非常敏感,使用此动态壁纸时会很烦人。

  2. 没有正确跟随左右滑动。

  3. 当手指在屏幕上滑动停止时,左右滑动不会停止。

我想要的:

  1. 任何其他可能对我的案例有帮助的滑动手势管理器脚本(动态壁纸 - 这里不涉及 activity)

  2. 像我们在任何动态壁纸上看到的平滑滑动效果,以 titanfall LW 为例。

这里有一段视频可能会帮助您了解情况:

https://drive.google.com/file/d/0B44QwXQHh5irOGlXNDNpOThYb3c/view?usp=sharing

onTouch() 会针对任何给定的手势调用多次,因此您增加的数量比您想要的多得多。首先是使用 GestureDetector 和 GestureDetector.SimpleGestureListener。

原文如此:

private GestureDetector mDetector
...
@Override
protected void onCreate(...) {
    ...
    mDetector = new GestureDetector(this, mGestureListener);
    setOnTouchListener(new CustomTouchListener());
    ...
}
...
private class CustomTouchListener implements View.OnTouchListener {
    @Override
    public boolean onTouch(View v, MotionEvent e) {
        return mDetector.onTouchEvent(e);
    }
}
...
private GestureDetector.SimpleOnGestureListener mGestureListener
        = new GestureDetector.SimpleOnGestureListener {
    @Override
    public boolean onDown(MotionEvent e) {
        ...
    }
    // the IDE will create all these methods for you
    //EDIT: I forgot SimpleOnGestureListener isn't abstract, so it won't do this. OnGestureListener is, so the IDE will. 
};

滑动的基本顺序如下所示

onDown()
onScroll()
onScroll()
....
onScroll()
onFling()

所以如果你真的想自己处理手势,你正在寻找的事件是 onDown 和 on Fling(你可以用 onTouch ACTION_DOWN 和 ACTION_UP 来做到这一点,但是 SimpleOnGestureListener 给出你更多的功能)。

但我真的建议研究一个已经为您处理所有这些的视图,比如 ViewPager

我找到了一个解决方案,这段代码和之前的代码一样我只是添加了一些关于精度和触摸跟踪的修改..

@Override  

    public void onTouchEvent(MotionEvent event)  {

            //when user touches the screen  
            if(event.getAction() == MotionEvent.ACTION_DOWN)  
            {  
                //reset deltaX and deltaY  
                deltaX=0;

                //get initial positions  
                initialX = event.getRawX();  
                initialY = event.getRawY();  
            }  

            //swipe gestures tracking
            if(event.getAction() == MotionEvent.ACTION_MOVE)    
            {    
                deltaX = event.getRawX() - initialX;    
                deltaY = event.getRawY() - initialY;      

                if(deltaY < 0)   
                {    
                    //Actions UP
                }   
                else   
                {    
                    //Actions DOWN
                }   

                if(deltaX < 0)   
                {   
                     initialX = event.getRawX(); 
                    // actions RIGHT
                    }

                }  

                else  
                { 
                    initialX = event.getRawX();   
                    // actions LEFT
                        }
                }   


                return;  


    }  
    }

这是一个结果:

https://drive.google.com/file/d/0B44QwXQHh5irZUtEM3ZZQmRHcFk/view?usp=sharing


我希望有人觉得这有帮助&...编码愉快!