检测附加手势 [英] Detecting additional gestures
本文介绍了检测附加手势的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
您好,我用这个来检测左/右轻扫,然后点击的手势。
@覆盖
公共布尔onTouchEvent(MotionEvent事件){
INT行动= event.getAction();
开关(动作){
案例MotionEvent.ACTION_DOWN:
touchBegan(事件);
返回true;
案例MotionEvent.ACTION_MOVE:
touchMoved(事件);
返回true;
案例MotionEvent.ACTION_UP:
touchEnded(事件);
返回true;
} 返回false;
}私人无效touchBegan(MotionEvent事件)
{
浮X = event.getX();
mTouchStartX = X;
mTouchStartY = event.getY();
mStartTime = AnimationUtils.currentAnimationTimeMillis();
mStartOffset = mOffset; mTouchMoved = FALSE; mTouchStartPos =(X / mWidth)* MOVE_POS_MULTIPLE - 5;
mTouchStartPos / = 2; mVelocity = VelocityTracker.obtain();
mVelocity.addMovement(事件);
}私人无效touchMoved(MotionEvent事件){
浮动POS =(event.getX()/ mWidth)* MOVE_POS_MULTIPLE - 5;
正/ = 2; 如果(!mTouchMoved){
浮DX = Math.abs(event.getX() - mTouchStartX);
浮DY = Math.abs(event.getY() - mTouchStartY); 如果(DX< TOUCH_MINIMUM_MOVE&放大器;&安培; DY< TOUCH_MINIMUM_MOVE)
返回; mTouchMoved = TRUE;
} mOffset = mStartOffset + mTouchStartPos - POS; 无效();
mVelocity.addMovement(事件);
}私人无效touchEnded(MotionEvent事件){
浮动POS =(event.getX()/ mWidth)* MOVE_POS_MULTIPLE - 5;
正/ = 2; 如果(mTouchMoved){
mStartOffset + = mTouchStartPos - POS;
mOffset = mStartOffset; mVelocity.addMovement(事件); mVelocity.computeCurrentVelocity(1000);
倍速= mVelocity.getXVelocity(); 速度=(速度/ mWidth)* MOVE_SPEED_MULTIPLE;
如果(速度> MAX_SPEED)
速度= MAX_SPEED;
否则,如果(速度< -MAX_SPEED)
速度= -MAX_SPEED;
startAnimation( - 速度);
}其他{
如果(mTouchRect!= NULL){
//布尔测试= RectF.intersects(mTouchRect,新
// RectF(event.getX(),event.getY(),10,10));
如果(mCoverFlowListener = NULL&放大器;!&安培; topImageClickEnable){
mCoverFlowListener.topImageClicked(这一点,
getActuallyPosition((int)的mOffset));
}
}
}
mVelocity.clear();
mVelocity.recycle();
}
但现在我要整合向上/向下轻扫+ onlongclick事件。
你能给我任何时候怎么办呢?
解决方案
公共类MainActivity延伸活动{ 字符串LOGTAG =MainActivity;
布尔isSwipe = FALSE; @覆盖
保护无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_main);
最后SwipeGestureDetector swipeGestureDetector =新SwipeGestureDetector();
最后GestureDetector gestureDetector =新GestureDetector(这一点,
swipeGestureDetector);
ImageView的ImageView的=(ImageView的)findViewById(R.id.imageView);
View.OnTouchListener gestureListener =新View.OnTouchListener(){
@覆盖
公共布尔onTouch(视图V,MotionEvent事件){
返回gestureDetector.onTouchEvent(事件);
}
}; //连接监听器监听视图上的手势。例如。一个ImageView的
imageView.setOnTouchListener(gestureListener);
//里面长按监听器是否已经检测到刷卡,我们首先检查。
//返回false,如果我们想消费刷卡事件
// true,如果我们要消耗长按事件。
//可以用类似的方式设置的点击监听器了。
imageView.setOnLongClickListener(新View.OnLongClickListener(){ @覆盖
公共布尔onLongClick(视图v){
如果(isSwipe){
Log.d(LOGTAG,刷卡里面长按);
返回false;
}其他{
Log.d(LOGTAG,长按);
返回true;
}
}
});
} 类SwipeGestureDetector扩展SimpleOnGestureListener { @覆盖
公共布尔onFling(MotionEvent E1,E2 MotionEvent,浮velocityX,
浮动velocityY){ 开关(getSlope(e1.getX(),e1.getY(),e2.getX(),e2.getY())){
情况下0:
isSwipe = FALSE;
返回false;
情况1:
Log.d(LOGTAG,顶);
isSwipe =真;
返回true;
案例2:
Log.d(LOGTAG,左);
isSwipe =真;
返回true;
案例3:
Log.d(LOGTAG,下);
isSwipe =真;
返回true;
情况4:
Log.d(LOGTAG,右);
isSwipe =真;
返回true;
}
返回false;
} 私人诠释getSlope(浮点X1,Y1浮球,浮球X2,Y2浮动){
最后ViewConfiguration VC = ViewConfiguration
获得(getApplicationContext());
最终诠释swipeMaxOffPath = vc.getScaledTouchSlop();
双角= Math.toDegrees(Math.atan2(Y1 - Y2,X2 - X1));
如果(角度> 45安培;&安培;角α= 135){
// 最佳
如果(Math.abs(Y2 - Y1)GT; swipeMaxOffPath)
返回1;
}
如果(角度> = 135安培;&安培;角α180 ||角α; -135&放大器;&安培;角GT; -180){
// 剩下
如果(Math.abs(X2 - X1)> swipeMaxOffPath)
返回2;
}
如果(角α; -45安培;&安培;角GT = -135){
如果(Math.abs(Y2 - Y1)GT; swipeMaxOffPath)
返回3;
} 如果(角度> = -45安培;&安培;角α= 45){//权 如果(Math.abs(X2 - X1)> swipeMaxOffPath)
返回4;
}
返回0;
}
}
}
Hello I am using this to detect left/right swipe and click gesture.
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
touchBegan(event);
return true;
case MotionEvent.ACTION_MOVE:
touchMoved(event);
return true;
case MotionEvent.ACTION_UP:
touchEnded(event);
return true;
}
return false;
}
private void touchBegan(MotionEvent event)
{
float x = event.getX();
mTouchStartX = x;
mTouchStartY = event.getY();
mStartTime = AnimationUtils.currentAnimationTimeMillis();
mStartOffset = mOffset;
mTouchMoved = false;
mTouchStartPos = (x / mWidth) * MOVE_POS_MULTIPLE - 5;
mTouchStartPos /= 2;
mVelocity = VelocityTracker.obtain();
mVelocity.addMovement(event);
}
private void touchMoved(MotionEvent event) {
float pos = (event.getX() / mWidth) * MOVE_POS_MULTIPLE - 5;
pos /= 2;
if (!mTouchMoved) {
float dx = Math.abs(event.getX() - mTouchStartX);
float dy = Math.abs(event.getY() - mTouchStartY);
if (dx < TOUCH_MINIMUM_MOVE && dy < TOUCH_MINIMUM_MOVE)
return;
mTouchMoved = true;
}
mOffset = mStartOffset + mTouchStartPos - pos;
invalidate();
mVelocity.addMovement(event);
}
private void touchEnded(MotionEvent event) {
float pos = (event.getX() / mWidth) * MOVE_POS_MULTIPLE - 5;
pos /= 2;
if (mTouchMoved) {
mStartOffset += mTouchStartPos - pos;
mOffset = mStartOffset;
mVelocity.addMovement(event);
mVelocity.computeCurrentVelocity(1000);
double speed = mVelocity.getXVelocity();
speed = (speed / mWidth) * MOVE_SPEED_MULTIPLE;
if (speed > MAX_SPEED)
speed = MAX_SPEED;
else if (speed < -MAX_SPEED)
speed = -MAX_SPEED;
startAnimation(-speed);
} else {
if (mTouchRect != null) {
// boolean test = RectF.intersects(mTouchRect, new
// RectF(event.getX(),event.getY(),10,10));
if (mCoverFlowListener != null && topImageClickEnable) {
mCoverFlowListener.topImageClicked(this,
getActuallyPosition((int) mOffset));
}
}
}
mVelocity.clear();
mVelocity.recycle();
}
But now I want to integrate up/down swipe + onlongclick event. Can you give me any point how to do it ?
解决方案
public class MainActivity extends Activity {
String LOGTAG = "MainActivity";
Boolean isSwipe = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final SwipeGestureDetector swipeGestureDetector = new SwipeGestureDetector();
final GestureDetector gestureDetector = new GestureDetector(this,
swipeGestureDetector);
ImageView imageView = (ImageView) findViewById(R.id.imageView);
View.OnTouchListener gestureListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
};
// Attach listener to listen for gestures on a view. eg. an ImageView
imageView.setOnTouchListener(gestureListener);
//inside long click listener we first check if a swipe has been detected.
//return false if we want to consume the swipe event
//true if we want to consume the long click event.
//You can set a click listener too in a similar way.
imageView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (isSwipe) {
Log.d(LOGTAG, "Swipe inside long click");
return false;
} else {
Log.d(LOGTAG, "Long Click");
return true;
}
}
});
}
class SwipeGestureDetector extends SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
switch (getSlope(e1.getX(), e1.getY(), e2.getX(), e2.getY())) {
case 0:
isSwipe = false;
return false;
case 1:
Log.d(LOGTAG, "top");
isSwipe = true;
return true;
case 2:
Log.d(LOGTAG, "left");
isSwipe = true;
return true;
case 3:
Log.d(LOGTAG, "down");
isSwipe = true;
return true;
case 4:
Log.d(LOGTAG, "right");
isSwipe = true;
return true;
}
return false;
}
private int getSlope(float x1, float y1, float x2, float y2) {
final ViewConfiguration vc = ViewConfiguration
.get(getApplicationContext());
final int swipeMaxOffPath = vc.getScaledTouchSlop();
Double angle = Math.toDegrees(Math.atan2(y1 - y2, x2 - x1));
if (angle > 45 && angle <= 135) {
// top
if (Math.abs(y2 - y1) > swipeMaxOffPath)
return 1;
}
if (angle >= 135 && angle < 180 || angle < -135 && angle > -180) {
// left
if (Math.abs(x2 - x1) > swipeMaxOffPath)
return 2;
}
if (angle < -45 && angle >= -135) {
if (Math.abs(y2 - y1) > swipeMaxOffPath)
return 3;
}
if (angle >= -45 && angle <= 45) { // right
if (Math.abs(x2 - x1) > swipeMaxOffPath)
return 4;
}
return 0;
}
}
}
这篇关于检测附加手势的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文