اندروید عملیات Swiping را به صورت پشتیبانی نمیکند و بخشی از آن را خود توسعه دهنده باید پیاده سازی کند. در ادامه چند کلاس اندروید بررسی خواهد شد.
با توجه به این که شاید زحمت زیادی برای پیاده سازی داشته باشید بهتر است ابتدا نگاهی به کتابخانهها داشته باشید؛ زیرا در بسیاری از موارد آنقدر نیازی به Customization نخواهید داشت.
View.OnTouchListener
این interface به شما اجازه خواهد داد تا نحوه لمس شدن گوشی customized کنید به عنوان مثال یک event ای را میخواهید به محض لمس یک view رخ دهد؛ در حالت عادی به عنوان مثال OnClick زمانی تابع فراخوانی میشود که کاربر انگشت خود را از روی view بردارد.
public class MyActivity extends Activity implements OnTouchListener { @Override public boolean onTouch(View view, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { viewSwitcher.swap(); return true; } return false; } }
ورودیها به تریتیب آن view ای است که کاربر لمس کرده و event که از کلاس MotionEvent است.
MotionEvent
اطلاعاتی درمورد مکان و نحوه لمس در خود دارد. به عنوان مثال با متد getAction() میتوان این را فهمید که کاربر چه عملیاتی انجام داده است. (شروع به لمس view کرده است یا دست خود را از برداشتهاست.)
با استفاده از متد toString() اطلاعات کامل هر MotionEvent به طور کامل نمایش داده خواهد شد.
OnTouchEvent
لازم به ذکر است خود کلاس Activity حاوی متدی به نام OnTouchEvent است. ساختار آن شبیه OnTouchListener است با این تفاوت که تنها MotionEvent در ورودی متد داده خواهد شد. میتوانید آن را در صورت نیاز پیاده سازی کنید.
GestureDetector.OnGestureListener
در OnTouchListener ما در مورد نحوه لمس کاربر بحث کردیم اما سخنی از Swiping نبود. یک راه این است که Swiping دلخواه خود را با استفاده از OnTouchListener پیاده سازی کنید و تمام پیاده سازی آن بر عهده توسعه دهنده است.
یک راه دیگر استفاده از OnGestureListenerاست که شامل متدهای زیر است و میتوان Override کرد. ابتدا Activity را از این interface، implements کرده و توابع زیر را پیادهسازی میکنیم:
public boolean onDown(MotionEvent event) public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) public void onLongPress(MotionEvent event) public boolean onScroll(MotionEvent event1, MotionEvent event2, float distanceX, float distance) public void onShowPress(MotionEvent event) public boolean onSingleTapUp(MotionEvent event)
متد | شرح |
OnDown | شروع به لمس کردن |
OnLongPress | برای مدتی نگه داشتن |
OnScroll | لمس کردن و کشیدن |
OnSingleTapUp | ضربه زدن Tap |
در تابع OnFling و OnScroll میتوان میزان شتاب یا سرعت لازم، جهت، اندازه کشیدهشدن و … را برای Swiping دلخواه در آن پیادهسازی نمود. دربخش بعدی بیشتر توضیح داده خواهد شد.
SimpleOnGestureListener
به وسیله این کلاس میتوان یک Listener تعریف کرد و همانطور که گفته شد customized کرد. یک نمونه پیاده سازی شده به صورت زیر میتواند باشد.
class GestureHelper extends SimpleOnGestureListener { @Override public boolean onFling(MotionEvent e1, MotionEvent e2,float velocityX, float velocityY) { // did the mouse move far enough, fast enough? boolean result = false; try { float diffY = e2.getY() - e1.getY(); float diffX = e2.getX() - e1.getX(); if (Math.abs(diffX) > Math.abs(diffY)) { if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) { if (diffX > 0) { onSwipeRight(); } else { onSwipeLeft(); } result = true; } } else if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) { if (diffY > 0) { onSwipeBottom(); } else { onSwipeTop(); } result = true; } } catch (Exception exception) { exception.printStackTrace(); } return result; } public void onSwipeRight() {} public void onSwipeLeft() {} public void onSwipeTop() {} public void onSwipeBottom(){} }
اولین ورودی یعنی e1 در واقع MotionEvent آغازین است که باعث فراخوانی تابع میشود. اما در ادامهی و در هنگام حرکت اطلاعات در e2 هستند. دو عدد بعدی هم سرعت طولی و عرضی است.
GestureDetector
برای اجرا کردن OnGestureListener و یا SimpleOnGestureListener باید آن را به صورت زیر Attach کنیم:
public class Name extends Activity implements OnTouchListener { private GestureDetector gesture; @Override protected void onCreate(Bundle savedInstanceState) { gesture = new GestureDetector(this, new GestureHelper()); } @Override public boolean onTouchEvent(View v, MotionEvent e) { return gesture.onTouchEvent(v, e); } }