سلام کاربران عزیز ، امیدوارم که حال شما خوب باشه و با اموزشهای ما همراه بمانید.با اموزش این بخش که درمورد کشیدن و رها کردن در اندروید (Android Drag and Drop ) درخدمت شما هستم.

فریم ورک کشیدن و رها کردن در اندروید این امکان را برای کاربران فراهم می کند که در layout فعلی، با استفاده از حالت کشیدن و رها کردن گرافیکی، داده را از یک View به View دیگر منتقل کنند. فریم ورک شامل سه مولفه اصلی زیر برای پشتیبانی از قابلیت کشیدن و رها کردن است.

کلاس رویداد کشیدن

شنودکنندگان عمل کشیدن

متدها و کلاس های کمکی

فرایند کشیدن و رها کردن

اساسا ۴ مرحله یا وضعیت در فرایند کشیدن و رها کردن وجود دارد .

Started این رویداد زمانی اتفاق می افتد که شما شروع به کشیدن یک آیتم در صفحه می کنید و اپلیکیشن شما متد startDrag() را برای اعلام آغاز عملیات drag به سیستم، فراخوانی می کند. آرگومان های موجود در متد startDrag() داده هایی که باید drag شود، فراداده­ی مربوط به این داده ها، و یک callback برای ترسیم مسیر drag را فراخوانی می کنند.

سیستم ابتدا با فراخوانی اپلیکیشن شما برای گرفتن مسیر drag به رویداد پاسخ می دهد، سپس مسیر drag را بر روی دستگاه نمایش می دهد.

پس از آن سیستم یک رویداد drag با نوع عمل ACTION_DRAG_STARTED را به شنود کننده رویداد ثبت شده برای تمام اشیا View در Layout فعلی می فرستد.

برای ادامه دریافت رویدادهای drag، از جمله یک رویداد امکان پذیرِ drop، شنود کننده باید مقدار true را برگرداند. اگر شنودکننده رویداد drag مقدار false را برگرداند، دیگر رویداد های drag عملیات فعلی را دریافت نمی کند، تا زمانیکه سیستم یک رویداد drag را با نوع عمل ACTION_DRAG_ENDED انتخاب کند.

Continuing کاربر به عمل drag ادامه می دهد. سیستم عمل ACTION_DRAG_ENTERED و به دنبال آن عمل ACTION_DRAG_LOCATION را به شنود کننده رویداد ثبت شده برای view ای که نقطه drag کردن از آن آغاز میشود، ارسال میکند. شنود کننده می تواند انتخاب کند که ظاهر اشیا view خود را در پاسخ به رویداد تغییر دهد یا می تواند با های لایت کردن view مربوطه، به رویداد واکنش نشان دهد.

شنود کننده رویداد drag یک عمل ACTION_DRAG_EXITED را بعد از اینکه کاربر مسیر drag را از محدوده View خارج کرد، دریافت می کند.

Dropped کاربر آیتم کشیده شده را رها می کند. سیستم به شنود کننده شی view یک رویداد drag را با نوع عمل ACTION_DROP می فرستد.

Ended درست پس از نوع عمل ACTION_DROP، سیستم برای نشان دادن پایان عملیات drag، یک رویداد drag را با نوع عمل ACTION_DRAG_ENDED می فرستد.
کلاس DragEvent

DragEvent نشان دهنده رویدادی است که به وسیله سیستم در زمان های مختلف در طول عملیات drag و drop ارسال میشود. این کلاس دارای تعدادی ثابت و متد مهم است که در طول عملیات drag و drop مورد استفاده قرار می گیرند.

ثوابت

در بخش زیر تمام ثابت های صحیحی که به عنوان بخشی از کلاس DragEvent موجود هستند لیست شده اند.

شماره

ثوابت و توصیف آنها

۱

ACTION_DRAG_STARTED

سیگنال های مبنی بر آغاز عملیات drag و drop

۲

ACTION_DRAG_ENTERED

سیگنالی به یک View مبنی بر اینکه، نقطه drag کردن وارد محدوده view شده است.

۳

ACTION_DRAG_LOCATION

بعد از عمل ACTION_DRAG_ENTERED به یک view فرستاده می شود، اگر مسیر drag کردن هنوز در محدوده اشیا view باشد.

۴

ACTION_DRAG_EXITED

سیگنالی مبنی بر اینکه کاربر مسیر drag را به خارج از محدوده View منتقل کرده است.

۵

ACTION_DROP

سیگنالی که به یک view فرستاده میشود مبنی بر اینکه کاربر مسیر drag کردن را رها کرده است و نقطه drag در محدوده View قرار دارد.

۶

ACTION_DRAG_ENDED

سیگنالی به یک View مبنی بر اینکه عملیات drag و drop به پایان رسیده اند.

متدها

در بخش زیر مهمترین و پر استفاده ترین متدهای موجود در کلاس DragEvent ارائه شده اند.

شماره

متدها و توصیف

۱

int getAction()

مقدار avtion رویداد مربوطه را بررسی می کند.

۲

ClipData getClipData()

شی ClipData ارسال شده به سیستم را به عنوان بخشی از فراخوانی به startDrag() برمی گرداند.

۳

ClipDescription getClipDescription()

شی ClipDescription موجود در ClipData را برمی گرداند.

۴

boolean getResult()

نشانه ای از نتیجه عملیات drag و drop را برمی گرداند.

۵

float getX()

مختصات X نقطه drag کردن را می گیرد.

۶

float getY()

مختصات Y نقطه drag کردن را می گیرد.

۷

String toString()

نمایش رشته ای شی DragEvent را بر می گرداند.

گوش دادن به رویداد Drag

اگر شما بخواهید که هر کدام از View های شما در داخل یک Layout به رویداد drag پاسخ بدهد، آنگاه View شما متدهای callback، View.OnDragListener یا onDragEvent(DragEvent) را پیاده سازی می کند. زمانی که سیستم متد یا شنود کننده را فراخوانی می کند، یک شی DragEvent که در بالا توصیف شد را به آنها بر می گرداند. شما می توانید هر دو مورد شنود کننده و متد callback را برای شی View داشته باشید. در این صورت سیستم ابتدا شنود کننده را فراخوانی می کند و سپس تا زمانی که شنود کننده مقدار صحیح را برگرداند، callback تعریف شده را فراخوانی می کند.

ترکیب متد nDragEvent(DragEvent) و View.OnDragListener شبیه به ترکیبی از onTouchEvent() و View.OnTouchListener به کار رفته در مورد رویدادهای لمسی در نسخه های قدیمی اندروید است.

آغاز کردن یک رویداد Drag

شما کار را با ایجاد یک ClipData و ClipData.Item برای داده های منتقل شده آغاز می کنید. این آیتم به عنوان بخشی از شی ClipData، فراداده ای را عرضه می کند که در شی ClipDescription درون ClipData ذخیره میشود. برای عملیات drag و drop ای که شامل انتقال داده نیست، می توانید به جای شی واقعی از null استفاده کنید.

سپس شما می توانید یا View.DragShadowBuilder را برای ایجاد یک مسیر drag کردن برای کشیدن View آغاز کنید و یا به سادگی از View.DragShadowBuilder(View) برای ایجاد مسیر پیش فرض drag کردن استفاده کنید که همان سایز آرگومان های View ارسالی به آن، به مرکزیت نقطه لمس کردن در مسیر drag است.

مثال

مثال زیر عملکرد یک عملیات ساده drag و drop را با استفاده از شنود کننده رویداد View.setOnLongClickListener() همراه با View.OnDragEventListener() نشان می دهد.

مرحله

توصیف

۱

از Eclipse IDE برای ایجاد یک اپلیکیشن اندرویدی استفاده کنید و آن را تحت پکیج com.example.dragndropdemo، DragNDropDemo بنامید. در حالیکه این پروژه را ایجاد می کنید برای استفاده از سطوح بالاتر API ها، از آخرین نسخه Target SDK و Compile With اطمینان حاصل کنید.

۲

فایل src/MainActivity.java را تغییر دهید و کدهایی را برای تعریف شنودکنندگان رویداد و همچنین متدهای call back مربوط به تصویر لوگوی به کار رفته در مثال، اضافه کنید.

۳

تصویر logo.png را در پوشه res/drawable-* کپی کنید. در صورتی که می خواهید تصاویر را برای دستگاه های مختلف به کار ببرید، می توانید از تصاویری با وضوح مختلف استفاده کنید.

۴

فایل صفحه بندی XML res/layout/activity_main.xml را برای تعریف view پیش فرض تصویر لوگو تغییر دهید.

۵

برای راه اندازی امولاتور اندروید اپلیکیشن را اجرا کنید و نتایج تغییرات اعمال شده در اپلیکیشن را بررسی کنید.

در بخش زیر محتوای تعییر یافته­ ی فایل فعالیت اصلی

src/com.example.dragndropdemo/MainActivity.java ارائه شده است. این فایل می تواند شامل هر کدام از متدهای چرخه­ ی حیات اصلی باشد.

بخش زیر محتوای فایل res/layout/activity_main.xml است.

بخش زیر محتوای فایل res/values/strings.xml برای تعریف دو ثابت جدید است.

بخش زیر محتوای فایل AndroidManifest.xml است.

اکنون می خواهیم اپلیکیشن DragNDropDemo را اجرا کنیم. من فرض می­کنم که شما AVD خود را در زمان نصب محیط ایجاد کرده باشید. برای اجرای اپلیکیشن از Eclipse، یکی از فایل های فعالیت پروژه­ی خود را باز کنید و بر روی آیکن Run از نوار ابزار کلیک کنید. Eclipse، اپلیکیش را بر روی AVD شما نصب می کند و آن را آغاز می کند، و در صورتی که همه­ی موارد مربوط به تنظیمات و برنامه شما درست باشد، صفحه امولاتور زیر برای شما نمایش داده می شود.

اکنون به مدت طولانی بر روی لوگوی اندروید کلیک کنید، شما می بینید که لوگو بعد از ۱ ثانیه کلیک کردن کمی از جای خود جابجا می شود. اینجا زمانی است که شما باید شروع به کشیدن (drag کردن) تصویر کنید. شما می توانید آن را بر وری صفحه بکشید و در مکانی جدید رها کنید.