动态壁纸滑动手势
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 函数来管理触摸和滑动手势。它的工作但不像我预期的那样。问题是:
对触摸非常敏感,使用此动态壁纸时会很烦人。
没有正确跟随左右滑动。
当手指在屏幕上滑动停止时,左右滑动不会停止。
我想要的:
任何其他可能对我的案例有帮助的滑动手势管理器脚本(动态壁纸 - 这里不涉及 activity)
像我们在任何动态壁纸上看到的平滑滑动效果,以 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
我希望有人觉得这有帮助&...编码愉快!
我正在完成我的动态壁纸,除了性能问题外它运行良好,现在我应用了一个有助于滑动手势和触摸检测的脚本。
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 函数来管理触摸和滑动手势。它的工作但不像我预期的那样。问题是:
对触摸非常敏感,使用此动态壁纸时会很烦人。
没有正确跟随左右滑动。
当手指在屏幕上滑动停止时,左右滑动不会停止。
我想要的:
任何其他可能对我的案例有帮助的滑动手势管理器脚本(动态壁纸 - 这里不涉及 activity)
像我们在任何动态壁纸上看到的平滑滑动效果,以 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
我希望有人觉得这有帮助&...编码愉快!