Thứ Năm, 16 tháng 8, 2018

Android - Kéo và thả

Khung kéo / thả của lập trình Android cho phép người dùng di chuyển dữ liệu từ Chế độ xem này sang Chế độ xem khác trong bố cục hiện tại bằng cách sử dụng cử chỉ kéo và thả đồ họa. Khi API 11 kéo và thả chế độ xem vào các chế độ xem khác hoặc xem các nhóm được hỗ trợ. Khung công tác bao gồm ba thành phần quan trọng sau đây để hỗ trợ chức năng kéo và thả

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ả
1ACTION_DRAG_STARTED

Tín hiệu bắt đầu thao tác kéo và thả.
2ACTION_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.
3ACTION_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.
4ACTION_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.
5ACTION_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.
6ACTION_DRAG_ENDED

Tín hiệu cho Chế độ xem mà thao tác kéo và thả đã kết thúc.
Phương pháp

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ả
1int getAction ()

Kiểm tra giá trị hành động của sự kiện này ..
2ClipData 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 ().
3ClipDescription getClipDescription ()

Trả về đối tượng ClipDescription chứa trong ClipData.
4boolean getResult ()

Trả về chỉ báo kết quả của hoạt động kéo và thả.
5float getX ()

Lấy tọa độ X của điểm kéo.
6float getY ()

Lấy tọa độ Y của điểm kéo.
7Chuỗ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ũ.

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 thangSự miêu tả
1Bạ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 .
2Sử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ụ.
3Sao 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.
4Sử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.
5Chạ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.
Sau đây là nội dung của tệp hoạt động chính đã sửa đổi src / MainActivity.java . Tệp này có thể bao gồm từng phương thức vòng đời cơ bản.
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

Lập trình Android - RenderScript

Trong chương này, chúng ta sẽ tìm hiểu về Android RenderScript. Thông thường các ứng dụng trên Android được thiết kế để tiêu thụ tài nguyên ...