اندروید انواع خاصی از رویدادهای صفحه لمسی مانند پینچ، دو بار ضربه زدن، اسکرول، فشار طولانی و فلنچ را ارائه می دهد. اینها همه به عنوان حرکات صفحه نمایش شناخته می شوند. اندروید کلاس GestureDetector را برای دریافت رویدادهای حرکتی ارائه میکند و به ما میگوید که این رویدادها با حرکات صفحه نمایش مطابقت دارد یا خیر.
برای استفاده از آن، باید یک شی از GestureDetector ایجاد کنید و سپس کلاس دیگری ایجاد کنید که از GestureDetector.SimpleOnGestureListener ارث بری کرده باشد تا به عنوان شنونده عمل کند و برخی از متد ها را override کند. به کدی های زیر دقت کنید:
GestureDetector myG; myG = new GestureDetector(this,new Gesture()); class Gesture extends GestureDetector.SimpleOnGestureListener{ public boolean onSingleTapUp(MotionEvent ev) { } public void onLongPress(MotionEvent ev) { } public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { } public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { } }
هندل کردن حرکت pinch
اندروید کلاس ScaleGestureDetector را برای کنترل حرکت های صفحه نمایش مانند pinch و غیره ارائه میکند. برای استفاده از آن، باید یک شی از این کلاس را نمونه سازی کنید. به کدهای زیر دقت کنید :
ScaleGestureDetector SGD; SGD = new ScaleGestureDetector(this,new ScaleListener());
پارامتر اول context و پارامتر دوم listener رویداد می باشد. ما باید listener رویداد را تعریف کنیم و تابع OnTouchEvent را override کنیم تا کار کند. به کدی های زیر دقت کنید :
public boolean onTouchEvent(MotionEvent ev) { SGD.onTouchEvent(ev); return true; } private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { @Override public boolean onScale(ScaleGestureDetector detector) { float scale = detector.getScaleFactor(); return true; } }
متد های دیگر حرکات صفحه نمایش
به غیر از حرکت pinch، متدهای دیگری نیز در دسترس هستند که اطلاعات بیشتری در مورد رویدادهای لمسی یا همان حرکات صفحه نمایش به شما اطلاع میدهند. این متد ها در پایین لیست شده اند:
متد و توضیحات | ردیف |
getEventTime()
این متد زمان رویدادی فعلی که در حال پردازش است را دریافت می کند. |
1 |
getFocusX()
این روش مختصات X نقطه کانونی حرکت فعلی را بدست می آورد. |
2 |
getFocusY()
این روش مختصات Y نقطه کانونی حرکت فعلی را بدست می آورد. |
3 |
getTimeDelta()
این روش اختلاف زمانی بین رویداد مقیاس پذیری قبلی و رویداد مقیاس بندی فعلی را بر حسب میلی ثانیه برمی گرداند. |
4 |
isInProgress()
اگر حرکت مقیاسی در حال انجام باشد، این متد مقدار true را برمیگرداند. |
5 |
onTouchEvent(MotionEvent event)
این روش MotionEvents را می پذیرد و در صورت لزوم رویدادها را ارسال می کند. |
6 |
مثال
در این مثال نحوه استفاده از کلاس ScaleGestureDetector را مورد بررسی قرار داده ایم. در این مثال ما یک برنامه کاربردی اساسی ایجاد می کنیم که به شما امکان می دهد از کوچکنمایی و بزرگنمایی کنید. برای آزمایش این مثال، میتوانید آن را روی یک دستگاه واقعی یا در یک شبیهساز با صفحه لمسی فعال اجرا کنید.
توضیحات | مرحله |
ابتدا یک پروژه جدید در اندروید استودیو با یک پکیج دلخواه ایجاد کنید. | 1 |
کدهای درون فایل MainActivity.class را مطابق کدهای که در پایین آورده ایم تغییر بدهید. | 2 |
کدهای درون فایل activity_main.xml را مطابق کدهای که در پایین آورده ایم تغییر بدهید. | 3 |
برنامه را بر روی یک تلفن واقعی یا شبیه ساز اجرا کنید و تست را انجام بدهید. | 4 |
کدهای فایل MainActivity.class
package com.foray.articlelib; import android.graphics.Matrix; import android.os.Bundle; import android.view.MotionEvent; import android.view.ScaleGestureDetector; import android.widget.ImageView; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private ImageView iv; private Matrix matrix = new Matrix(); private float scale = 1f; private ScaleGestureDetector SGD; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv = findViewById(R.id.imageView); SGD = new ScaleGestureDetector(this, new ScaleListener()); } public boolean onTouchEvent(MotionEvent ev) { SGD.onTouchEvent(ev); return true; } private class ScaleListener extends ScaleGestureDetector. SimpleOnScaleGestureListener { @Override public boolean onScale(ScaleGestureDetector detector) { scale *= detector.getScaleFactor(); scale = Math.max(0.1f, Math.min(scale, 5.0f)); matrix.setScale(scale, scale); iv.setImageMatrix(matrix); return true; } } }
کدهای فایل activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="16dp" tools:context=".MainActivity" > <TextView android:id="@+id/textview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:text="مثال حرکات صفحه نمایش" android:textSize="25dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="7Cloner.com" android:id="@+id/textView" android:textColor="@color/black" android:layout_below="@+id/textview" android:layout_centerHorizontal="true" android:textSize="25dp" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageView" android:src="@drawable/abc" android:scaleType="matrix" android:layout_below="@+id/textView" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" /> </RelativeLayout>
نتیجه اجرا :
بعد از اینکه پروژه را بر روی تلفن مورد نظرتان اجرا کردید, الان می توانید با دو انگشت اقدام به بزرگنمایی و کوچکنمایی تصاویر کنید. همان طور در بالا که مشاهده میکنید در این آموزش توانستیم با استفاده از رویداد های صفحه لمسی این کار را به خوبی انجام بدهیم.