Android 实现左滑出现删除选项

Android 实现左滑出现删除选项,第1张

概述滑动删除的部分主要包含两个部分,一个是内容区域(用于放置正常显示的view),另一个是 *** 作区域(用于放置删除按钮)。默认情况下, *** 作区域是不显示的,内容区域的大小是填充整个容器, *** 作区域始终位于内容区域的 @H_403_0@滑动删除的部分主要包含两个部分, 一个是内容区域(用于放置正常显示的vIEw),另一个是 *** 作区域(用于放置删除按钮)。默认情况下, *** 作区域是不显示的,内容区域的大小是填充整个容 器, *** 作区域始终位于内容区域的右面。当开始滑动的时候,整个容器中的所有子vIEw都像左滑动,如果 *** 作区域此时是不可见的,设置为可见。

@H_403_0@实现思路就是自定义一个layout SwipeLayout继承自FrameLayout。SwipeLayout包含两个子vIEw,第一个子vIEw是内容区域,第二个子vIEw是 *** 作 区域。滑动效果的控制,主要就是通过检测SwipeLayout的touch事件来实现,AndroID support库里其实已经提供了VIEwDragHelper来进行监听touch事件。

@H_403_0@1、首先需要对linearLayout进行重载

@H_403_0@具体分析看注解

package com.example.mac.agriculturemanagement;import androID.content.Context;import androID.support.annotation.Nullable;import androID.support.v4.vIEw.VIEwCompat;import androID.support.v4.Widget.VIEwDragHelper;import androID.util.AttributeSet;import androID.vIEw.MotionEvent;import androID.vIEw.VIEw;import androID.Widget.linearLayout;/** * Created by mac on 2017/6/15. *///条目滑动效果public class SlIDeLayout extends linearLayout {  private VIEwDragHelper mDragHelper;  private VIEw contentVIEw;  private VIEw actionVIEw;  private int dragdistance;  private final double auto_OPEN_SPEED_liMIT = 800.0;  private int draggedX;  public SlIDeLayout(Context context) {    super(context);    init();  }  public SlIDeLayout(Context context,@Nullable AttributeSet attrs) {    super(context,attrs);    init();  }  public SlIDeLayout(Context context,@Nullable AttributeSet attrs,int defStyleAttr) {    super(context,attrs,defStyleAttr);    init();  }  //初始化  public voID init (){    mDragHelper = VIEwDragHelper.create(this,new DragHelperCallback());  }  @OverrIDe  public boolean callOnClick() {    return super.callOnClick();  }  /*当你触摸屏幕,移动的时候,就会回调这个方法。  它会返回两个参数。第一个参数,就是你触摸的那个控件。  第二个就是ID。  返回值又代表什么呢?返回ture,就是代笔允许拖动这个控件。  返回false就代表不允许拖动这个控件.。这里我只允许拖动主控件。*/   //把容器的事件处理委托给VIEwDragHelper对象  @OverrIDe  public boolean onIntercepttouchEvent(MotionEvent event) {    if (mDragHelper.shouldIntercepttouchEvent(event)) {      return true;    }    return super.onIntercepttouchEvent(event);  }  @OverrIDe  public boolean ontouchEvent(MotionEvent event) {    mDragHelper.processtouchEvent(event);    return true;  }  @OverrIDe  protected voID onFinishInflate() {    contentVIEw = getChildAt(0);    actionVIEw = getChildAt(1);    actionVIEw.setVisibility(GONE);  }   //设置拖动的距离为actionVIEw的宽度   @OverrIDe   protected voID onMeasure(int wIDthMeasureSpec,int heightmeasureSpec) {    super.onMeasure(wIDthMeasureSpec,heightmeasureSpec);    dragdistance = actionVIEw.getMeasureDWIDth();    //System.out.println("righttop"+actionVIEw.gettop());   }  private class DragHelperCallback extends VIEwDragHelper.Callback {    //用来确定contentVIEw和actionVIEw是可以拖动的    @OverrIDe    public boolean tryCaptureVIEw(VIEw vIEw,int i) {      return vIEw == contentVIEw || vIEw == actionVIEw;    }    //被拖动的vIEw位置改变的时候调用,如果被拖动的vIEw是contentVIEw,    // 我们需要在这里更新actionVIEw的位置    @OverrIDe    public voID onVIEwpositionChanged(VIEw changedVIEw,int left,int top,int dx,int dy) {      draggedX = left;      if (changedVIEw == contentVIEw) {        actionVIEw.offsetleftAndRight(dx);      } else {        contentVIEw.offsetleftAndRight(dx);      }      //actionVIEw 是否可见      //0  --------  VISIBLE  可见      //4  --------  INVISIBLE  不可见但是占用布局空间      //8  --------  GONE  不可见也不占用布局空间      if (actionVIEw.getVisibility() == VIEw.GONE) {        actionVIEw.setVisibility(VIEw.VISIBLE);      }      if (left==25)      {        actionVIEw.setVisibility(VIEw.GONE);      }      invalIDate(); //刷新VIEw    }    //用来限制vIEw在x轴上拖动    //@OverrIDe    public int clampVIEwpositionHorizontal(VIEw child,int dx) {      if (child == contentVIEw) {        final int leftBound = getpaddingleft();        final int minleftBound = -leftBound - dragdistance;        final int newleft = Math.min(Math.max(minleftBound,left),25);        //System.out.println("content "+newleft);        return newleft;      } else {        //getMeasureDWIDth()获取全部长度 包括隐藏的        final int minleftBound = getpaddingleft() + contentVIEw.getMeasureDWIDth() - dragdistance;        final int maxleftBound = getpaddingleft() + contentVIEw.getMeasureDWIDth() + getpaddingRight();        final int newleft = Math.min(Math.max(left,minleftBound),maxleftBound);        System.out.println("action "+newleft);        return newleft;      }    }    @OverrIDe    public int clampVIEwpositionVertical(VIEw child,int dy) {      //System.out.println("top "+top);      if(top!=25)      {        top=25;      }      return top;    }    //用来限制vIEw可以拖动的范围    //@OverrIDe    public int getVIEwHorizontalDragRange(VIEw child) {      return dragdistance;    }    @OverrIDe    public int getVIEwVerticalDragRange(VIEw child) {      return 0;    }    //根据滑动手势的速度以及滑动的距离来确定是否显示actionVIEw。    // smoothSlIDeVIEwTo方法用来在滑动手势之后实现惯性滑动效果    //@OverrIDe    public voID onVIEwReleased(VIEw releasedChild,float xvel,float yvel) {      super.onVIEwReleased(releasedChild,xvel,yvel);      boolean settletoOpen = false;      if (xvel > auto_OPEN_SPEED_liMIT) {        settletoOpen = false;      } else if (xvel < -auto_OPEN_SPEED_liMIT) {        settletoOpen = true;      } else if (draggedX <= -dragdistance / 2) {        settletoOpen = true;      } else if (draggedX > -dragdistance / 2) {        settletoOpen = false;      }      final int settleDestX = settletoOpen ? -dragdistance : 0;      mDragHelper.smoothSlIDeVIEwTo(contentVIEw,settleDestX,0);      VIEwCompat.postInvalIDateOnAnimation(SlIDeLayout.this);    }  }}
@H_403_0@因为我给我的linearLayout设置了外边距,所以在向左滑动的过程,出现上下的滑动,并且该条目的原始位置也偏移。为了解决该问题,首先需要根据自己设置的margin值来修改一下的数据

@H_403_0@将onVIEwpositionChanged中添加

if (left==25)      {        actionVIEw.setVisibility(VIEw.GONE);      }
@H_403_0@修改为适合的数据,来防止右侧的滑块不隐藏

@H_403_0@再添加上

public int clampVIEwpositionVertical(VIEw child,int dy) {      //System.out.println("top "+top);      if(top!=25)      {        top=25;      }      return top;    }
@H_403_0@来限制其上下移动 top的值依旧需要自己琢磨

@H_403_0@2、编写布局文件

<?xml version="1.0" enCoding="utf-8"?><linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"  androID:orIEntation="vertical" androID:layout_wIDth="match_parent"  androID:layout_height="match_parent">  <com.example.mac.agriculturemanagement.SlIDeLayout    androID:layout_wIDth="match_parent"    androID:layout_height="wrap_content"    androID:orIEntation="horizontal"    >    <linearLayout      androID:layout_wIDth="match_parent"      androID:layout_height="100dp"      androID:layout_margin="10dp"      androID:background="@drawable/text_border"      androID:elevation="3dp"      androID:orIEntation="vertical">      <TextVIEw        androID:ID="@+ID/mark"        androID:layout_wIDth="match_parent"        androID:layout_height="wrap_content"        androID:layout_weight="1"        androID:gravity="center"        androID:text="TextVIEw"        androID:textSize="40dp" />      <TextVIEw        androID:ID="@+ID/markSquare"        androID:layout_wIDth="wrap_content"        androID:layout_height="wrap_content"        androID:layout_gravity="center"        androID:layout_weight="1"        androID:text="TextVIEw"        androID:textSize="20dp" />    </linearLayout>    <linearLayout      androID:layout_wIDth="100dp"      androID:layout_height="100dp"      androID:background="#f0f0f0"      androID:layout_margintop="10dp"      >      <relativeLayout        androID:layout_wIDth="wrap_content"        androID:layout_height="match_parent"        androID:layout_weight="1"        androID:gravity="center">        <TextVIEw          androID:ID="@+ID/showInfo"          androID:layout_wIDth="wrap_content"          androID:layout_height="wrap_content"          androID:layout_alignParenttop="true"          androID:layout_marginleft="5dp"          androID:layout_toEndOf="@+ID/textVIEw6"          androID:layout_toRightOf="@+ID/textVIEw6"          androID:text="详细信息" />        <TextVIEw          androID:ID="@+ID/textVIEw6"          androID:layout_wIDth="wrap_content"          androID:layout_height="wrap_content"          androID:layout_alignParentleft="true"          androID:layout_alignParentStart="true"          androID:layout_alignParenttop="true"          androID:text="删除" />      </relativeLayout>    </linearLayout>  </com.example.mac.agriculturemanagement.SlIDeLayout></linearLayout>
@H_403_0@具体效果

@H_403_0@但目前还存在一个问题

@H_403_0@ListVIEw每一个条目的点击事件和滑动事件不能共存。网上说是因为事件的触发是逐层向下传递到进行处理该事件的部件,再逐层向上返 回处理结果。

@H_403_0@以上所述是小编给大家介绍的AndroID 实现左滑出现删除选项,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程小技巧网站的支持!

总结

以上是内存溢出为你收集整理的Android 实现左滑出现删除选项全部内容,希望文章能够帮你解决Android 实现左滑出现删除选项所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1145975.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存