حرکات را لمس کنید

دسترسی به داده های خام از صفحه لمسی Glass با Android SDK امکان پذیر است.

با این حال، GDK یک آشکارساز ژست‌ها را ارائه می‌کند که به طور خودکار ژست‌های متداول در Glass، از جمله ضربه زدن، کشیدن انگشت و پیمایش را تشخیص می‌دهد.

علاوه بر این، حرکات ساده به صورت پیش‌فرض به رویدادهای D-pad ترجمه می‌شوند تا پردازش آسان بدون استفاده از آشکارساز حرکتی انجام شود.

تشخیص حرکات به عنوان رویدادهای کلیدی D-pad

به‌طور پیش‌فرض، سیستم Glass حرکات ساده را به رویدادهای کلیدی D-pad تبدیل می‌کند. این به شما امکان می دهد به رویدادهای onKeyDown() و onKeyUp() در فعالیت ها یا نماها گوش دهید تا حرکات زیر را به عنوان کلیدهای D-pad پردازش کنید:

  • ضربه بزنید به KEYCODE_DPAD_CENTER ترجمه می‌شود.
  • فشار دادن دکمه دوربین به KEYCODE_CAMERA ترجمه می شود.
  • تند کشیدن به پایین به KEYCODE_BACK ترجمه می‌شود.

قطعه زیر وقتی کاربران روی صفحه لمسی ضربه می زنند، تشخیص می دهد:

public class MyActivity extends Activity {
    ...
    @Override
    public boolean onKeyDown(int keycode, KeyEvent event) {
        if (keycode == KeyEvent.KEYCODE_DPAD_CENTER) {
            // user tapped touchpad, do something
            return true;
        }
        ...
        return super.onKeyDown(keycode, event);
    }
}

یک روش برای تشخیص ضربه‌ها روی نماها، پیاده‌سازی OnClickListener برای نما است. هنگامی که کاربران روی صفحه لمسی (ترجمه شده به عنوان کلیک دکمه مرکزی D-pad) با نمای متمرکز ضربه می زنند، نما می تواند رویداد را با OnClickListener مدیریت کند.

public final class MyActivity extends Activity implements OnClickListener {

    View cardView;

    @Override
    protected void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        cardView = new Card(this).setText("Tap to carry out an action").getView();
        // To receive touch events from the touchpad, the view should be focusable.
        cardView.setOnClickListener(this);
        cardView.setFocusable(true);
        cardView.setFocusableInTouchMode(true);
        setContentView(cardView);
    }

    @Override
    protected void onResume() {
        // To receive touch events from the touchpad, the view should have focus.
        cardView.requestFocus();
        super.onResume();
    }

    @Override
    public void onClick(View v) {
        // perform desired action
    }
}

تشخیص ژست ها با ژست ردیاب

ردیاب‌های اشاره به شما امکان می‌دهند ژست‌های ساده و همچنین حرکات پیچیده‌تر را شناسایی کنید، مانند مواردی که از چند انگشت استفاده می‌کنند یا از پیمایش استفاده می‌کنند. حرکات پیچیده کلید D-pad مربوطه ندارند.

GestureDetector رابط های شنونده ای را ارائه می دهد که می توانید آنها را برای اطلاع از یک Gesture پیاده سازی کنید.

تشخیص حرکات در سطح فعالیت

تشخیص ژست‌ها در سطح فعالیت زمانی مناسب است که برایتان مهم نیست که چه بخشی از رابط کاربری شما فوکوس دارد. برای مثال، اگر می‌خواهید وقتی کاربران روی صفحه لمسی ضربه می‌زنند، منویی را باز کنید، صرفنظر از اینکه چه نمایی فوکوس دارد، باید MotionEvent در داخل فعالیت مدیریت کنید.

مثال زیر:

  1. یک GestureDetector ایجاد می کند که شنوندگان را برای پردازش ژست های شناسایی شده پیاده سازی می کند.
  2. روش onGenericMotionEvent() فعالیت را نادیده می گیرد تا رویدادهای حرکتی را به متد onMotionEvent() آشکارساز ژست منتقل کند.

هنگامی که یک رویداد حرکتی رخ می دهد، سیستم آن را به آشکارساز اشاره می دهد. در صورت شناسایی، آشکارساز اشاره به شنونده مناسب برای پردازش رویداد اطلاع می دهد.

public class MainActivity extends Activity {
    private GestureDetector mGestureDetector;
    // ...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // ...
        mGestureDetector = createGestureDetector(this);
    }

    private GestureDetector createGestureDetector(Context context) {
    GestureDetector gestureDetector = new GestureDetector(context);
        //Create a base listener for generic gestures
        gestureDetector.setBaseListener( new GestureDetector.BaseListener() {
            @Override
            public boolean onGesture(Gesture gesture) {
                if (gesture == Gesture.TAP) {
                    // do something on tap
                    return true;
                } else if (gesture == Gesture.TWO_TAP) {
                    // do something on two finger tap
                    return true;
                } else if (gesture == Gesture.SWIPE_RIGHT) {
                    // do something on right (forward) swipe
                    return true;
                } else if (gesture == Gesture.SWIPE_LEFT) {
                    // do something on left (backwards) swipe
                    return true;
                }
                return false;
            }
        });
        gestureDetector.setFingerListener(new GestureDetector.FingerListener() {
            @Override
            public void onFingerCountChanged(int previousCount, int currentCount) {
              // do something on finger count changes
            }
        });
        gestureDetector.setScrollListener(new GestureDetector.ScrollListener() {
            @Override
            public boolean onScroll(float displacement, float delta, float velocity) {
                // do something on scrolling
            }
        });
        return gestureDetector;
    }

    /*
     * Send generic motion events to the gesture detector
     */
    @Override
    public boolean onGenericMotionEvent(MotionEvent event) {
        if (mGestureDetector != null) {
            return mGestureDetector.onMotionEvent(event);
        }
        return false;
    }
}

تشخیص حرکات در سطح دید

تشخیص ژست‌ها در سطح دید زمانی مناسب است که می‌خواهید بسته به اینکه چه نمایی فوکوس دارد، کارهای مختلفی انجام دهید.

مثال زیر:

  1. یک نمای سفارشی ایجاد می کند که متد dispatchGenericFocusedEvent() را لغو می کند. هنگامی که یک رویداد حرکتی رخ می دهد، این روش رویداد حرکت را به آشکارساز اشاره می دهد.
  2. نما را قابل فوکوس اعلام می کند تا زمانی که فوکوس دارد رویدادها را تشخیص دهد.
  3. یک GestureDetector ایجاد می کند که شنوندگان را برای پردازش ژست های شناسایی شده پیاده سازی می کند.

هنگامی که آشکارساز اشاره حرکتی را در حالی که نما در فوکوس است تشخیص می دهد، آشکارساز اشاره شنونده مناسب را صدا می کند.

/**
 * TextView that handles touchpad input (currently only TAP).
 */
public class TouchpadHandlingTextView extends TextView
        implements OnAttachStateChangeListener{

    private final GestureDetector mTouchDetector;

    public TouchpadHandlingTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mTouchDetector = createGestureDetector(context);
        // must set the view to be focusable
        setFocusable(true);
        setFocusableInTouchMode(true);
    }

    public TouchpadHandlingTextView(Context context) {
        this(context, null);
    }

    @Override
    public void onViewAttachedToWindow(View v) {
        requestFocus();
    }

    @Override
    public void onViewDetachedFromWindow(View v) {
    }

    /**
     * Pass a MotionEvent into the gesture detector
     */
    @Override
    public boolean dispatchGenericFocusedEvent(MotionEvent event) {
        if (isFocused()) {
            return mTouchDetector.onMotionEvent(event);
        }
        return super.dispatchGenericFocusedEvent(event);
    }

    /**
     * Create gesture detector that triggers onClickListener. Implement
     * onClickListener in your Activity and override
     * onClick() to handle the "tap" gesture.
     */
    private GestureDetector createGestureDetector(Context context) {
        GestureDetector gd = new GestureDetector(context);
        gd.setBaseListener(new GestureDetector.BaseListener() {

            @Override
            public boolean onGesture(Gesture gesture) {
                if (gesture == Gesture.TAP) {
                    return performClick();
                }
                return false;
            }
        });
        return gd;
    }
}