我想在连续向上滑动/向下滑动事件时递增/递减数字.我可以使用GestureDetector和OnSwipeTouchListener实现简单的滑动事件.
然而,仅在滑动之后抬起手指时才感测到该滑动事件.因此,为了将数字增加到+5,我要在屏幕上进行5次单独向上滑动.
我想应用"滑块"之类的操作,以便在用户在屏幕上的任何位置向上或向下滑动时更改数字.(我不想使用'Slider'小部件).
这可能吗?
任何帮助都会非常感激.谢谢!
使用OnTouchListener:
private float baseX, baseY;
OnTouchListener listener = new OnTouchListener(){
public boolean onTouch (View v, MotionEvent event)
{
switch(event.getAction())
{
case MotionEvent.ACTION_DOWN:
//TOUCH STARTED
baseX = event.getX();
baseY = event.getY();
return true;
case MotionEvent.ACTION_MOVE:
//FINGER IS MOVING
//Do your calculations here, using the x and y positions relative to the starting values you get in ACTION_DOWN
return true;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
//TOUCH COMPLETED
return true;
}
}
}
Run Code Online (Sandbox Code Playgroud)
@ 1up,非常感谢解决方案!
我可以添加的增强功能即使在不抬起手指的情况下反转滑动方向,它也能正常工作.
使用您提供的骨架,发布我的代码,希望它将来会帮助某人...
public class OnSwipeListener implements OnTouchListener
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
boolean result = false;
float currentX = 0.0f;
float currentY = 0.0f;
float current_diffX = 0.0f;
float current_diffY = 0.0f;
switch(event.getAction())
{
case MotionEvent.ACTION_DOWN:
//Touch detected, record base X-Y coordinates
baseX = event.getX();
baseY = event.getY();
//As the event is consumed, return true
result = true;
break;
case MotionEvent.ACTION_MOVE:
//Swipe started, get current X-Y coordinates and compute those with the base ones
currentX = event.getX();
currentY = event.getY();
current_diffX = currentX - baseX;
current_diffY = currentY - baseY;
//...................................................Determine horizontal swipe direction
if(h_swipe == LEFT_SWIPE)
{
if( currentX > previousX )
{
//If here, then horizontal swipe has been reversed
h_swipe = RIGHT_SWIPE;
//Overwrite base coordinate
baseX = previousX;
//Recalculate Difference
current_diffX = currentX - baseX;
}
else
{
//NOP - Intentionally kept empty
}
}
else if(h_swipe == RIGHT_SWIPE)
{
if( currentX < previousX )
{
//If here, then horizontal swipe has been reversed
h_swipe = LEFT_SWIPE;
//Overwrite base coordinate
baseX = previousX;
//Recalculate Difference
current_diffX = currentX - baseX;
}
else
{
//NOP - Intentionally kept empty
}
}
else
{
//If here, then it's a fresh swipe event, so compare with base coordinates
if( currentX < baseX )
{
h_swipe = LEFT_SWIPE;
}
else if( currentX > baseX )
{
h_swipe = RIGHT_SWIPE;
}
else
{
//NOP - Intentionally kept empty
}
}
//...................................................Determine vertical swipe direction
if(v_swipe == UP_SWIPE)
{
if(currentY > previousY)
{
//If here, then vertical swipe has been reversed
v_swipe = DOWN_SWIPE;
//Overwrite base coordinate
baseY = previousY;
//Recalculate coordinate difference
current_diffY = currentY - baseY;
}
else
{
//NOP - Intentionally kept empty
}
}
else if(v_swipe == DOWN_SWIPE)
{
if(currentY < previousY)
{
//If here, then vertical swipe has been reversed
v_swipe = UP_SWIPE;
//Overwrite base coordinate
baseY = previousY;
//Recalculate coordinate difference
current_diffY = currentY - baseY;
}
else
{
//NOP - Intentionally kept empty
}
}
else
{
//If here, then it's a fresh swipe event, so compare with base coordinates
if( currentY < baseY )
{
v_swipe = UP_SWIPE;
}
else if( currentY > baseY )
{
v_swipe = DOWN_SWIPE;
}
else
{
//NOP - Intentionally kept empty
}
}
//Record current coordinates for future comparisons
previousX = currentX;
previousY = currentY;
//................................Determine the prominent swipe (horizontal/vertical)
if(Math.abs(current_diffX) > Math.abs(current_diffY))
{
//It's a horizontal swipe
if (Math.abs(current_diffX) > SWIPE_THRESHOLD)
{
if (current_diffX > 0)
{
onRightSwipe();
}
else
{
onLeftSwipe();
}
}
else
{
//Not enough swipe movement, ignore.
//NOP - Intentionally kept empty
}
}
else
{
//It's a vertical swipe
if (Math.abs(current_diffY) > SWIPE_THRESHOLD)
{
if (current_diffY > 0)
{
onDownSwipe();
}
else
{
onUpSwipe();
}
}
else
{
//Not enough swipe movement, ignore.
//NOP - Intentionally kept empty
}
}
//As the event is consumed, return true
result = true;
break;
case MotionEvent.ACTION_UP:
//Swipe ended, clear variables, if necessary
h_swipe = NO_H_SWIPE;
v_swipe = NO_V_SWIPE;
baseX = 0.0f;
baseY = 0.0f;
previousX = 0.0f;
previousY = 0.0f;
//As the event is consumed, return true
result = true;
break;
default:
//Do not consume event
result = false;
break;
}
return result;
}
public void onUpSwipe()
{
}
public void onDownSwipe()
{
}
public void onRightSwipe()
{
}
public void onLeftSwipe()
{
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2625 次 |
| 最近记录: |