1 示例

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

2 官方示例:

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

撸代码

1 首先布局布局画出来

一个RecyclerView+底部一个TextView

"1.0" encoding="utf-8"?>

.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">

.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">.support.v7.widget.RecyclerView>

"@+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" />.support.constraint.ConstraintLayout>

2 MainActivity 和 Adapter 的实现

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

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

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

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

class SimpleAdapter: RecyclerView.Adapter.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

android 拖动控件删除,Android学习------拖动删除(仿微信朋友圈拖动删除)相关推荐

  1. 小程序-仿微信朋友圈拖动删除图片

    ♠ 目的 微信小程序实现图片拖动删除,效果同朋友圈的图片拖动删除效果 ♠ 实现原理 1.使用微信小程序组件 movable-area 和 movable-view 进行拖动处理 2.根据屏幕高度.图片 ...

  2. android从九宫格全屏预览,仿微信朋友圈展示图片的九宫格图片展示控件,支持点击图片全屏预览大图...

    AssNineGridView 仿微信朋友圈展示图片的九宫格图片展示控件,支持点击图片全屏预览大图(可自定义). 写在前面 这是一个九宫格控件,本来是很久之前就写好了,现在才开源出来,也是看了很多优秀 ...

  3. Android 实现仿微信朋友圈九宫格图片+NineGridView+ImageWatcher(图片查看:1.预览,2.拖动,3.放大,4.左右滑动,5.长按保存到手机)的功能

    一.测试 实现: 二.添加依赖包: implementation 'androidx.appcompat:appcompat:1.1.0'implementation 'androidx.recycl ...

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

    原址: http://blog.csdn.net/zhang3776813/article/details/52092591 /*** 仿微信朋友圈发布动态* 拍照或图库选择 * 压缩图片并保存**/ ...

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

             原创作品,转载请注明出处:http://blog.csdn.net/zhang3776813/article/details/52092591 最近项目需求中要用到类似微信朋友圈发布 ...

  6. Android仿微信朋友圈7实现点赞功能

    前言: 之前一直有朋友问我点赞怎么实现?今天趁着休息时间整理出来,其实点赞的功能和用户评论差不多,都是显示一个用户列表,只不过评论有评论内容和回复评论功能.实现点赞的思路如下: 1.当用户点击点赞按钮 ...

  7. Android仿微信朋友圈2自定义点赞评论弹框

    最近在做类似微信朋友圈点赞评论的功能,有个点赞评论弹框交互,感觉效果很好,点击评论按钮弹框从按钮左边弹出,遇到了3个问题(弹出动画不对.弹框布局没有适配.弹出的位置显示不对),动画和布局好解决,弹出的 ...

  8. android com.mylhyl,Android 高仿微信朋友圈拍照上传功能

    模仿微信朋友圈发布动态,输入文字支持文字多少高度自增,有一个最小输入框高度,输入文字有限制,不过这些都很easy! 1. photopicker的使用 这是一个支持选择多张图片,点击图片放大,图片之间 ...

  9. android 微信高仿,Android 高仿微信朋友圈拍照上传功能

    模仿微信朋友圈发布动态,输入文字支持文字多少高度自增,有一个最小输入框高度,输入文字有限制,不过这些都很easy! 1. PhotoPicker的使用 这是一个支持选择多张图片,点击图片放大,图片之间 ...

最新文章

  1. 2018年全球AI突破性技术TOP10
  2. 【每日进步】May 2012
  3. MySQL 错误 #1055
  4. 使用Tomcat Native提升Tomcat IO效率
  5. nodemanager_如何使用NodeManager来控制WebLogic Server
  6. 借助实时数据推送快速制作在线对战五子棋小游戏丨实战
  7. 搭建集群 RabbitMQ SHELL脚本实战_03
  8. 计算机教学学生创新能力,职业技术学校创新能力计算机教学论文
  9. cad结构字体_如何让CAD字体完整起来,且不破坏系统字体
  10. ubuntu16.04中文乱码解决方案
  11. 微信公众号通过链接实现关注(盗用广告主流量主)
  12. golang mysql update_golang mysql insert 和 update使用举例
  13. ESFramework介绍之(28)―― Udp组件
  14. jsp java代码报错,求助!JSP代码中调java服务出参返回正常 weblogic报错BEA-101017
  15. 深度学习2.0-42.Auto-Encoders-无监督学习
  16. mac vscode 背景半透明_武装Mac|常用MacBook软件分类汇总
  17. 学linux哪个版本号,初学Linux哪个发行版本好?这些更合适!
  18. Mac新手必装App推荐
  19. matlab sil,丰田使用高精度发动机模型和SIL+M前置开发发动机控制系统
  20. 计算机专业自主招生有哪些学校,2019自主招生学校有哪些 自主招生考试院校名单...

热门文章

  1. 【论文阅读】用于代表单个树木的机载LiDAR 3D点云针叶树/落叶分类的深度学习
  2. js截取指定字符前面或后面的内容
  3. [一车大师]微信运营心得
  4. js页面跳转和js打开新窗口
  5. 英伟达与微软的合作里,藏着未来发展的关键词
  6. keepalived配置VIP(虚拟IP)
  7. [Excel]Excel函数和用法(6)——按照多个指定条件计数,求和,求平均数。COUNTIFS/SUMIFS/AVERAGEIFS
  8. Java中替换‘\n‘换行符
  9. jansson库使用
  10. 380伏电压一安是多少瓦?