android 拖动控件删除,Android学习------拖动删除(仿微信朋友圈拖动删除)
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.使用微信小程序组件 movable-area 和 movable-view 进行拖动处理 2.根据屏幕高度.图片 ...
- android从九宫格全屏预览,仿微信朋友圈展示图片的九宫格图片展示控件,支持点击图片全屏预览大图...
AssNineGridView 仿微信朋友圈展示图片的九宫格图片展示控件,支持点击图片全屏预览大图(可自定义). 写在前面 这是一个九宫格控件,本来是很久之前就写好了,现在才开源出来,也是看了很多优秀 ...
- Android 实现仿微信朋友圈九宫格图片+NineGridView+ImageWatcher(图片查看:1.预览,2.拖动,3.放大,4.左右滑动,5.长按保存到手机)的功能
一.测试 实现: 二.添加依赖包: implementation 'androidx.appcompat:appcompat:1.1.0'implementation 'androidx.recycl ...
- Android实现仿微信朋友圈发布动态(拍照、图库选择、照片压缩、显示、保存、缩略图、点击缩略图删除对应文件等)
原址: http://blog.csdn.net/zhang3776813/article/details/52092591 /*** 仿微信朋友圈发布动态* 拍照或图库选择 * 压缩图片并保存**/ ...
- Android实现仿微信朋友圈发布动态(拍照、图库选择、照片压缩、显示、保存、缩略图、点击缩略图删除对应文件等)附源码
原创作品,转载请注明出处:http://blog.csdn.net/zhang3776813/article/details/52092591 最近项目需求中要用到类似微信朋友圈发布 ...
- Android仿微信朋友圈7实现点赞功能
前言: 之前一直有朋友问我点赞怎么实现?今天趁着休息时间整理出来,其实点赞的功能和用户评论差不多,都是显示一个用户列表,只不过评论有评论内容和回复评论功能.实现点赞的思路如下: 1.当用户点击点赞按钮 ...
- Android仿微信朋友圈2自定义点赞评论弹框
最近在做类似微信朋友圈点赞评论的功能,有个点赞评论弹框交互,感觉效果很好,点击评论按钮弹框从按钮左边弹出,遇到了3个问题(弹出动画不对.弹框布局没有适配.弹出的位置显示不对),动画和布局好解决,弹出的 ...
- android com.mylhyl,Android 高仿微信朋友圈拍照上传功能
模仿微信朋友圈发布动态,输入文字支持文字多少高度自增,有一个最小输入框高度,输入文字有限制,不过这些都很easy! 1. photopicker的使用 这是一个支持选择多张图片,点击图片放大,图片之间 ...
- android 微信高仿,Android 高仿微信朋友圈拍照上传功能
模仿微信朋友圈发布动态,输入文字支持文字多少高度自增,有一个最小输入框高度,输入文字有限制,不过这些都很easy! 1. PhotoPicker的使用 这是一个支持选择多张图片,点击图片放大,图片之间 ...
最新文章
- 2018年全球AI突破性技术TOP10
- 【每日进步】May 2012
- MySQL 错误 #1055
- 使用Tomcat Native提升Tomcat IO效率
- nodemanager_如何使用NodeManager来控制WebLogic Server
- 借助实时数据推送快速制作在线对战五子棋小游戏丨实战
- 搭建集群 RabbitMQ SHELL脚本实战_03
- 计算机教学学生创新能力,职业技术学校创新能力计算机教学论文
- cad结构字体_如何让CAD字体完整起来,且不破坏系统字体
- ubuntu16.04中文乱码解决方案
- 微信公众号通过链接实现关注(盗用广告主流量主)
- golang mysql update_golang mysql insert 和 update使用举例
- ESFramework介绍之(28)―― Udp组件
- jsp java代码报错,求助!JSP代码中调java服务出参返回正常 weblogic报错BEA-101017
- 深度学习2.0-42.Auto-Encoders-无监督学习
- mac vscode 背景半透明_武装Mac|常用MacBook软件分类汇总
- 学linux哪个版本号,初学Linux哪个发行版本好?这些更合适!
- Mac新手必装App推荐
- matlab sil,丰田使用高精度发动机模型和SIL+M前置开发发动机控制系统
- 计算机专业自主招生有哪些学校,2019自主招生学校有哪些 自主招生考试院校名单...
热门文章
- 【论文阅读】用于代表单个树木的机载LiDAR 3D点云针叶树/落叶分类的深度学习
- js截取指定字符前面或后面的内容
- [一车大师]微信运营心得
- js页面跳转和js打开新窗口
- 英伟达与微软的合作里,藏着未来发展的关键词
- keepalived配置VIP(虚拟IP)
- [Excel]Excel函数和用法(6)——按照多个指定条件计数,求和,求平均数。COUNTIFS/SUMIFS/AVERAGEIFS
- Java中替换‘\n‘换行符
- jansson库使用
- 380伏电压一安是多少瓦?