Android为View添加拖放效果的方法实例

 更新时间:2022年02月18日 11:26:27   作者:QiShare  
这篇文章主要给大家介绍了关于Android为View添加拖放效果的相关资料,实现View的拖拽其实原理很简单,无非就是获取手指的位移信息,然后view根据手指的位移信息,移动对应的位置,需要的朋友可以参考下

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添加上拖放效果能让应用交互更加方便和友好。

到此这篇关于Android为View添加拖放效果的文章就介绍到这了,更多相关Android为View添加拖放内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • zxing二维码位矩阵转换成Bitmap位图的实战教程

    zxing二维码位矩阵转换成Bitmap位图的实战教程

    二维码的应用已经可以说是非常广泛了,下面这篇文章主要给大家介绍了关于zxing二维码位矩阵转换成Bitmap位图的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • Android手把手教大家制作APP首页(下拉刷新、自动加载)

    Android手把手教大家制作APP首页(下拉刷新、自动加载)

    这篇文章主要为大家详细介绍了Android手把手教大家制作APP首页,实现下拉刷新、自动加载功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • Android动画实现原理和代码

    Android动画实现原理和代码

    这篇文章主要介绍了Android动画实现原理和代码分析,如果你对此感兴趣,跟着小编学习下吧。
    2017-12-12
  • Android编程实现下载图片及在手机中展示的方法

    Android编程实现下载图片及在手机中展示的方法

    这篇文章主要介绍了Android编程实现下载图片及在手机中展示的方法,涉及Android针对图形文件的远程下载及遍历显示相关操作技巧,需要的朋友可以参考下
    2017-02-02
  • Android程序设计之AIDL实例详解

    Android程序设计之AIDL实例详解

    这篇文章主要介绍了Android程序设计的AIDL,以一个完整实例的形式较为详细的讲述了AIDL的原理及实现方法,需要的朋友可以参考下
    2014-09-09
  • kotlin Context使用详解

    kotlin Context使用详解

    这篇文章主要介绍了kotlin Context使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • Kotlin如何安全访问lateinit变量的实现

    Kotlin如何安全访问lateinit变量的实现

    这篇文章主要介绍了Kotlin如何安全访问lateinit变量的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • Android中okhttp3.4.1+retrofit2.1.0实现离线缓存

    Android中okhttp3.4.1+retrofit2.1.0实现离线缓存

    这篇文章主要介绍了Android中okhttp3.4.1结合retrofit2.1.0实现离线缓存,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • Android常用布局使用技巧示例讲解

    Android常用布局使用技巧示例讲解

    本文详细介绍了Android常用布局,包括LinearLayout、RelativeLayout、FrameLayout、ConstraintLayout等,分析了它们的适用场景、优缺点和使用技巧,帮助开发者更好地选择和使用合适的布局,提升UI设计和开发效率
    2023-04-04
  • Android中关于CoordinatorLayout的一些实用布局技巧

    Android中关于CoordinatorLayout的一些实用布局技巧

    大家都知道CoordinatorLayout是一个“加强版”的 FrameLayout,那么下面这篇文章主要给大家分享了Android中关于CoordinatorLayout的一些布局技巧,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-06-06

最新评论