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 实现左滑出现删除选项所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)