http://vietjack.com/android/index.jsp Copyright © vietjack.com Drag Drop Android Drag/Drop Android Framework cho phép người dùng di chuyển liệu từ View sang View khác Layout sử dụng động tác kéo thả Như API 11, hoạt động kéo thả view view group hỗ trợ Framework bao gồm ba thành phần để hỗ trợ tính drag drop, là: & drop functionality − • Lớp DragEvent • Drag listeners: • Các phương thức lớp giúp đỡ Tiến trình Drag/Drop Android Về bản, tiến trình Drag/Drop có bước/trạng thái bản: • Trạng thái bắt đầu: − Sự kiện xuất bạn bắt đầu kéo item layout, ứng dụng bạn gọi phương thức startDrag() để nói cho hệ thống để bắt đầu Drag Các tham số bên startDrag() cung cấp liệu để kéo, cung cấp metadata cho liệu này, cung cấp hàm callback để vẽ drag shadow (có thể hiểu bóng kéo) Đầu tiên, hệ thống phản hồi việc gọi lại ứng dụng bạn để lấy drag shadow Sau đó, hiển thị drag shadow thiết bị Tiếp theo, hệ thống gửi kiện kéo (drag event) với kiểu action làACTION_DRAG_STARTED tới Listener đăng ký cho tất đối tượng View Layout Để tiếp tục nhận drag event, bao gồm drop event có, Listener phải trả true Nếu Listener trả false, khơng nhận drag event cho hành động tới hệ thống gửi drag event với kiểu action ACTION_DRAG_ENDED • Trạng thái tiếp tục: − Người dùng tiếp tục hoạt động kéo Hệ thống gửi action ACTION_DRAG_ANTERED theo sau ACTION_DRAG_LOCATION tới Listener đăng ký cho View Listener chọn để lọc bề mặt đối tượng View để phản hồi kiện phản hồi cách làm bật View http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Page 1 http://vietjack.com/android/index.jsp Copyright © vietjack.com Listener nhận action ACTION_DRAG_EXITED sau người dùng di chuyển drag shadow ngồi hộp giới hạn View • Trạng thái thả: − Người dùng thả item kéo bên hộp giới hạn View Hệ thống gửi tới Listener đối tượng View drag event với kiểu action ACTION_DROP • Trạng thái kết thúc: − Ngay sau ACTION_DROP, hệ thống gửi drag event với kiểu action ACTION_DRAG_ENDED để thông báo hoạt động kéo xong Lớp DragEvent Android Lớp DragEvent biểu diễn kiện gửi hệ thống thời điểm khác suốt tiến trình hoạt động kéo thả Lớp cung cấp số Hằng phương thức quan trọng để bạn sử dụng tiến trình Drag/Drop Hằng lớp DragEvent Bảng liệt kê tất số nguyên có sẵn lớp DragEvent: Stt Constants & Miêu tả ACTION_DRAG_STARTED Tín hiệu bắt đầu hoạt động kéo thả ACTION_DRAG_ENTERED Tín hiệu thơng báo cho View điểm kéo vào hộp giới hạn View ACTION_DRAG_LOCATION Đượ gửi tới View sau ACTION_DRAG_ENTERED drag shadow bên hộp giới hạn View ACTION_DRAG_EXITED Tín hiệu thông báo người dùng di chuyển drag shadow hộp giới hạn View http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Page 1 http://vietjack.com/android/index.jsp Copyright © vietjack.com ACTION_DROP Tín hiệu thơng báo cho View người dùng thả drag shadow, điểm kéo bên hộp giới hạn View ACTION_DRAG_ENDED Tín hiệu thơng báo cho View hoạt động kéo thả kết thúc Phương thức lớp DragEvent Dưới số phương thức quan trọng thường sử dụng lớp DragEvent: Stt Constants & Miêu tả int getAction() Kiểm tra giá trị action kiện ClipData getClipData() Trả đối tượng ClipData gửi tới hệ thống phần lời gọi tới startDrag() ClipDescription getClipDescription() Trả đối tượng ClipDescription chứa ClipData boolean getResult() Trả dấu hiệu kết hoạt động kéo thả float getX() Lấy tọa độ X điểm kéo float getY() Lấy tọa độ Y điểm kéo String toString() http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Page 1 http://vietjack.com/android/index.jsp Copyright © vietjack.com Trả biểu diễn chuỗi đối tượng DragEvent Drag Listener Android Nếu bạn muốn view bên Layout nên phản hồi kiện kéo, view bạn: triển khai View.OnDragListener thiết lập phương thức callback làonDragEvent(DragEvent) ) Khi hệ thống gọi phương thức Listener này, truyền tới chúng đối tượng DragEvent giải thích Bạn có Listener phương thức callback cho đối tượng View Nếu điều diễn ra, hệ thống gọi Listener sau hàm callback định nghĩa Listener trả true Sự kết hợp phương thức onDragEvent(DragEvent) View.OnDragListener tương tự kết hợp onTouchEvent() View.OnTouchListener sử dụng với kiện touch phiên Android cũ Bắt đầu kiện kéo Android Bạn bắt đầu việc tạo ClipData ClipData.Item cho liệu di chuyển Đối tượng ClipData cung cấp metadata mà lưu trữ đối tượngClipMiêu tả bên ClipData Với hoạt động kéo thả mà không biểu diễn di chuyển liệu, bạn sử dụng null thay đối tượng thực Tiếp đó, bạn kế thừa View.DragShadowBuilder để tạo drag shadow cho hoạt động kéo đơn giản bạn sử dụng View.DragShadowBuilder(View) để tạo drag shadow mặc định (cùng kích cỡ tham số View truyền cho nó), với điểm chạm drag shadow Ví dụ Ví dụ sau minh họa tính hoạt động Drag Drop đơn giản sử dụngView.setOnLongClickListener(), View.setOnTouchListener()vàView.OnDragEvent Listener() Bước Miêu tả Bạn sử dụng Android Studio IDE để tạo ứng dụng Android với tên làMy Application package com.example.saira_000.myapplication Trong tạo project này, đảm bảo Target SDK Compile With phiên Android SDK http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Page 1 http://vietjack.com/android/index.jsp Copyright © vietjack.com để sử dụng APIs cấp độ cao Sửa đổi src/MainActivity.java file thêm code để định nghĩa Listener phương thức callback cho logo image sử dụng ví dụ Sao chép hình abc.png res/drawable-* folder Bạn sử dụng hình ảnh có độ phân giải khác trường hợp bạn muốn cung cấp chúng cho thiết bị khác Sửa đổi res/layout/activity_main.xml để định nghĩa view mặc định cho logo image Chạy ứng dụng để chạy Android Emulator kiểm tra kết thay đổi thực hiên ứng dụng Sau nội dung Main Activity file sửa đổi: 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) http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Page 1 http://vietjack.com/android/index.jsp Copyright © vietjack.com 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; } } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } Sau nội dung res/layout/activity_main.xml file − > Sau nội dung res/values/strings.xml để định nghĩa hai − My Application Settings Sau nội dung mặc định AndroidManifest.xml − Chạy ứng dụng Android Giả sử bạn tạo AVD cài đặt Để chạy ứng dụng từ Android Studio, mở activity file nhấn biểu tượng Run từ công cụ − http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Page 1 http://vietjack.com/android/index.jsp Copyright © vietjack.com Bây giờ, thực long click hình logo bạn thấy hình logo di chuyển chút từ vị trí sau bạn long click giây, thời điểm bạn bắt đầu hoạt động kéo Bạn kéo quanh hình thả xuống vị trí http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Page 1 http://vietjack.com/android/index.jsp Copyright © vietjack.com http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Page 1 ...