1.引言
在开发中,拖放是一种比较常见的手势操作,使用它能够让应用的交互更加地便捷和友好,本文将简要介绍如何为Android中的View添加拖放效果。
2.主要方法和类介绍
2.1 startDragAndDrop()和startDrag()
要实现View的拖放,需要调用View的startDragAndDrop()或startDrag()方法,其中startDragAndDrop()方法要求API版本为24或以上,调用方法后,View便可以拖动了,此方法需要传递的参数如下:
//data:拖放操作要传递的数据
//shadowBuilder:拖放阴影
//myLocalState:一个包含与拖放操作有关的数据的对象
//flags:控制拖放操作的标志位
public final boolean startDragAndDrop(ClipData data, DragShadowBuilder shadowBuilder,Object myLocalState, int flags)
2.2 setOnDragListener()
接收拖放事件的View我们暂且称之为目标View,目标View调用setOnDragListener(),并实现其中的方法onDrag()后可以接收拖放事件的回调。
2.3 View.DragShadowBuilder
在拖放操作进行的时候,需要显示正在拖动的图片,View.DragShadowBuilder类提供了可以传入View的构造方法,这个View是被拖放的View,我们将通过DragShadowBuilder创建的拖动图片称为拖动阴影,这个将作为参数传入startDragAndDrop()或startDrag()方法中,如若有需要的话,还可以继承View.DragShadowBuilder类去实现自定义的效果。
2.4 DragEvent
此类主要定义了拖放事件的类型,通过event.getAction()可以获取不同的事件类型,主要有以下几种:
//DragEvent.ACTION_DRAG_STARTED:表示拖动已经开始
//DragEvent.ACTION_DRAG_ENTERED:表示拖动阴影已经进入目标View
//DragEvent.ACTION_DRAG_LOCATION:拖动阴影在目标View边界内移动时会多次响应此事件
//DragEvent.ACTION_DRAG_EXITED:表示拖动阴影离开了目标View的边界
//DragEvent.ACTION_DROP:表示拖动阴影被释放
//DragEvent.ACTION_DRAG_ENDED:表示拖放操作即将结束,在此处需要通过调用event.getResult()的返回值来判断拖放操作是否成功
3. 演示将一张图片拖放到方框内
现在演示将一张图片拖放到方框内,来说明拖放操作的大致流程,其中方框是一个LinearLayout,为它设置了一个方框背景。
3.1 简易布局
布局如下:
<?xml version="1.0" encoding="utf-8"?>
<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">
<ImageView
android:id="@+id/iv_drag"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_centerHorizontal="true"
android:src="@mipmap/ic_launcher" />
<LinearLayout
android:id="@+id/ll_accept"
android:layout_width="300dp"
android:layout_height="300dp"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="50dp"
android:background="@drawable/black_bac"
android:orientation="vertical">
</LinearLayout>
</RelativeLayout>
3.2 操作被拖放的图片
实现长按拖动图片的效果,首先调用setOnLongClickListener()设置长按事件回调,之后构建ClipData和拖动阴影,然后调用startDragAndDrop()或startDrag()方法实现拖动,代码如下:
iv_drag.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
CharSequence charSequence = (CharSequence) iv_drag.getTag();
ClipData.Item item = new ClipData.Item(charSequence);
ClipData clipData = new ClipData(charSequence, new String[]{ClipDescription.MIMETYPE_TEXT_PLAIN}, item);
View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(iv_drag);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
iv_drag.startDragAndDrop(clipData, shadowBuilder, null, 0);
} else {
iv_drag.startDrag(clipData, shadowBuilder, null, 0);
}
return true;
}
});
3.3 方框接收图片
目标View要接收图片需要先调用setOnDragListener()来接受拖放事件的回调,使用event.getAction()来获取不同的拖放事件类型,然后根据事件类型执行相应的操作,示例如下:
ll_accept.setOnDragListener(new View.OnDragListener() {
@Override
public boolean onDrag(View v, DragEvent event) {
switch (event.getAction()) {
case DragEvent.ACTION_DRAG_STARTED:
iv_drag.setVisibility(View.GONE);
if (event.getClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) {
return true;
}
return false;
case DragEvent.ACTION_DRAG_ENTERED:
isChangePos = true;
ll_accept.setBackgroundResource(R.drawable.green_bac);
return true;
case DragEvent.ACTION_DRAG_LOCATION:
x = event.getX();
y = event.getY();
return true;
case DragEvent.ACTION_DRAG_EXITED:
isChangePos = false;
ll_accept.setBackgroundResource(R.drawable.black_bac);
return true;
case DragEvent.ACTION_DROP:
return true;
case DragEvent.ACTION_DRAG_ENDED:
ll_accept.setBackgroundResource(R.drawable.black_bac);
if (isChangePos && event.getResult()) {
int left = ll_accept.getLeft();
int top = ll_accept.getTop();
x = x + left - (iv_drag.getWidth() / 2);
y = y + top - (iv_drag.getHeight() / 2);
iv_drag.setX(x);
iv_drag.setY(y);
}
iv_drag.setVisibility(View.VISIBLE);
return true;
}
return false;
}
});
4.总结
在开发的过程中,我们会使用各种各样的View,实现拖放效果,主要包括拖动阴影构建、拖放方法调用以及对拖放事件的处理,在合适的场景下为View添加上拖放效果能让应用交互更加方便和友好。
最后,如果大伙有什么好的学习方法或建议欢迎大家在评论中积极留言哈,希望大家能够共同学习、共同努力、共同进步。
小编在这里祝小伙伴们在未来的日子里都可以 升职加薪,当上总经理,出任CEO,迎娶白富美,走上人生巅峰!!
不论遇到什么困难,都不应该成为我们放弃的理由!
很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,需要一份小编整理出来的学习资料的关注我主页或者点击扫描下方二维码免费领取~

这里是关于我自己的Android 学习,面试文档,视频收集大整理**,有兴趣的伙伴们可以看看~
如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言,一定会认真查询,修正不足,谢谢。
本文介绍如何为Android中的View添加拖放效果。先介绍了实现拖放所需的主要方法和类,如startDragAndDrop()、setOnDragListener()等,接着通过将图片拖放到方框内的示例说明拖放操作流程,包括布局、操作图片和接收图片,最后总结拖放效果实现要点。
6484

被折叠的 条评论
为什么被折叠?



