کشیدن و رها کردن در برنامه نویسی اندروید

4 سال پیش

کشیدن و رها کردن در برنامه نویسی اندروید

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

فریم ورک کشیدن و رها کردن در برنامه نویسی اندروید (Drag and Drop) به کاربران این امکان را می دهد تا داده ها را از یک  View به View دیگر در طرح فعلی با استفاده از یک حرکت کشیدن و رها کردن گرافیکی انتقال دهند. از API 11 کشیدن و رها کردن نمایش بر روی سایر نمایش ها یا گروه های مشاهده پشتیبانی می شود. این فریم ورک شامل سه مولفه مهم برای پشتیبانی از قابلیت کشیدن و رها کردن است –

  • کلاس Drag event
  • Drag listeners
  • متد ها و کلاس های کمکی

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

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

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

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

در مرحله بعدی، سیستم یک رویداد کشیدن با نوع اقدام ACTION_DRAG_STARTED را برای شنوندگان ثبت شده رویداد کشیدن برای همه اشیا View مشاهده در طرح فعلی ارسال می کند.

 

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

 

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

 

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

 

Dropped: کاربر آیتم کشیده شده را رها می کند. این سیستم برای event listener یک رویداد دراگ با نوع عمل ACTION_DROP ارسال می کند.

 

Ended : درست بعد از نوع اقدام ACTION_DROP ، سیستم یک رویداد کشیدن را با نوع اقدام ACTION_DRAG_ENDED ارسال می کند تا نشان دهد که عملیات کشیدن تمام شده است.

 

کلاس DragEvent

DragEvent یک رویداد را نشان می دهد که توسط سیستم در زمان های مختلف و در طی یک عمل کشیدن و رها شدن توسط سیستم ارسال می شود. این کلاس تعداد ثابت و روشهای مهمی را ارائه می دهد که ما در طول فرآیند کشیدن و رها کردن استفاده می کنیم.

 

ثابت ها

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

۱-ACTION_DRAG_STARTED

سیگنال شروع عملیات کشیدن و رها کردن است.

۲-ACTION_DRAG_ENTERED

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

۳-ACTION_DRAG_LOCATION

اگر مسیر کشیدن هنوز در محدود کردن شی مشاهده باشد، پس از ACTION_DRAG_ENTERED به یک Viewارسال شد.

۴-ACTION_DRAG_EXITED

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

۵-ACTION_DROP

به یک View نشان می دهد که کاربر مسیر کشیدن را رها کرده است و نقطه کشیدن در محدود View است.

۶-ACTION_DRAG_ENDED

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

 

متدها

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

 ()int getAction

مقدار اکشن این رویداد را بررسی کنید .

()ClipData getClipData 

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

()ClipDescription getClipDescription 

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

()boolean getResult

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

()float getX 

مختصات X نقطه درگ را بدست می آورد.

()float getY

مختصات Y نقطه درگ را بدست می آورد.

()String toString

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

 

گوش کردن به Drag Event :

اگر می خواهید هر یک از View های شما در یک طرح بندی به رویداد Drag پاسخ دهد،آنگاه View شما متد های callback،View.OnDragListener یا (onDragEvent (DragEvent را پیاده سازی می کند. وقتی سیستم متد یا شنونده را فراخوانی می کند ، یک شی DragEvent که در بالا توضیح داده شد به آنها منتقل می شود. برای View object می توانید هم شنونده داشته باشید و هم روش پاسخگویی. اگر این اتفاق بیفتد ، سیستم ابتدا شنونده را فراخوانی می کند و سپس تا زمانی که شنونده مقدار true را برگرداند، کال بک تعریف شده را فراخوانی می کند.

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

شروع یک رویداد Drag

شما با ایجاد ClipData و ClipData.Item برای داده های منتقل شده شروع می کنید. به عنوان بخشی از شی ClipData ، فراداده هایی را که در یک شی ClipDescription درون ClipData ذخیره شده اند، تهیه کنید. برای یک عمل کشیدن و رها کردن که نمایانگر حرکت داده نیست ، ممکن است بخواهید از null به جای یک شی واقعی استفاده کنید.

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

مثال

مثال زیر عملکرد یک Drag & Drop ساده را با استفاده از ()View.setOnLongClickListener() ، View.setOnTouchListener و ()View.OnDragEventListener  نشان می دهد.

۱ شما برای ایجاد یک برنامه Android از Android studio IDE استفاده خواهید کرد و نام آن را به عنوان myapplication تحت یک بسته com.example.saira_000.myapplication قرار دهید.
۲ پرونده src / MainActivity.java را تغییر دهید و کد را برای تعریف شنوندگان رویداد و همچنین متد های کال بک برای تصویر لوگو استفاده شده در مثال اضافه کنید.
۳ تصویر abc.png را در پوشه های res / drawable- * کپی کنید. در صورتی که بخواهید تصاویر را برای دستگاه های مختلف تهیه کنید، می توانید از وضوح مختلف استفاده کنید.
۴ برای تعیین نمای پیش فرض تصاویر لوگو، طرح XML فایل res / layout / activity_main.xml را تغییر دهید.
۵ برنامه را اجرا کنید تا شبیه ساز اندروید را راه اندازی کرده و نتیجه تغییرات انجام شده در برنامه را بررسی کنید.

در زیر محتوای پرونده فعالیت اصلی تغییر یافته src / MainActivity.java است. این پرونده می تواند شامل هر یک از روشهای اساسی چرخه حیات باشد.

package com.example.saira_000.myapplication;

import android.app.Activity;

import android.content.ClipData;
import android.content.ClipDescription;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;

import android.view.DragEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;

import android.widget.ImageView;
import android.widget.RelativeLayout;


public class MainActivity extends Activity {
   ImageView img;
   String msg;
   private android.widget.RelativeLayout.LayoutParams layoutParams;
   
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      img=(ImageView)findViewById(R.id.imageView);
      
      img.setOnLongClickListener(new View.OnLongClickListener() {
         @Override
         public boolean onLongClick(View v) {
            ClipData.Item item = new ClipData.Item((CharSequence)v.getTag());
            String[] mimeTypes = {ClipDescription.MIMETYPE_TEXT_PLAIN};
            
            ClipData dragData = new ClipData(v.getTag().toString(),mimeTypes, item);
            View.DragShadowBuilder myShadow = new View.DragShadowBuilder(img);
            
            v.startDrag(dragData,myShadow,null,0);
            return true;
         }
      });
      
      img.setOnDragListener(new View.OnDragListener() {
         @Override
         public boolean onDrag(View v, DragEvent event) {
            switch(event.getAction()) {
               case DragEvent.ACTION_DRAG_STARTED:
               layoutParams = (RelativeLayout.LayoutParams)v.getLayoutParams();
               Log.d(msg, "Action is DragEvent.ACTION_DRAG_STARTED");
               
               // Do nothing
               break;
               
               case DragEvent.ACTION_DRAG_ENTERED:
               Log.d(msg, "Action is DragEvent.ACTION_DRAG_ENTERED");
               int x_cord = (int) event.getX();
               int y_cord = (int) event.getY();
               break;
               
               case DragEvent.ACTION_DRAG_EXITED :
               Log.d(msg, "Action is DragEvent.ACTION_DRAG_EXITED");
               x_cord = (int) event.getX();
               y_cord = (int) event.getY();
               layoutParams.leftMargin = x_cord;
               layoutParams.topMargin = y_cord;
               v.setLayoutParams(layoutParams);
               break;
               
               case DragEvent.ACTION_DRAG_LOCATION  :
               Log.d(msg, "Action is DragEvent.ACTION_DRAG_LOCATION");
               x_cord = (int) event.getX();
               y_cord = (int) event.getY();
               break;
               
               case DragEvent.ACTION_DRAG_ENDED   :
               Log.d(msg, "Action is DragEvent.ACTION_DRAG_ENDED");
               
               // Do nothing
               break;
               
               case DragEvent.ACTION_DROP:
               Log.d(msg, "ACTION_DROP event");
               
               // Do nothing
               break;
               default: break;
            }
            return true;
         }
      });
      
      img.setOnTouchListener(new View.OnTouchListener() {
         @Override
         public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
               ClipData data = ClipData.newPlainText("", "");
               View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(img);
               
               img.startDrag(data, shadowBuilder, img, 0);
               img.setVisibility(View.INVISIBLE);
               return true;
            } else {
               return false;
            }
         }
      });
   }
}

در زیر محتوای پرونده res / layout / 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:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   android:paddingBottom="@dimen/activity_vertical_margin" 
   tools:context=".MainActivity">
   
   <TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Drag and Drop Example"
      android:id="@+id/textView"
      android:layout_alignParentTop="true"
      android:layout_centerHorizontal="true"
      android:textSize="30dp" />
      
   <TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Tutorials Point"
      android:id="@+id/textView2"
      android:layout_below="@+id/textView"
      android:layout_centerHorizontal="true"
      android:textSize="30dp"
      android:textColor="#ff14be3c" />>
      
   <ImageView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/imageView"
      android:src="@drawable/abc"
      android:layout_below="@+id/textView2"
      android:layout_alignRight="@+id/textView2"
      android:layout_alignEnd="@+id/textView2"
      android:layout_alignLeft="@+id/textView2"
      android:layout_alignStart="@+id/textView2" />

</RelativeLayout>

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

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <string name="app_name">My Application</string>
</resources>

در زیر محتوای پیش فرض AndroidManifest.xml آمده است –

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.saira_000.myapplication" >
      
   <application
      android:allowBackup="true"
      android:icon="@drawable/ic_launcher"
      android:label="@string/app_name"
      android:theme="@style/AppTheme" >
      
      <activity
         android:name=".MainActivity"
         android:label="@string/app_name" >
      
         <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
         </intent-filter>
      
      </activity>
      
   </application>
</manifest>

بیایید  برنامه خود را اجرا کنیم! من تصور می کنم شما AVD خود را هنگام راه اندازی محیط ایجاد کرده اید. برای اجرای برنامه از Android studio، یکی از پرونده های فعالیت پروژه خود را باز کنید و از نوار ابزار روی Android StudioRun Icon کلیک کنید. Android Studio برنامه را روی AVD شما نصب کرده و شروع به کار می کند و اگر با تنظیمات و برنامه هایتان همه چیز خوب باشد، زیر پنجره شبیه ساز نمایش داده می شود.

 

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

منبع.

لیست جلسات قبل آموزش برنامه نویسی اندروید

  1. نگاهی کلی به برنامه نویسی اندروید
  2. تنظیمات محیط  در برنامه نویسی اندروید
  3. معماری برنامه نویسی اندروید
  4. اجزای برنامه در برنامه نویسی اندروید
  5. Hello World در برنامه نویسی اندروید
  6. سازماندهی و دسترسی به منابع در برنامه نویسی اندروید
  7. فعالیت در برنامه نویسی اندروید
  8. سرویس در برنامه نویسی اندروید
  9. گیرنده های پخش در برنامه نویسی اندروید
  10. ارائه دهنده محتوا در برنامه نویسی اندروید
  11. قطعات در برنامه نویسی اندروید
  12. Intent و فیلتر در برنامه نویسی اندروید
  13. طرح بندی رابط کاربری در برنامه نویسی اندروید
  14. کنترل های رابط کاربری در برنامه نویسی اندروید
  15. مدیریت رویدادها در برنامه نویسی اندروید
  16. استایل و تم ها در برنامه نویسی اندروید
  17. اجزای سفارشی در برنامه نویسی اندروید

 

 

0
برچسب ها :
نویسنده مطلب erfan molaei

دیدگاه شما

بدون دیدگاه