iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Android中怎么实现条目拖拽删除功能
  • 739
分享到

Android中怎么实现条目拖拽删除功能

android 2023-05-30 22:05:43 739人浏览 安东尼
摘要

本篇文章给大家分享的是有关Android中怎么实现条目拖拽删除功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。第一步效果图0自定义控件 SwipeLayout 继承Frame

本篇文章给大家分享的是有关Android中怎么实现条目拖拽删除功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

第一步效果图

Android中怎么实现条目拖拽删除功能

0自定义控件 SwipeLayout 继承FrameLayout重写里面三个构造方法,分别调用initView().

0在布局中使用自定义控件

0在initView()方法中,创建拖拽辅辅助工具 ViewDragHelper()

 该方法需要传入回调 MyCallBack()

0,创建MyCallBack()回调,继承ViewDragHelper.Callback

  在回调中 覆盖tryCaptureView方法,返回true 允许child被拖拽,被 覆盖clampViewPositionHorizontal 返回left系统提供拖拽位置

0 onInterceptTouchEvent 返回:让ViewDragHelper判断是否需要拦截事件

0  onTouchEvent 返回true 并且让ViewDragHelper分析事件

具体代码:

布局:

<cn.itheima.swipelayout.SwipeLayout xmlns:android="Http://schemas.android.com/apk/res/android"  xmlns:tools="http://schemas.android.com/tools"  android:id="@+id/activity_main"  android:layout_width="match_parent"  android:layout_height="wrap_content">  <!--正文部分-->  <RelativeLayout   android:layout_width="match_parent"   android:layout_height="wrap_content"   android:background="#fff"   android:orientation="horizontal">   <TextView    android:id="@+id/item_tv_name"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:padding="10dp"    android:text="张三"    android:textSize="20sp" />  </RelativeLayout>  <!--按钮部分-->  <LinearLayout   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:orientation="horizontal">   <TextView    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:background="#888888"    android:padding="10dp"    android:text="呼叫"    android:textSize="20sp" />   <TextView    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:background="#f00"    android:padding="10dp"    android:text="删除"    android:textSize="20sp" />  </LinearLayout> </cn.itheima.swipelayout.SwipeLayout>

SwipeLayout 代码:

public class SwipeLayout extends FrameLayout {  private ViewDragHelper mDragHelper;  public SwipeLayout(Context context) {   super(context);   initView();  }  public SwipeLayout(Context context, AttributeSet attrs) {   super(context, attrs);   initView();  }  public SwipeLayout(Context context, AttributeSet attrs, int defStyleAttr) {   super(context, attrs, defStyleAttr);   initView();  }  private void initView() {   mDragHelper = ViewDragHelper.create(this,new MyCallBack());  }  // 让ViewDragHelper就是拖拽辅助工具 返回true 则表示要拦截触摸事件  @Override  public boolean onInterceptTouchEvent(MotionEvent ev) {   //让拖拽辅助工具判断是否需要拦截 事件   return mDragHelper.shouldInterceptTouchEvent(ev);  }  @Override  public boolean onTouchEvent(MotionEvent event) {   //让拖拽辅助工具分析事件 分析用户手势   mDragHelper.processTouchEvent(event);   return true;  }  private class MyCallBack extends ViewDragHelper.Callback{      @Override   public boolean tryCaptureView(View child, int pointerId) {    return true;   }      @Override   public int clampViewPositionHorizontal(View child, int left, int dx) {    return left;   }  } }

0创建onFinishInflate方法获取子控件,并且判断健壮性

  @Override  protected void onFinishInflate() {   // 健壮性检查   if (getChildCount()!=2){    throw new RuntimeException("SwipeLayout 必须存放两个子控件");   }   if (!(getChildAt(0) instanceof ViewGroup)||!(getChildAt(1) instanceof ViewGroup)){    throw new RuntimeException("SwipeLayout 的子控件必须是 ViewGroup");   }   mContent = (ViewGroup) getChildAt(0);   mDeletePanel = (ViewGroup) getChildAt(1);  }

0创建onSizeChanged方法,在控件大小改变的时候调用,获取控件的宽高,和删除的面板的最大移动范围

  @Override  protected void onSizeChanged(int w, int h, int oldw, int oldh) {   super.onSizeChanged(w, h, oldw, oldh);   int mWith = w;   int mHeigth = h;   //界面创建过程中,不能使用 getWidth 方法   int mRang = mDeletePanel.getMeasuredWidth();  }

0在onLayout中指定侧拉面板的位置

//指定侧拉面板的位置  @Override  protected void onLayout(boolean changed, int left, int top, int right, int bottom) {   super.onLayout(changed, left, top, right, bottom);   mDeletePanel.layout(mWith,0,mWith+mRang,mHeigth);  }

0在onViewPositionChanged方法中实现联动效果

   @Override   public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {    if (changedView==mContent){     // 移动正文的同时也要移动侧栏     mDeletePanel.offsetLeftAndRight(dx);    }else{     mContent.offsetLeftAndRight(dx);    }   }

0在 clampViewPositionHorizontal方法中  固定被拖拽控件的水平位置,

   @Override   public int clampViewPositionHorizontal(View child, int left, int dx) {    if (child==mContent){     if (left>0){      left=0;     }else if (left<-mRang){       left=-mRang;     }    }else{     if (left>mWith){//mWith是屏幕的宽度      left=mWith;     }else if (left<mWith-mRang){      left=mWith-mRang;     }    }    return left;   }

效果图

Android中怎么实现条目拖拽删除功能

0onViewReleased中根据来开局里面,判断是否打开还是关闭

0  在  moveContent中第一次滑动

0computeScroll中,继续滑动,直到滑动到指定的位置

0注意在onViewPositionChanged中手动刷新界面,调用invalidate方法

如果不手动刷新界面,效果展示不出来

   @Override   public void onViewReleased(View releasedChild, float xvel, float yvel) {    if (xvel>0){     //向右移动     close();    }else if (xvel<0){     //向左移动     opend();    }else if (xvel>-mRang/2){// 静止状态     close();// 展开不到一半,关闭面板    }else{     opend();    }   }  }    private void opend() {   int left=-mRang;   moveContent(left);  }    private void close() {   int left=0;   moveContent(left);  }  private void moveContent(int left) {   // 开启平滑滚动,如果返回 true 则说明要继续刷新界面,保持滚动   if(mDragHelper.smoothSlideViewTo(mContent,left,0)){    invalidate();   }  }  @Override  public void computeScroll() {   // 继续平滑滚动,如果返回 true 则说明要继续刷新界面,保持滚动   if (mDragHelper.continueSettling(true)){    invalidate();   }  }

0现给ListView赋值   在这就省略

0在SwipeLayout中使用枚举记录面板的状态

 private enum Status{  CLOSED,OPENED,DRAGING; }  private Status status = Status.CLOSED;  public Status getStatus() {   return status;  }

0// 记录上一个打开的面板。注意:一定要是 静态变量

private static SwipeLayout preSwipeLayout;

0在onViewPositionChanged中创建一个方法操作关闭面板

// 关闭上一个打开的面板closePre();

0closePre()在这个方法中,判断当前面板的状态,并且根据状态,关闭上一个打开的面板

// 判断当前面板是否正在打开,如果正在打开则将上一个打开的面板关闭  private void closePre() {   //记录旧状态   Status preStatus=status;   if (mContent.getLeft()==-mRang){    //记录当前面板已经打开    status=status.OPENED;   }else if (mContent.getLeft()==0){    //当前面板已经关闭    status=status.CLOSED;   }else {    status=status.DRAGING;   }   // 如果当前面板旧状态为关闭,并且新状态为拖拽,那么此时可以关闭之前打开的面板   if (preStatus==status.CLOSED&&status==status.DRAGING){    if (preSwipeLayout!=null&&preSwipeLayout!=this){     // 关闭上一个面板     preSwipeLayout.close();    }    // 将当前面板标记为 打开的面板    preSwipeLayout=this;   }  }

以上就是Android中怎么实现条目拖拽删除功能,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网精选频道。

--结束END--

本文标题: Android中怎么实现条目拖拽删除功能

本文链接: https://www.lsjlt.com/news/221711.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android中怎么实现条目拖拽删除功能
    本篇文章给大家分享的是有关Android中怎么实现条目拖拽删除功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。第一步效果图0自定义控件 SwipeLayout 继承Frame...
    99+
    2023-05-30
    android
  • 怎么在android应用中利用view实现一个拖拽删除功能
    这期内容当中小编将会给大家带来有关怎么在android应用中利用view实现一个拖拽删除功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。功能有以下几个特点:在开始的时候点击圆以外的区域不会触发拖动事件点...
    99+
    2023-05-31
    android roi view
  • Android中RecyclerView拖拽、侧删功能的实现代码
    废话不多说,下面展示一下效果。这是GridView主文件实现。public class GridViewActivity extends AppCompatActivity { RecyclerView mRecyclerView; L...
    99+
    2023-05-30
    android 拖拽删除 recycle
  • android实现拖拽裁剪功能
    本文实例为大家分享了android拖拽框,裁剪出图片的具体代码,供大家参考,具体内容如下 import android.graphics.Bitmap; import androi...
    99+
    2024-04-02
  • 如何在Android应用中实现一个红点拖拽删除功能
    如何在Android应用中实现一个红点拖拽删除功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。CircleImageView核心代码private void ...
    99+
    2023-05-31
    android roi
  • vuedraggable怎么实现拖拽功能
    这篇文章主要介绍了vuedraggable怎么实现拖拽功能的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vuedraggable怎么实现拖拽功能文章都会有所收获,下面我们一起来看看吧。一、下载依赖npm&nbs...
    99+
    2023-06-29
  • Vue.Draggable拖拽功能怎么实现
    这篇文章主要讲解了“Vue.Draggable拖拽功能怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue.Draggable拖拽功能怎么实现”吧!使用cmd命令在项目根目录下下载安...
    99+
    2023-07-04
  • vue怎么实现图片拖拽功能
    本篇内容介绍了“vue怎么实现图片拖拽功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!主要涉及到的元素知识,示意图:js代码部分:dire...
    99+
    2023-06-25
  • vue怎么实现拖拽元素功能
    这篇“vue怎么实现拖拽元素功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue怎么实现拖拽元素功能”文章吧。示例代码如...
    99+
    2023-07-04
  • js如何实现横向拖拽导航条功能
    这篇文章给大家分享的是有关js如何实现横向拖拽导航条功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。效果如下:代码如下:<!DOCTYPE HTML> &...
    99+
    2024-04-02
  • vue怎么实现拖拽窗口功能
    今天小编给大家分享一下vue怎么实现拖拽窗口功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。效果实现代码<templ...
    99+
    2023-06-29
  • Android项目中怎么实现一个可拖拽界面
    本篇文章为大家展示了Android项目中怎么实现一个可拖拽界面,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。以自定义ImageView为例:public class FloatingImageVie...
    99+
    2023-05-31
    android roi 目中
  • vue3怎么使用vuedraggable实现拖拽功能
    这篇文章主要介绍了vue3怎么使用vuedraggable实现拖拽功能的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue3怎么使用vuedraggable实现拖拽功能文章都会有所收获,下面我们一起来看看吧。n...
    99+
    2023-06-29
  • Android简单实现菜单拖拽排序的功能
    目录1、效果2、简介3、功能拆解4、功能实现4.1、实现接口4.1.1、getMovementFlags4.1.2、onMove4.1.3、onSwiped4.2、绑定Recycle...
    99+
    2024-04-02
  • android长按删除功能怎么实现
    要实现Android长按删除功能,可以通过以下步骤: 在布局文件中定义一个需要长按删除的控件,比如一个Button或者一个Ima...
    99+
    2024-03-05
    android
  • react可拖拽进度条怎么实现
    本文小编为大家详细介绍“react可拖拽进度条怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“react可拖拽进度条怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。效果import {&n...
    99+
    2023-06-30
  • Android开发中怎么实现一个拖动条和评星条的功能
    Android开发中怎么实现一个拖动条和评星条的功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一      拖动条&nbs...
    99+
    2023-05-31
    android roi
  • react中实现拖拽排序react-dnd功能
    dnd文档 html 拖拽排序 import React, { useState, useRef } from 'react'; import { cloneDeep } from...
    99+
    2023-02-06
    拖拽排序react-dnd react拖拽排序
  • 怎么在Android中使用RecyclerView实现一个图标拖拽排序功能
    这期内容当中小编将会给大家带来有关怎么在Android中使用RecyclerView实现一个图标拖拽排序功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。实现的思路用两个RecyclerView实现,同时...
    99+
    2023-06-14
  • elementUI中el-dialog如何实现拖拽功能
    本文小编为大家详细介绍“elementUI中el-dialog如何实现拖拽功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“elementUI中el-dialog如何实现拖拽功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作