Kéo lớp sự kiện .
Kéo người nghe .Các phương thức và lớp của trình trợ giúp .
Quy trình kéo / thả
Về cơ bản có bốn bước hoặc trạng thái trong quy trình kéo và thảBắt đầu - Sự kiện này xảy ra khi bạn bắt đầu kéo một mục trong bố cục, ứng dụng của bạn gọi phương thức startDrag () để yêu cầu hệ thống bắt đầu kéo. Các đối số bên trong phương thức startDrag () cung cấp dữ liệu được kéo, siêu dữ liệu cho dữ liệu này và một cuộc gọi lại để vẽ bóng kéo.
Hệ thống đầu tiên phản hồi bằng cách gọi lại ứng dụng của bạn để có được bóng đổ. Sau đó nó sẽ hiển thị bóng kéo trên thiết bị.
Tiếp theo, hệ thống sẽ gửi một sự kiện kéo với loại hành động ACTION_DRAG_STARTED tới người nghe sự kiện kéo đã đăng ký cho tất cả các đối tượng Xem trong bố cục hiện tại.
Để tiếp tục nhận sự kiện kéo, bao gồm một sự kiện thả có thể, trình xử lý sự kiện kéo phải trả về true , Nếu trình xử lý sự kiện kéo trả về false, thì nó sẽ không nhận các sự kiện kéo cho hoạt động hiện tại cho đến khi hệ thống gửi một sự kiện kéo với kiểu hành động ACTION_DRAG_ENDED.
Tiếp tục - Người dùng tiếp tục kéo. Hệ thống gửi hành động ACTION_DRAG_ENTERED theo sau bởi hành động ACTION_DRAG_LOCATION đến trình xử lý sự kiện kéo đã đăng ký cho Chế độ xem nơi kéo điểm vào. Người nghe có thể chọn thay đổi diện mạo của đối tượng Xem để phản hồi sự kiện hoặc có thể phản ứng bằng cách làm nổi bật Chế độ xem của đối tượng đó.
Trình xử lý sự kiện kéo nhận hành động ACTION_DRAG_EXITED sau khi người dùng đã di chuyển bóng kéo bên ngoài hộp giới hạn của Chế độ xem.
Đã bỏ - Người dùng thả mục đã kéo trong hộp giới hạn của Chế độ xem. Hệ thống sẽ gửi trình nghe của đối tượng View một sự kiện kéo với loại hành động ACTION_DROP.
Đã kết thúc - Ngay sau loại hành động ACTION_DROP, hệ thống sẽ gửi một sự kiện kéo với loại hành động ACTION_DRAG_ENDED để cho biết rằng thao tác kéo đã kết thúc.
Lớp DragEvent
Các DragEvent đại diện cho một sự kiện được gửi ra bởi hệ thống tại thời điểm khác nhau trong quá trình hoạt động kéo và thả. Lớp này cung cấp vài hằng số và các phương thức quan trọng mà chúng ta sử dụng trong quá trình kéo / thả.Hằng số
Sau đây là tất cả các hằng số nguyên có sẵn như là một phần của lớp DragEvent.| Sr.No. | Hằng số & Mô tả |
|---|---|
| 1 | ACTION_DRAG_STARTED Tín hiệu bắt đầu thao tác kéo và thả. |
| 2 | ACTION_DRAG_ENTERED Tín hiệu cho Chế độ xem mà điểm kéo đã nhập vào hộp giới hạn của Chế độ xem. |
| 3 | ACTION_DRAG_LOCATION Đã gửi đến Chế độ xem sau ACTION_DRAG_ENTERED nếu bóng kéo vẫn nằm trong hộp giới hạn của đối tượng Xem. |
| 4 | ACTION_DRAG_EXITED Tín hiệu mà người dùng đã di chuyển bóng kéo bên ngoài hộp giới hạn của Chế độ xem. |
| 5 | ACTION_DROP Tín hiệu cho Chế độ xem mà người dùng đã phát hành bóng kéo và điểm kéo nằm trong hộp giới hạn của Chế độ xem. |
| 6 | ACTION_DRAG_ENDED Tín hiệu cho Chế độ xem mà thao tác kéo và thả đã kết thúc. |
Sau đây là một vài phương thức quan trọng và được sử dụng thường xuyên nhất có sẵn như là một phần của lớp DragEvent.
| Sr.No. | Hằng số & Mô tả |
|---|---|
| 1 | int getAction () Kiểm tra giá trị hành động của sự kiện này .. |
| 2 | ClipData getClipData () Trả về đối tượng ClipData được gửi đến hệ thống như một phần của lời gọi tới startDrag (). |
| 3 | ClipDescription getClipDescription () Trả về đối tượng ClipDescription chứa trong ClipData. |
| 4 | boolean getResult () Trả về chỉ báo kết quả của hoạt động kéo và thả. |
| 5 | float getX () Lấy tọa độ X của điểm kéo. |
| 6 | float getY () Lấy tọa độ Y của điểm kéo. |
| 7 | Chuỗi toString () Trả về một biểu diễn chuỗi của đối tượng DragEvent này. |
Lắng nghe sự kiện kéo
Nếu bạn muốn bất kỳ chế độ xem nào của mình trong Bố cục phải phản hồi sự kiện Kéo thì chế độ xem của bạn hoặc triển khai View.OnDragListener hoặc thiết lập phương thức gọi lại onDragEvent (DragEvent) .
Khi hệ thống gọi phương thức hoặc trình lắng nghe, nó truyền cho họ một đối tượng DragEvent được giải thích ở trên. Bạn có thể có cả một người nghe và một phương thức gọi lại cho đối tượng View. Nếu điều này xảy ra, trước tiên hệ thống sẽ gọi người nghe và sau đó xác định gọi lại miễn là người nghe trả về true.
Sự kết hợp của phương thức onDragEvent (DragEvent) và View.OnDragListener tương tự với sự kết hợp của onTouchEvent () và View.OnTouchListener được sử dụng với các sự kiện cảm ứng trong các phiên bản Android cũ.
Tiếp theo, bạn có thể mở rộng View.DragShadowBuilder để tạo bóng kéo để kéo khung nhìn hoặc đơn giản là bạn có thể sử dụng View.DragShadowBuilder (View) để tạo bóng kéo mặc định có cùng kích thước với đối số View được truyền cho nó, với chạm điểm trung tâm trong bóng kéo.
Sự kết hợp của phương thức onDragEvent (DragEvent) và View.OnDragListener tương tự với sự kết hợp của onTouchEvent () và View.OnTouchListener được sử dụng với các sự kiện cảm ứng trong các phiên bản Android cũ.
Bắt đầu sự kiện kéo
Bạn bắt đầu với việc tạo ra một ClipData và ClipData.Item cho dữ liệu được di chuyển. Là một phần của đối tượng ClipData , cung cấp siêu dữ liệu được lưu trữ trong một đối tượng ClipDescription trong ClipData. Đối với thao tác kéo và thả không đại diện cho chuyển động dữ liệu, bạn có thể muốn sử dụng null thay vì một đối tượng thực tế.Tiếp theo, bạn có thể mở rộng View.DragShadowBuilder để tạo bóng kéo để kéo khung nhìn hoặc đơn giản là bạn có thể sử dụng View.DragShadowBuilder (View) để tạo bóng kéo mặc định có cùng kích thước với đối số View được truyền cho nó, với chạm điểm trung tâm trong bóng kéo.
Thí dụ
Ví dụ sau cho thấy chức năng của một Drag & Drop đơn giản bằng cách sử dụng View.setOnLongClickListener () , View.setOnTouchListener () và View.OnDragEventListener () .| Bậc thang | Sự miêu tả |
|---|---|
| 1 | Bạn sẽ sử dụng Android studio IDE để tạo ứng dụng Android và đặt tên làỨng dụng của tôi theo gói com.example.saira_000.myapplication . |
| 2 | Sửa đổi tệp src / MainActivity.java và thêm mã để xác định người nghe sự kiện cũng như phương thức gọi lại cho hình ảnh logo được sử dụng trong ví dụ. |
| 3 | Sao chép hình ảnh abc.png trong thư mục res / drawable- * . Bạn có thể sử dụng hình ảnh với độ phân giải khác nhau trong trường hợp bạn muốn cung cấp cho các thiết bị khác nhau. |
| 4 | Sửa đổi tệp XML bố trí res / layout / activity_main.xml để xác định chế độ xem mặc định của hình ảnh logo. |
| 5 | Chạy ứng dụng để khởi chạy trình giả lập Android và xác minh kết quả của các thay đổi được thực hiện trong ứng dụng. |
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; } } }); } }Sau đây sẽ là nội dung của tệp res / layout / activity_main.xml
Trong đoạn mã sau abc cho biết logo của tutorialspoint.com
<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>Sau đây sẽ là nội dung của res / values / strings.xml để xác định hai hằng số mới
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">My Application</string> </resources>Sau đây là nội dung mặc định của Android Manifest.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>Hãy thử chạy ứng dụng My Application của bạn . Tôi cho rằng bạn đã tạo AVD của mình trong khi thiết lập môi trường.
Để chạy ứng dụng từ Android Studio, mở một trong các tệp hoạt động của dự án của bạn và nhấp vào Chạy biểu tượng từ thanh công cụ.
Android studio cài đặt ứng dụng trên AVD của bạn và khởi động ứng dụng và nếu mọi thứ đều ổn với thiết lập và ứng dụng của bạn, ứng dụng sẽ hiển thị cửa sổ Trình mô phỏng sau
![]() |
| lập trình android |
Bây giờ hãy nhấp vào biểu tượng TutorialsPoint được hiển thị và bạn sẽ thấy rằng hình ảnh biểu tượng chuyển động sau một giây dài nhấp chuột từ vị trí của nó, đó là lúc bạn nên bắt đầu kéo hình ảnh.
Bạn có thể kéo nó xung quanh màn hình và thả nó vào một vị trí mới.
![]() |
| học android |


Không có nhận xét nào:
Đăng nhận xét