如何在Android Wear中实现手势识别

12

你好,我正在寻找如何在Android Wear中检测手势,在Android中我使用了类似以下代码的一些代码,但在Android Wear中不起作用。有没有一种方法可以覆盖默认手势动作或仅识别它们?

我正在像谷歌开发者一样进行尝试: 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 问题已解决!请查看我的答案。

你能详细说明是什么出了问题吗?你的Activity内部没有接收到任何触摸事件吗? - gruszczy
确切地说,什么也收不到! - Smile2Life
2个回答

9

经过一天的努力,我终于让它起作用了。遗漏的部分是我必须禁用Swipe-To-Dismiss手势并将DismissOverlayView添加到我的布局中,步骤如下:

  1. 禁用Swipe-To-Dismiss手势,在styles.xml中添加AppTheme样式,并在主清单中将其用作应用程序样式

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" >
  1. Add DissmissOverlayView to your main layout

        <android.support.wearable.view.DismissOverlayView 
        android:id="@+id/dismiss_overlay"
        android:layout_height="match_parent"
        android:layout_width="match_parent"/>
    
  2. Use it in your activity like this to get gestures

        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);
        } 
        }
    

0

你检查过你的代码了吗?它运行良好。对于简单的操作,你可以使用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);
        }

谢谢,我正在做完全相同的事情,但是没有任何动作!我需要使用DimissOverlayView吗? - Smile2Life
奇怪,我已经尝试过了,而且没有使用DismissOverlayView也可以正常工作。请看这里https://developer.android.com/training/wearables/ui/exit.html#long-press 或者这里http://www.tinmith.net/wayne/blog/2014/10/android-wear-dismissoverlayview.htm。 - Michał Tajchert
明白了,我必须将windowSwipeToDismiss设置为false,我在新答案中提供了解决方案以帮助他人,谢谢你的链接很有帮助 :) - Smile2Life

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接