پایگاه دانش مایکت

View Categories

جسچرها و حرکات لمسی در اندروید

اندروید عملیات 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 به طور کامل نمایش داده خواهد شد.

توجه: در اندرویدهای مختلف بعضی این توابع deprecate شده اند.

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 دلخواه در آن پیاده‎سازی نمود. دربخش بعدی بیشتر توضیح داده خواهد شد.

توجه: تا زمانی که به یک GestureDetector الصاق (Attach) نشده باشد کدی اجرا نخواهد شد.

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 الصاق (Attach) نشده باشد کدی اجرا نخواهد شد.

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