Co robiłem to pierwszy importowany android.view.GestureDetector
więc można go używać do wykrywania gestów. Android ma wiele domyślnych gestów, które są automatycznie wykrywane w GestureDector class. Większość z tych informacji znajduje się pod numerem here, ale poniżej jest kod w formie, którą użyłem w rzeczywistym projekcie, który działa.
Najpierw zrobiłem anonimową klasę w mojej Działalności (może to być zagnieżdżone gdziekolwiek, ale mam tendencję do tworzenia moich anonimowych klas na dole, tuż przed nawiasem zamykającym). UWAGA: Możesz również zaimplementować OnGestureListener
jako część swojej klasy.
Poniższy kod służy do korzystania z funkcji wykrywania gestów w celu prostego ukrywania/pokazywania.
Ogłosiłem i zdefiniowałem pasek działań (mój UI, który jest początkowo ukryty) jako zmienną instancji, więc mogę uzyskać do niego dostęp tutaj i gdziekolwiek indziej, ale można go zastąpić getActionBar().show()
i getActionBar().hide()
w przypadku nie chcesz zadeklarować go jako zmiennej instancji. Zastąpić swoje UI w miejscu actionBar
tutaj:
public class Example extends ActionBarActivity {
// declared in onCreate() method
private android.support.v7.app.ActionBar actionBar;
private GestureDetectorCompat mDetector;
private YourView view1;
private YourView view2;
private YourView view3;
private YourView view4;
// some other code
class GestureListener extends GestureDetector.SimpleOnGestureListener {
private static final String DEBUG_TAG = "Gestures in Example Class";
@Override
public boolean onDoubleTap(MotionEvent event) {
Log.d(DEBUG_TAG, "onDoubleTap: " + event.toString());
// if there is a double tap, show the action bar
actionBar.show();
return true;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent event) {
Log.d(DEBUG_TAG, "onSingleTapConfirmed: " + event.toString());
// if the tap is below the action bar, hide the action bar
if (event.getRawY() > getResources().getDimension(R.dimen.abc_action_bar_default_height)) {
actionBar.hide();
return true;
}
return false;
}
@Override
public boolean onDown(MotionEvent event) {
return true;
}
} // end-of-Example Class
potem w moim onCreate()
Mam oświadczył mój GestureDetector
a także (opcjonalnie) Ustaw moją GestureListeners
:
private GestureDetectorCompat mDetector;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// some code here
mDetector = new GestureDetectorCompat(this, new GestureListener());
// this code is for more advanced view logic not needed for a basic set-up
//setGestureListeners();
} // end-of-method onCreate()
Następnie, aby rzeczywiście wysłać gesty do przetworzenia podajemy instrukcje, aby to zrobić, są dwa sposoby, o których wiem, najpierw najprostszy:
/**
* This method recognizes a touchEvent and passes it to your custom GestureListener
* class.
*/
@Override
public boolean onTouchEvent(MotionEvent event){
this.mDetector.onTouchEvent(event);
return super.onTouchEvent(event);
}
Drugi sposób jest bardziej złożony, ale jeśli chcesz rozpoznawać tylko zdarzenia dotykowe w niektórych układach View
s w swoim układzie, tak jak w przypadku nakładających się widoków i można uzyskać dostęp tylko do najwyższego poziomu View
, możesz utworzyć niestandardową klasę, aby przekazać wydarzenie wokół lub w górę:
class MyOnTouchListener implements View.OnTouchListener {
public boolean onTouch(View v, MotionEvent event) {
if (v.equals(view4)) {
return mDetector.onTouchEvent(event);
} else return false;
}
} // end-of-class MyOnTouchListener
a następnie użyć go tutaj:
public void setGestureListeners() {
/* when we return false for any of these onTouch methods
* it means that the the touchEvent is passed onto the next View.
* The order in which touchEvents are sent to are in the order they
* are declared.
*/
view1.setOnTouchListener(new MyOnTouchListener());
view2.setOnTouchListener(new MyOnTouchListener());
view3.setOnTouchListener(new MyOnTouchListener());
view4.setOnTouchListener(new MyOnTouchListener());
} // end-of-method setGestureListeners()
W mojej metody setGestureListeners
, dałem im wszystko ten sam zestaw poleceń, które w zasadzie tylko rozpoznaje touchEvents na view4
. W przeciwnym razie po prostu przechodzi touchEvent do następnego widoku.
To jest kod przy użyciu AppCompat
, ale jeśli nie budujesz dla starszych wersji, możesz użyć zwykłego GestureDetector
i ActionBar
.
Mogę również potwierdzić, że to się dzieje. Pluskwa? – dell116
zrobiłeś to jako usługę? –
Ja też. Nie mogę używać gestów w moim widoku wideo. –