Android为View添加拖放效果的方法实例
作者:QiShare 发布时间:2023-06-25 18:53:45
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添加上拖放效果能让应用交互更加方便和友好。
来源:https://juejin.cn/post/7062961027578757156
猜你喜欢
- 报错翻译: compileSdkVersion android-24”需要JDK 1.8或更高版本编译。报错现象如下图:原因:st
- 网络中数据传输经常是xml或者json,现在做的一个项目之前调其他系统接口都是返回的xml格式,刚刚遇到一个返回json格式数据的接口,通过
- 前言最近在工作中需要编译android下的动态库,本以为是一件简单的事,没想到因为工具,以及google本身被墙的原因,折腾了好久。在win
- 这篇文章主要介绍了Java如何实现自定义异常类,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参
- Visual Studio 2022 默认.net framework4.8,而4.6~4.7版本的.net framework可以通过方法
- Android 微信摇一摇功能实现,最近学习传感器,就想实现摇一摇的功能,上网查了些资料,就整理下。如有错误,还请指正。开发环境Androi
- 如图所示的效果相信大家都不陌生,我们可以使用很多种方法去实现此效果,这里自己采用CountDownTimer定时器简单封装下此效果,方便我们
- 相比于直线检测,直线拟合的最大特点是将所有数据只拟合出一条直线void fitLine( InputArray points, Output
- 本文实例为大家分享了iOS新浪微博分享功能的具体代码,供大家参考,具体内容如下做新浪分享 需先去http://open.weibo.com/
- 目标效果: 点击动画按钮之后每张牌各自旋转 散开到屏幕上半部分的任意位置之后回到初始位置 比较像LOL男刀的技能动画 : )1: 创建卡牌对
- package TOOLS;import java.io.BufferedReader;import java.io.File;import
- 上篇介绍了几种图表的公共组件X、Y轴、背景Board的绘制。这章节介绍柱状图表的绘制,相对其它图表而言简单一些,这里主要介绍图表主体的绘制,
- 一、前言(吐槽+煽情+简介) &n
- 1)打开idea,开始创建SpringBoot项目2)选择 Spring Initializr ,选择合适的jdk版本,点击Next在操作到
- 介绍Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。Spring Cache提供了一
- Android Build类的详解及简单实例一、类结构:java.lang.Object? android.os.Build二、类概述:从系
- 为什么要使用路由在之前我们的代码中,页面跳转使用的代码如下所示:Navigator.of(context).push( Mate
- 本文实例讲述了C#中HttpWebRequest的用法。分享给大家供大家参考。具体如下:HttpWebRequest类主要利用HTTP 协议
- 本文实例为大家分享了C++实现俄罗斯方块的具体代码,供大家参考,具体内容如下先是效果图:主菜单:游戏:设置:错误处理:代码:#include
- 参考:How to catch an Exception from a threadIs there a way to make Runna