拖放示例演示
以下示例显示使用View.setOnLongClickListener(),View.setOnTouchListener()和View.OnDragEventListener()进行简单拖放的功能。
- 您将使用Android Studio IDE创建一个Android应用程序,并在com.example.demo包下将其命名为Demo。
- 修改src/MainActivity.java文件并添加代码以定义事件侦听器,以及示例中使用的徽标图像的回调方法。
- 将图像logo.png复制到res/drawable-*文件夹中。如果要为不同的设备提供图像,则可以使用不同分辨率的图像。
- 修改布局XML文件res/layout / activity_main.xml来定义徽标图像的默认视图。
- 运行该应用程序以启动Android模拟器并验证在该应用程序中所做更改的结果。
以下是修改后的主要活动文件src/com.jc2182.demo/MainActivity.java的内容。该文件可以包括每个基本生命周期方法。
package com.jc2182.demo;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ClipData;
import android.content.ClipDescription;
import android.os.Bundle;
import android.util.Log;
import android.view.DragEvent;
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() {
@SuppressLint("NewApi")
@Override
public boolean onDrag(View v, DragEvent event) {
switch(event.getAction()) {
case DragEvent.ACTION_DRAG_STARTED:
layoutParams = (RelativeLayout.LayoutParams)v.getLayoutParams();
Log.d(msg, "操作是:: DragEvent.ACTION_DRAG_STARTED");
// Do nothing
return true;
case DragEvent.ACTION_DRAG_ENTERED:
Log.d(msg, "操作是:: DragEvent.ACTION_DRAG_ENTERED");
int x_cord = (int) event.getX();
int y_cord = (int) event.getY();
return true;
case DragEvent.ACTION_DRAG_EXITED :
Log.d(msg, "操作是:: 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);
return true;
case DragEvent.ACTION_DRAG_LOCATION :
Log.d(msg, "操作是:: DragEvent.ACTION_DRAG_LOCATION");
x_cord = (int) event.getX();
y_cord = (int) event.getY();
return true;
case DragEvent.ACTION_DRAG_ENDED :
img.setVisibility(View.VISIBLE);
Log.d(msg, "操作是:: DragEvent.ACTION_DRAG_ENDED");
// Do nothing
return true;
case DragEvent.ACTION_DROP:
x_cord = (int) event.getX();
y_cord = (int) event.getY();
layoutParams.leftMargin = x_cord;
layoutParams.topMargin = y_cord;
img.setLayoutParams(layoutParams);
Log.d(msg, "ACTION_DROP 事件");
return true;
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"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="50dp"
android:text="拖放示例"
android:textSize="30dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="蝴蝶教程"
android:id="@+id/textView2"
android:layout_below="@+id/textView"
android:layout_centerHorizontal="true"
android:textSize="30dp"
android:textColor="#ff14be3c" />
<ImageView
android:id="@+id/imageView"
android:layout_width="219dp"
android:layout_height="108dp"
android:layout_below="@+id/textView2"
android:layout_alignStart="@+id/textView2"
android:layout_alignLeft="@+id/textView2"
android:layout_alignEnd="@+id/textView2"
android:layout_alignRight="@+id/textView2"
android:layout_centerHorizontal="true"
android:layout_marginStart="-102dp"
android:layout_marginLeft="-102dp"
android:layout_marginTop="-8dp"
android:layout_marginEnd="6dp"
android:layout_marginRight="6dp"
android:background="#88005522"
android:src="@drawable/logo" />
</RelativeLayout>
让我们尝试运行刚刚修改的应用程序。我假设您在进行环境设置时已创建了AVD。要从Android Studio运行该应用,请打开您项目的活动文件之一,然后工具栏中单击“运行”图标。Android studio将应用程序安装在您的AVD上并启动它,如果设置和应用程序一切正常,它将显示在“模拟器”窗口下面-
尝试去拖放图片,并观察控制台日志输出。