Как реализовать распознавание жестов при износе андроида
Привет, я ищу, как распознавать жесты в ношении android, в android я использую какой-то код, как это, но не работает в android wear.. есть ли способ переопределить действия жестов по умолчанию или просто распознать их
Я делаю так же, как разработчики Google:
https://www.youtube.com/watch?v=naf_WbtFAlY
http://youtu.be/sha_w3_5c2c?t=25m1s
Что-то не так с эмулятором? (я использую 32-разрядный эмулятор: emulator -avd AndroidWearXC -force-32bit
)
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
public class MainActivity extends Activity {
private GestureDetector mDetector;
private static String DEBUG_TAG="MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
@Override
public void onLongPress(MotionEvent event) {
Log.d(DEBUG_TAG, " onLongPress: " + event.toString());
}
@Override
public boolean onDown(MotionEvent event) {
Log.d(DEBUG_TAG," onDown: " + event.toString());
return true;
}
@Override
public boolean onFling(MotionEvent event1, MotionEvent event2,
float velocityX, float velocityY) {
Log.d(DEBUG_TAG, " onFling: " + event1.toString()+event2.toString());
return true;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
Log.d(DEBUG_TAG, " onScroll: " + e1.toString()+e2.toString());
return true;
}
@Override
public void onShowPress(MotionEvent event) {
Log.d(DEBUG_TAG, " onShowPress: " + event.toString());
}
@Override
public boolean onSingleTapUp(MotionEvent event) {
Log.d(DEBUG_TAG, " onSingleTapUp: " + event.toString());
return true;
}
@Override
public boolean onDoubleTap(MotionEvent event) {
Log.d(DEBUG_TAG, " onDoubleTap: " + event.toString());
return true;
}
@Override
public boolean onDoubleTapEvent(MotionEvent event) {
Log.d(DEBUG_TAG, " onDoubleTapEvent: " + event.toString());
return true;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent event) {
Log.d(DEBUG_TAG, " onSingleTapConfirmed: " + event.toString());
return true;
}
});
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
return mDetector.onTouchEvent(ev) || super.onTouchEvent(ev);
}
}
Я хочу прокручивать влево и вправо и прокручивать вверх и вниз жесты:
![enter image description here]()
Решено! проверьте мой ответ.
Ответы
Ответ 1
После того, как однажды я получил его на работу, потерянная часть заключалась в том, что я должен отключить жестов Swipe-To-Dismiss и добавить DismissOverlayView в мой макет, шаги:
- Отключить жестов "Проведите по экрану"
добавьте стиль AppTheme в свой стиль styles.xml и используйте его как стиль приложения в своем mainfest
styles.xml:
<style name="AppTheme" parent="Theme.DeviceDefault">
<item name="android:windowSwipeToDismiss">false</item>
</style>
AndroidManifest.xml:
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
-
Добавить DissmissOverlayView в ваш основной макет
<android.support.wearable.view.DismissOverlayView
android:id="@+id/dismiss_overlay"
android:layout_height="match_parent"
android:layout_width="match_parent"/>
-
Используйте его в своей деятельности, как это, чтобы получить жесты
public class WearActivity extends Activity {
private DismissOverlayView mDismissOverlay;
private GestureDetector mDetector;
public void onCreate(Bundle savedState) {
super.onCreate(savedState);
setContentView(R.layout.wear_activity);
// Obtain the DismissOverlayView element
mDismissOverlay = (DismissOverlayView) findViewById(R.id.dismiss_overlay);
mDismissOverlay.setIntroText(R.string.long_press_intro);
mDismissOverlay.showIntroIfNecessary();
// Configure a gesture detector
mDetector = new GestureDetector(this, new SimpleOnGestureListener() {
@Override
public void onLongPress(MotionEvent event) {
Log.d(DEBUG_TAG, " onLongPress: " + event.toString());
}
@Override
public boolean onDown(MotionEvent event) {
Log.d(DEBUG_TAG," onDown: " + event.toString());
return true;
}
@Override
public boolean onFling(MotionEvent event1, MotionEvent event2,
float velocityX, float velocityY) {
Log.d(DEBUG_TAG, " onFling: " + event1.toString()+event2.toString());
return true;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
Log.d(DEBUG_TAG, " onScroll: " + e1.toString()+e2.toString());
return true;
}
@Override
public void onShowPress(MotionEvent event) {
Log.d(DEBUG_TAG, " onShowPress: " + event.toString());
}
@Override
public boolean onSingleTapUp(MotionEvent event) {
Log.d(DEBUG_TAG, " onSingleTapUp: " + event.toString());
return true;
}
@Override
public boolean onDoubleTap(MotionEvent event) {
Log.d(DEBUG_TAG, " onDoubleTap: " + event.toString());
return true;
}
@Override
public boolean onDoubleTapEvent(MotionEvent event) {
Log.d(DEBUG_TAG, " onDoubleTapEvent: " + event.toString());
return true;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent event) {
Log.d(DEBUG_TAG, " onSingleTapConfirmed: " + event.toString());
return true;
}
});
}
// Capture long presses
@Override
public boolean onTouchEvent(MotionEvent ev) {
return mDetector.onTouchEvent(ev) || super.onTouchEvent(ev);
}
}
Ответ 2
Вы проверили свой код? Он работает нормально. Для простого действия есть SimpleOnGestureListener, который вы можете использовать для засеивания работы (он также работает на Android Wear):
GestureDetector mDetector;
mDetector = new GestureDetector(this, new SimpleOnGestureListener() {
//http://developer.android.com/reference/android/view/GestureDetector.SimpleOnGestureListener.html
//For example:
public void onLongPress(MotionEvent ev) {
//TODO handle your action
}
});
@Override
public boolean onTouchEvent(MotionEvent ev) {
return mDetector.onTouchEvent(ev) || super.onTouchEvent(ev);
}