Android学习------拖动删除(仿微信朋友圈拖动删除)

标签: drag-drop 拖动删除 拖拽删除
4人阅读 评论(0) 收藏 举报
分类:

1 示例

这里写图片描述

发朋友圈的时候,长按图片可以调整顺序,还可以拖动到底部删除。

这里写图片描述

2 官方示例:

https://developer.android.google.cn/guide/topics/ui/drag-drop.html

撸代码

1 首先布局布局画出来

一个RecyclerView+底部一个TextView

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    tools:layout_editor_absoluteY="81dp">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginBottom="8dp"
        android:layout_marginTop="8dp"
        app:layout_constraintBottom_toTopOf="@+id/delete"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:ignore="MissingConstraints"></android.support.v7.widget.RecyclerView>

    <TextView
        android:id="@+id/delete"
        android:layout_width="0dp"
        android:layout_height="50dp"
        android:background="#E85653"
        android:gravity="center"
        android:text="拖动到此处删除"
        android:textColor="#fff"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/recyclerView"
        tools:ignore="MissingConstraints" />


</android.support.constraint.ConstraintLayout>

这里写图片描述

2 MainActivity 和 Adapter 的实现

这里简单不贴代码了。贴关键步骤吧

步骤1. 对要拖拽的View调用startDragAndDrop方法,

步骤2 对要监听拖放View的控件设置View.OnDragListener事件

好的根据上面的方法,撸代码

class SimpleAdapter: RecyclerView.Adapter<SimpleAdapter.VH>() {

    companion object {
        var imgList= arrayListOf(SimpleBean(true,R.drawable.bag),SimpleBean(true,R.drawable.monkey))
    }

    var show=true

    fun changeShow(postion:Int,isShow:Boolean){
        try {
            imgList[postion].show=isShow
            notifyDataSetChanged()
        } catch (e: Exception) { //待改进
            e.printStackTrace()
        }
    }

    fun delete(postion:Int){
        imgList.removeAt(postion)
        notifyDataSetChanged()
    }

    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): VH {
        return VH(LayoutInflater.from(parent?.context).inflate(R.layout.item_layout,parent,false))
    }

    override fun getItemCount(): Int {
    return imgList.size
    }

    override fun onBindViewHolder(holder: VH?, position: Int) {
        if(holder!=null){
            holder.itemView.item_img.setImageResource(imgList[position].img)
            holder.itemView.item_img.tag=position
            val data=ClipData.newPlainText("","") //ClipData 剪切板 存放数据 方便传输

            holder.itemView.setOnLongClickListener {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                    it.startDragAndDrop(data,View.DragShadowBuilder(holder.itemView.item_img),it,View.DRAG_FLAG_OPAQUE) //步骤1
                }else{
  //View.DRAG_FLAG_OPAQUE 该属性 表示不使用半透明属性,可以点进源码查看,有对应好几种不同的Flag,可以使用自己想用的                  it.startDrag(data,View.DragShadowBuilder(holder.itemView.item_img),it,View.DRAG_FLAG_OPAQUE)//步骤1 
                }
            }

            if(imgList[position].show){
                holder.itemView.item_img.visibility=View.VISIBLE
            }else{
                holder.itemView.item_img.visibility=View.INVISIBLE
            }

        }

    }
    //这里可以实现自己的View.DragShadowBuilder 如果不用可以直接使用View.DragShadowBuilder默认的即可
    class MyDragShadowBuilder(view: View) : View.DragShadowBuilder(view) {


        lateinit var bitmapDrawable: Drawable

        init {
            bitmapDrawable = BitmapDrawable()
        }


        override fun onDrawShadow(canvas: Canvas?) {
            super.onDrawShadow(canvas)
            bitmapDrawable.draw(canvas)
        }

        override fun onProvideShadowMetrics(outShadowSize: Point?, outShadowTouchPoint: Point?) {
            super.onProvideShadowMetrics(outShadowSize, outShadowTouchPoint)
            view.isDrawingCacheEnabled = true
            bitmapDrawable = BitmapDrawable(view.drawingCache)
            bitmapDrawable.setBounds(0, 0, view.width, view.height)

            outShadowSize!!.set(view.width, view.height)
            outShadowTouchPoint!!.set(view.width / 2, view.height / 2)
        }
    }


    class VH(itemView:View): RecyclerView.ViewHolder(itemView)
}

上面代码,有2个方法,一个更新View显示和隐藏的方法,一个用于删除节点的方法

看看监听里面是怎么调用的呢

 delete.setOnDragListener { v, event ->
            println("v = [${v}], event = [${event}]")
            when(event.action){
                DragEvent.ACTION_DRAG_STARTED->{ //开始拖动
                 var imgView=event.localState as ImageView
                    delete.visibility= View.VISIBLE
                    delete.text="拖动到此处删除"
                    adapter.changeShow(imgView.tag.toString().toInt(),false)
                }
                DragEvent.ACTION_DRAG_EXITED->{ //拖动的View从TextView上移除
                    var imgView=event.localState as ImageView
                    delete.text="拖动到此处删除"
                    adapter.changeShow(imgView.tag.toString().toInt(),false)
                }
                DragEvent.ACTION_DRAG_ENTERED->{ // 拖动的View进入到的TextView上
                    delete.text="松手即可删除"
                    delete.setBackgroundColor(Color.parseColor("#D3504D"))
                    var imgView=event.localState as ImageView
                    adapter.changeShow(imgView.tag.toString().toInt(),false)
                }
                DragEvent.ACTION_DROP->{ // 在TextView上释放操作
                    Toast.makeText(this@MainActivity,"删除咯。。。",Toast.LENGTH_SHORT).show()
                    var imgView=event.localState as ImageView
                    adapter.delete(imgView.tag.toString().toInt())
                }
                DragEvent.ACTION_DRAG_ENDED->{//结束拖动事件
                    //var imgView=event.localState as ImageView
                    //adapter.changeShow(imgView.tag.toString().toInt(),true)
                }
            }
            true
        }

对了 用于控制对象的属性,所以我这里新建了一个实体类对应

data class SimpleBean(var show:Boolean, //控制View显示隐藏,在Adapter里可以看到对应的操作
                      var img:Int // 存放图片
                      )

好的最后看看效果,哈哈

这里写图片描述

注意事项

监听拖拽事件的View必须被设置为可见状态,不能被设置为Gone和Invisible,否则监不能被监听到拖拽事件,还没时间去看,是为什么原因,不过这里暂时可以处理成这样,默认设置为1x1像素大小的View,当监听到开始拖动的时候,还原到正常大小,哈哈,还没尝试,不过应该可以吧。

好久没写了, 最近好忙,都没时间去仔细写,好像也没有写过很详细的,哈哈, 这样感觉还是不对的。

慢慢养成一个好习惯,在忙也坚持坚持 ,也不知道有没有人看,就当自己留个记录以后万一有用得着的地方呢,下一篇想写

源码就不传了,贴贴就用能。

晚安
2018年4月15日23:05:07

查看评论

仿微信朋友圈发表图片拖拽和删除功能

仿微信朋友圈发表图片拖拽和删除功能,使用ItemTouchHelper实现拖拽和删除功能,并解决图片OOM,从分析到实现代码。...
  • u013231041
  • u013231041
  • 2017-07-13 14:58:06
  • 6068

Android 微信朋友圈图片拖拽功能Demo

  • 2017年08月22日 10:59
  • 484KB
  • 下载

Android仿微信朋友圈图片浏览器(支持图片手势缩放,拖动)

※效果 ※使用到的开源库 PhotoView 图片缩放:支持双击缩放,手指捏拉缩放 https://github.com/chrisbanes/PhotoView...
  • u010785585
  • u010785585
  • 2014-07-24 14:22:15
  • 4972

Android GridView长按拖动,删除

最近因为公司项目,需要用到两个GridView之间交互,一个GridView可以进行item的长按拖动,可拖动的item可以进行点击删除。本文主要介绍如何实现GridView的拖动和删除。可拖动的Gr...
  • jingzhiying
  • jingzhiying
  • 2017-04-12 21:54:20
  • 624

Android实现仿微信朋友圈发布动态(拍照、图库选择、照片压缩、显示、保存、缩略图、点击缩略图删除对应文件等)

原址: http://blog.csdn.net/zhang3776813/article/details/52092591 /** * 仿微信朋友圈发布动态 * 拍照或图库选择 *...
  • wuyou1336
  • wuyou1336
  • 2017-02-14 22:11:05
  • 1216

Android 可拖拽 GridView 并且实时切换和拖动到下部删除

最近在公司做了一个这样的需求,拖动GridView 中的 item 到指定区域删除,具体效果,请看下面的动图。 拖动效果是通过隐藏 GridView中被选中的 item,并且同时在 Window 上...
  • zh08070005
  • zh08070005
  • 2015-09-29 15:22:08
  • 2311

android中gridview的item长按拖动,删除(完美解决bug)

  • 2016年04月28日 14:28
  • 2.86MB
  • 下载

Android ListView拖动效果(互换,删除,插入)

对于ListView的拖动效果,其实也没什么神秘的,在android packages/apps/Music中例子中就有这样的效果实现,这是android系统自带的。如果大家没有这部分源码,最后的实例...
  • u012992171
  • u012992171
  • 2015-06-16 12:10:52
  • 400

高仿网易的长按拖动排序,可删除,可添加,点击完成后不可拖,不可删(根据网上的代码修改)

  • 2015年01月14日 19:46
  • 2.24MB
  • 下载

Android 仿支付宝九宫格功能,可拖动、删除网格

  • 2016年04月12日 11:13
  • 1.38MB
  • 下载
    个人资料
    持之以恒
    等级:
    访问量: 13万+
    积分: 2137
    排名: 2万+
    最新评论