2013-05-23 5 views
0

У меня возникла проблема для вычисления диагональных событий салфетки в андроидном представлении. Может ли кто-нибудь дать мне некоторую логику, чтобы идентифицировать диагональные жесты. Мои требования: после того, как пользователь провёл по диагонали по телефону, мне нужно вызвать различные события. Нравится: 1) TopLeftToBottomRight. 2) TopRightToBottomLeft. 3) BottomLeftToTopRight. 4) BottomRightToTopLeft.Как обращаться с диагональными жесты в Android?

Пожалуйста, у кого-нибудь есть какая-то логика, чтобы справиться со всем этим. Образец приложения будет оценен. Помогите мне в этом, мне нужно выполнить эту задачу как можно скорее. Спасибо заранее.

ответ

1

Чтобы распознать события касания и события движения, вы должны использовать GestureDectector. Вы получите начальную и окончательную координаты экрана. Затем вам нужно будет вызывать алгоритм, чтобы определить направление вашего жестового движения, основываясь на координатах, которые вы получаете. Это не так сложно. Вот a link о том, как использовать GestureDetector.

Вот образец для распознавания левых и правых мазковых и сенсорных событий:

Вы можете улучшить этот код в методе onFling, чтобы заставить его работать свой путь.

package com.ex.gessture; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.GestureDetector; 
import android.view.GestureDetector.SimpleOnGestureListener; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.FrameLayout; 

public class GestureListenerActivity extends Activity { 

FrameLayout frame; 
GestureDetector mGestureDetector; 
String TAG = "GestureListenerActivity"; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    frame = (FrameLayout) findViewById(R.id.frame); 

    mGestureDetector = new GestureDetector(this, mGestureListener); 

    frame.setOnTouchListener(new FrameLayout.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 

      return mGestureDetector.onTouchEvent(event); 
     } 
    }); 
} 

/** 
* Gesture Event Handler 
*/ 
private SimpleOnGestureListener mGestureListener = new SimpleOnGestureListener() { 

    int swipe_Min_Distance = 100; 
    int swipe_Max_Distance = 350; 
    int swipe_Min_Velocity = 100; 
/*  
    @Override 
    public boolean onDown(MotionEvent e) { 
     Log.i(TAG, "[CALLBACK_GL] boolean onDown(e:" + e + ")"); 
     return super.onDown(e); 
    } 
*/ 
    @Override 
    public boolean onDown(MotionEvent e) { 
     return true; 
    } 

    @Override 
    public boolean onSingleTapUp(MotionEvent e) 
    { 

     /** 
     * 
     * Do your stuff 
     * 
     */ 

     return super.onSingleTapUp(e); 
    } 

    @Override 
    public boolean onSingleTapConfirmed(MotionEvent e) { 
     Log.i(TAG, "[CALLBACK_GL] boolean onSingleTapConfirmed(e:" + e + ")"); 
     return super.onSingleTapConfirmed(e); 
    } 

    @Override 
    public boolean onDoubleTap(MotionEvent e) { 
     Log.i(TAG, "[CALLBACK_GL] boolean onDoubleTap(e:" + e + ")"); 


     return super.onDoubleTap(e); 
    } 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
     Log.i(TAG, "[CALLBACK_GL] boolean onFling(e1:" + e1 + ", e2:" + e2 + ", velocityX:" + velocityX 
       + ", velocityY:" + velocityY + ""); 

     final float xDistance = Math.abs(e1.getX() - e2.getX()); 
     final float yDistance = Math.abs(e1.getY() - e2.getY()); 

     if(xDistance > this.swipe_Max_Distance || yDistance > this.swipe_Max_Distance) 
      return false; 

     velocityX = Math.abs(velocityX); 
     velocityY = Math.abs(velocityY); 
     boolean result = false; 

     if(velocityX > this.swipe_Min_Velocity && xDistance > this.swipe_Min_Distance){ 
      if(e1.getX() > e2.getX()) // right to left 
       Log.i(TAG, "Swipe Left"); 

      else 
       Log.i(TAG, "Swipe Right"); 
     } 

     //return super.onFling(e1, e2, velocityX, velocityY); 
     return true; 
    } 

    @Override 
    public void onShowPress(MotionEvent e) { 
     Log.i(TAG, "[CALLBACK_GL] void onShowPress(e:" + e + ")"); 
     super.onShowPress(e); 
    } 

    @Override 
    public void onLongPress(MotionEvent e) { 
     Log.i(TAG, "[CALLBACK_GL] void onLongPress(e:" + e + ")"); 

     super.onLongPress(e); 
    } 
}; 

}  

Пример: Используйте это условие в onFling для TopRightToBottomLeft прикосновения:

// TopRightToBottomLeft 
if((e1.getX() > e2.getX()) && (e1.getY() > e2.getY())) { 
    Log.i(TAG, "Swipe TopRightToBottomLeft"); 
} 

Вы можете попробовать так же для других событий.

+0

Vickey благодарю вас так много для смотреть в мою проблему. onFling() он даст только для rightToLeft, LeftToRight, TopToBottom и BottomToTop. это я сделал правильно и отлично работал. проблема с вычислением диагональных событий. (Мне нужны математические вычисления, чтобы различать диагональные события салфетки, такие же как функции onFling().) Еще раз благодарим вас за ваш повтор. – Vishnuvardhan

+0

Проверьте внесенные изменения. –

0

при использовании GestureDetector вам придется признать, каждый жест себя, лучшим решением является использование GestureOverlayView и система приложение под названием GestureBuilder, которые позволяют создавать пользовательские жесты

+0

Спасибо, pskink, теперь я использую только GestureDetector, и вычисляя touchDown и touchUp, используя их, я вычисляю тип события. – Vishnuvardhan

Смежные вопросы