Android-드래그 앤 드롭
Android 드래그 / 드롭 프레임 워크를 통해 사용자는 그래픽 드래그 앤 드롭 제스처를 사용하여 현재 레이아웃의 한보기에서 다른보기로 데이터를 이동할 수 있습니다. 현재API 11 다른 뷰 또는 뷰 그룹으로의 뷰 드래그 앤 드롭이 지원됩니다. 프레임 워크에는 드래그 앤 드롭 기능을 지원하기 위해 다음 세 가지 중요한 구성 요소가 포함됩니다.
Drag event class.
Drag listeners.
Helper methods and classes.
드래그 / 드롭 프로세스
드래그 앤 드롭 프로세스에는 기본적으로 4 단계 또는 상태가 있습니다.
Started −이 이벤트는 레이아웃에서 항목을 드래그하기 시작할 때 발생하며, 애플리케이션은 startDrag () 메서드를 호출 하여 시스템에 드래그를 시작하도록 지시합니다. startDrag () 메서드 내부의 인수는 드래그 할 데이터,이 데이터에 대한 메타 데이터 및 드래그 섀도우를 그리기위한 콜백을 제공합니다.
시스템은 먼저 드래그 섀도우를 얻기 위해 애플리케이션을 다시 호출하여 응답합니다. 그런 다음 장치에 드래그 섀도우를 표시합니다.
다음으로, 시스템은 ACTION_DRAG_STARTED 액션 유형의 드래그 이벤트를 현재 레이아웃의 모든 View 객체에 대해 등록 된 드래그 이벤트 리스너로 보냅니다 .
가능한 드롭 이벤트를 포함하여 드래그 이벤트를 계속 수신하려면 드래그 이벤트 리스너가 true, 드래그 이벤트 리스너가 false를 반환하면 시스템이 작업 유형이 ACTION_DRAG_ENDED 인 드래그 이벤트를 보낼 때까지 현재 작업에 대한 드래그 이벤트를 수신하지 않습니다.
Continuing− 사용자가 드래그를 계속합니다. 시스템은 드래그 포인트가 들어가는 뷰의 등록 된 드래그 이벤트 리스너에 ACTION_DRAG_ENTERED 액션 다음에 ACTION_DRAG_LOCATION 액션을 보냅니다. 리스너는 이벤트에 대한 응답으로 View 객체의 모양을 변경하거나 View를 강조 표시하여 반응 할 수 있습니다.
드래그 이벤트 리스너는 사용자가 뷰의 경계 상자 밖으로 드래그 섀도우를 이동 한 후 ACTION_DRAG_EXITED 작업을받습니다.
Dropped− 사용자가 뷰의 경계 상자 내에서 드래그 된 항목을 해제합니다. 시스템은 뷰 객체의 리스너에게 액션 유형이 ACTION_DROP 인 드래그 이벤트를 보냅니다.
Ended − ACTION_DROP 액션 유형 직후 시스템은 드래그 작업이 끝났음을 나타 내기 위해 액션 유형 ACTION_DRAG_ENDED와 함께 드래그 이벤트를 보냅니다.
DragEvent 클래스
그만큼 DragEvent끌어서 놓기 작업 중 다양한 시간에 시스템에서 보내는 이벤트를 나타냅니다. 이 클래스는 Drag / Drop 과정에서 사용하는 몇 가지 상수와 중요한 메서드를 제공합니다.
상수
다음은 DragEvent 클래스의 일부로 사용할 수있는 모든 상수 정수입니다.
Sr. 아니. | 상수 및 설명 |
---|---|
1 |
ACTION_DRAG_STARTED 끌어서 놓기 작업의 시작을 알립니다. |
2 |
ACTION_DRAG_ENTERED 드래그 포인트가 뷰의 경계 상자에 들어 갔음을 뷰에 알립니다. |
삼 | ACTION_DRAG_LOCATION 드래그 섀도우가 여전히 View 개체의 경계 상자 내에있는 경우 ACTION_DRAG_ENTERED 이후에 View로 전송됩니다. |
4 | ACTION_DRAG_EXITED 사용자가 뷰의 경계 상자 밖으로 드래그 섀도우를 이동했음을 나타냅니다. |
5 | ACTION_DROP 사용자가 드래그 섀도우를 놓았으며 드래그 포인트가 뷰의 경계 상자 내에 있음을 View에 알립니다. |
6 |
ACTION_DRAG_ENDED 끌어서 놓기 작업이 완료되었음을 View에 알립니다. |
행동 양식
다음은 DragEvent 클래스의 일부로 사용할 수있는 중요하고 가장 자주 사용되는 몇 가지 메서드입니다.
Sr. 아니. | 상수 및 설명 |
---|---|
1 | int getAction() 이 이벤트의 작업 값을 검사합니다 .. |
2 | ClipData getClipData() startDrag () 호출의 일부로 시스템에 전송 된 ClipData 객체를 반환합니다. |
삼 |
ClipDescription getClipDescription() ClipData에 포함 된 ClipDescription 개체를 반환합니다. |
4 |
boolean getResult() 끌어서 놓기 작업의 결과 표시를 반환합니다. |
5 |
float getX() 끌기 지점의 X 좌표를 가져옵니다. |
6 | float getY() 끌기 지점의 Y 좌표를 가져옵니다. |
7 | String toString() 이 DragEvent 객체의 문자열 표현을 리턴합니다. |
드래그 이벤트 수신
레이아웃 내의 뷰가 드래그 이벤트에 응답해야한다면 뷰는 View.OnDragListener 또는 설정 onDragEvent(DragEvent)콜백 메서드. 시스템이 메서드 또는 리스너를 호출하면 위에서 설명한 DragEvent 객체를 전달합니다. View 객체에 대한 리스너와 콜백 메서드를 모두 가질 수 있습니다. 이 경우 시스템은 먼저 리스너를 호출 한 다음 리스너가 true를 반환하는 한 콜백을 정의합니다.
의 조합 onDragEvent (있는 DragEvent) 방법 및 View.OnDragListener은 의 조합과 유사onTouchEvent() 과 View.OnTouchListener Android 이전 버전의 터치 이벤트와 함께 사용되었습니다.
드래그 이벤트 시작
당신은 ClipData 과 ClipData.Item이동중인 데이터에 대해 ClipData 개체의 일부로ClipDescriptionClipData 내의 개체. 데이터 이동을 나타내지 않는 끌어서 놓기 작업의 경우 다음을 사용할 수 있습니다.null 실제 개체 대신.
다음으로 확장 할 수 있습니다. View.DragShadowBuilder뷰를 드래그하기위한 드래그 섀도우를 만들거나 View.DragShadowBuilder (View) 를 사용하여 전달 된 View 인수와 동일한 크기의 기본 드래그 섀도우를 만들 수 있습니다 .
예
다음 예는 다음을 사용하여 간단한 드래그 앤 드롭의 기능을 보여줍니다. View.setOnLongClickListener(), View.setOnTouchListener()과 View.OnDragEventListener().
단계 | 기술 |
---|---|
1 | Android 스튜디오 IDE를 사용하여 Android 애플리케이션을 만들고 com.example.saira_000.myapplication 패키지 아래에서 My Application 으로 이름을 지정합니다 . |
2 | src / MainActivity.java 파일을 수정 하고 이벤트 리스너를 정의하는 코드와 예제에 사용 된 로고 이미지에 대한 콜백 메소드를 추가하십시오. |
삼 | res / drawable- * 폴더 에 이미지 abc.png를 복사합니다 . 다른 장치에 제공하려는 경우 다른 해상도의 이미지를 사용할 수 있습니다. |
4 | 레이아웃 XML 파일 res / layout / activity_main.xml 을 수정 하여 로고 이미지의 기본보기를 정의하십시오. |
5 | 애플리케이션을 실행하여 Android 에뮬레이터를 시작하고 애플리케이션에서 수행 한 변경 결과를 확인합니다. |
다음은 수정 된 주요 활동 파일의 내용입니다. 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 파일-
다음 코드에서 abc는 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>
다음 내용은 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>
당신의 My Application신청. 나는 당신이 당신의AVD환경 설정을하는 동안. Android Studio에서 앱을 실행하려면 프로젝트의 활동 파일 중 하나를 열고
이제 표시된 TutorialsPoint 로고를 길게 클릭하면 로고 이미지가 그 자리에서 1 초 동안 길게 클릭 한 후 약간 이동하는 것을 볼 수 있습니다. 이때 이미지 드래그를 시작해야합니다. 화면 주위로 끌어서 새 위치에 놓을 수 있습니다.