Android小Demo——OnDragListener

本文介绍了如何在Android中实现简单的Drag和Drop功能,通过OnDragListener监听拖放事件。文中提及的关键点包括使用ClipData复制内容,DragShadowBuilder创建拖动阴影,以及解析DragEvent的不同动作如ACTION_DRAG_STARTED、ACTION_DROP等。最后展示了操作完成后的效果图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天看到一篇挺有趣的文章,讲了Drag和Drop动作,例子简单,跟着文章动手敲了一遍。原文链接原文的GitHub仓库

先上布局代码,很简单,就是一个九宫格。

<FrameLayout 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:id="@+id/layout_outside"
  tools:context=".MainActivity">

    <TextView
        android:id="@+id/text1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="1"
        android:textSize="40sp"
        android:layout_gravity="left|top" />

    <TextView
        android:id="@+id/text2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="2"
        android:textSize="40sp"
        android:layout_gravity="center_horizontal|top" />

    <TextView
        android:id="@+id/text3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="3"
        android:textSize="40sp"
        android:layout_gravity="right|top" />

    <TextView
        android:id="@+id/text4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="4"
        android:textSize="40sp"
        android:layout_gravity="left|center_vertical" />

    <TextView
        android:id="@+id/text5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="5"
        android:textSize="40sp"
        android:layout_gravity="center" />

    <TextView
        android:id="@+id/text6"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="6"
        android:textSize="40sp"
        android:layout_gravity="right|center_vertical" />

    <TextView
        android:id="@+id/text7"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="7"
        android:textSize="40sp"
        android:layout_gravity="left|bottom" />

    <TextView
        android:id="@+id/text8"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="8"
        android:textSize="40sp"
        android:layout_gravity="center_horizontal|bottom" />

    <TextView
        android:id="@+id/text9"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="9"
        android:textSize="40sp"
        android:layout_gravity="right|bottom" />
</FrameLayout>

下面就是DragAndDrop的代码,也是十分简单。

public void initUI() {
        FrameLayout layout = (FrameLayout)findViewById(R.id.layout_outside);
        for (int i = 0;i < layout.getChildCount();i++) {
            final TextView view = (TextView) layout.getChildAt(i);

            view.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {

                    ClipData data = ClipData.newPlainText("value",view.getText());

                    view.startDrag(data,new View.DragShadowBuilder(v),null,0);

                    return true;
                }
            });

            view.setOnDragListener(new View.OnDragListener() {
                @Override
                public boolean onDrag(View v, DragEvent event) {

                    switch (event.getAction()) {

                        case DragEvent.ACTION_DRAG_STARTED:
                            return true;

                        case DragEvent.ACTION_DRAG_ENTERED:
                            v.setBackgroundColor(Color.CYAN);
                            return true;

                        case DragEvent.ACTION_DRAG_LOCATION:
                            return true;

                        case DragEvent.ACTION_DRAG_EXITED:
                            v.setBackgroundColor(Color.RED);
                            return true;

                        case DragEvent.ACTION_DROP:
                            v.setBackgroundColor(Color.GREEN);
                            //得到拖动的值
                            int dragVal = Integer.parseInt(event.getClipData().getItemAt(0).getText().toString());
                            //得到textview的值
                            int viewVal = Integer.parseInt(((TextView) v).getText().toString());
                            ((TextView) v).setText("" + (dragVal + viewVal));
                            return true;

                        case DragEvent.ACTION_DRAG_ENDED:
                            return true;
                    }

                    return false;
                }
            });
        }
    }

上面这段代码,有几个稍微值得注意的知识点。

  • 使用了ClipData复制TextView的内容,ClipData相关用法大家可以度娘。
  • DragShadowBuilder的作用是创建一个Drag或Drop操作时的图片,这里使用了默认值,创建了一个当前视图的图片。大家可以使用它来创建其它图片。
  • DragEvent的几个动作,ACTION_DRAG_STARTED–表示view开始drag,返回true表示这个view的drag和drop动作可用。
  • ACTION_DRAG_ENTERED–表示有drag的view进入到当前view的区域
  • ACTION_DRAG_LOCATION–表示drag的view在当前的view的区域中,改变了它的位置
  • ACTION_DRAG_EXITED–表示drag的view离开了当前的view的区域
  • ACTION_DROP–真正的drop操作,就是你的drag动作松开手指
  • ACTION_DRAG_ENDED–drag和drop操作都结束。

是不是很简单?最后上个效果图。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值