android实现简单左滑删除控件

本文为大家分享了一个简单的android左滑删除控件,供大家参考,具体内容如下

import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.PointF;
import android.support.v4.view.ViewConfigurationCompat;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;

public class SwipeLayout extends ViewGroup{
 public static String TAG = "SwipeLayout";

 //可以滚动的距离
 int mSwipeWidth;

 PointF firstPoint;
 PointF lastPoint;

 float mTouchSlop;

 ValueAnimator openAnimator;
 ValueAnimator closeAnimator;

 public SwipeLayout(Context context) {
  this(context,null);
 }

 public SwipeLayout(Context context, AttributeSet attrs) {
  super(context, attrs);
  mTouchSlop = ViewConfigurationCompat.getScaledPagingTouchSlop(ViewConfiguration.get(getContext()));
 }

 @Override
 protected void onLayout(boolean changed, int l, int t, int r, int b) {
  int left=0;
  int childCount = getChildCount();

  for (int i=0;i<childCount;++i){
   View child = getChildAt(i);

   //按顺序从左往右排
//   if (i==0){
//    child.layout(0,0,child.getMeasuredWidth(),child.getMeasuredHeight());
//   }else {
    child.layout(left,0,left+child.getMeasuredWidth(),child.getMeasuredHeight());
//   }
   left += child.getMeasuredWidth();
  }

 }

 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  int childCount = getChildCount();
  View mainChild = getChildAt(0);
  int width=0;
  int height=0;
  mSwipeWidth = 0;
//  measureChild(mainChild,widthMeasureSpec,heightMeasureSpec);
  measure(widthMeasureSpec,heightMeasureSpec);

  //滑动距离是 从index开始 所有控件的宽度之和
  if (childCount>1) {
   for (int i = 1; i < childCount; ++i) {
    mSwipeWidth += getChildAt(i).getMeasuredWidth();
   }
  }

  int widthMode = MeasureSpec.getMode(widthMeasureSpec);
  int widthValue = MeasureSpec.getSize(widthMeasureSpec);
  int heightMode = MeasureSpec.getMode(heightMeasureSpec);
  int heightValue = MeasureSpec.getSize(heightMeasureSpec);

  switch (heightMode){
   case MeasureSpec.AT_MOST:
   case MeasureSpec.UNSPECIFIED:
    //没有指定大小 按照第一个子控件的大小来设置
    height = mainChild.getMeasuredHeight();
    break;
   case MeasureSpec.EXACTLY:
    height = heightValue;
    break;
  }
  switch (widthMode){
   case MeasureSpec.AT_MOST:
   case MeasureSpec.UNSPECIFIED:
    //没有指定大小 按照第一个子控件的大小来设置
    width = mainChild.getMeasuredWidth();
    break;
   case MeasureSpec.EXACTLY:
    width = widthValue;
    break;
  }

//  for (int i=1;i<childCount;++i){
//   measureChild(getChildAt(i),widthMeasureSpec,MeasureSpec.makeMeasureSpec(height,MeasureSpec.EXACTLY));
//  }
  setMeasuredDimension(width,height);
 }

 @Override
 public boolean dispatchTouchEvent(MotionEvent ev) {
  return super.dispatchTouchEvent(ev);
 }

 @Override
 public boolean onInterceptTouchEvent(MotionEvent ev) {
    switch (ev.getAction()){
   case MotionEvent.ACTION_DOWN:
    firstPoint = new PointF(ev.getX(),ev.getY());
    lastPoint = new PointF(ev.getX(),ev.getY());
    break;
   case MotionEvent.ACTION_MOVE:
    float moveDistance = ev.getX()-firstPoint.x;

    //移动距离大于制定值 认为进入控件的滑动模式
    if (Math.abs(moveDistance) > mTouchSlop ){
     //让父控件不拦截我们的事件
     getParent().requestDisallowInterceptTouchEvent(true);
     //拦截事件
     return true;
    }

  }
  return super.onInterceptTouchEvent(ev);
 }

 @Override
 public boolean onTouchEvent(MotionEvent ev) {
  switch (ev.getAction()){
   case MotionEvent.ACTION_MOVE:
    float moveDistance = ev.getX()-lastPoint.x;
    lastPoint = new PointF(ev.getX(),ev.getY());

    // 这里要注意 x大于0的时候 往左滑动 小于0往右滑动
    scrollBy((int) -moveDistance ,0);

    //边界判定 超过了边界 直接设置为边界值
    if (getScrollX()> mSwipeWidth){
     scrollTo(mSwipeWidth,0);
    }else if (getScrollX()<0){
     scrollTo(0,0);
    }
    break;
   case MotionEvent.ACTION_UP:
    //没动 不理他
    if (getScrollX()== mSwipeWidth ||getScrollX()==0){
     return false;
    }
     float distance = ev.getX()-firstPoint.x;
    //滑动距离超过 可滑动距离指定值 继续完成滑动
     if (Math.abs(distance) > mSwipeWidth *0.3 ){
      if (distance>0){
       smoothClose();
      }else if (distance<0){
       smoothOpen();
      }
     }else {
      if (distance>0){
       smoothOpen();

      }else if (distance<0){
       smoothClose();
      }
     }
     return true;
  }

  return super.onTouchEvent(ev);
 }

 public void smoothOpen(){

  clearAnimator();
  openAnimator = ValueAnimator.ofInt(getScrollX(), mSwipeWidth);
  openAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
   @Override
   public void onAnimationUpdate(ValueAnimator animation) {
    Integer integer = (Integer) animation.getAnimatedValue();
    scrollTo(integer,0);
   }
  });
  openAnimator.start();
 }
 public void smoothClose(){
  clearAnimator();
  closeAnimator = ValueAnimator.ofInt(getScrollX(),0);
  closeAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
   @Override
   public void onAnimationUpdate(ValueAnimator animation) {
    Integer integer = (Integer) animation.getAnimatedValue();
    scrollTo(integer,0);
   }
  });
  closeAnimator.start();

 }

 public void open(){
  scrollTo(mSwipeWidth,0);
 }
 public void close(){
  scrollTo(0,0);

 }
//执行滑动动画必须先清除动画 不然会鬼畜
 private void clearAnimator(){
  if (closeAnimator!=null && closeAnimator.isRunning()){
   closeAnimator.cancel();
   closeAnimator = null;
  }
  if (openAnimator!=null && openAnimator.isRunning()) {
   openAnimator.cancel();
   openAnimator = null;
  }
 }

 public void toggle(){
  if (getScrollX()==0){
   open();
  }else {
   close();
  }
 }

}

使用

<com.example.chenweiqi.simplerefreshview.widget.SwipeLayout
  android:id="@+id/swipeLayout"
  android:layout_width="200dp"
  android:layout_height="wrap_content"
  android:background="#F3F3F3"
>
<Button
  android:id="@+id/btn"
  android:text="123"
  android:layout_width="match_parent"
  android:layout_height="50dp" />

<Button
  android:background="#FF0000"
  android:text="shanchu"
  android:layout_width="80dp"
  android:layout_height="match_parent" />
<TextView
  android:gravity="center"
  android:textAlignment="center"
  android:background="#0F0"
  android:text="123"
  android:layout_width="30dp"
  android:layout_height="match_parent" />
</com.example.chenweiqi.simplerefreshview.widget.SwipeLayout>

效果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android高仿QQ6.0侧滑删除实例代码

    推荐阅读: 先给大家分享一下,侧滑删除,布局也就是前面一个item,然后有两个隐藏的按钮(TextView也可以),然后我们可以向左侧滑动,然后显示出来,然后对delete(删除键)实现监听,就可以了哈.好了那就来看看代码怎么实现的吧. 首先和之前一样 自定义View,初始化ViewDragHelper: package com.example.removesidepull; import android.content.Context; import android.support.v4.wi

  • Android 创建/验证/删除桌面快捷方式(已测试可用)

    测试环境为Adnroid 2.1以上. 第一步:AndroidManifest.xml 权限配置: 添加快捷方式权限: 复制代码 代码如下: <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/> 验证快捷方式是否存在权限: 复制代码 代码如下: <uses-permission android:name="com.android.launcher.

  • Android Studio彻底删除项目 Android Studio彻底删除Module

    Android Studio这样才能彻底删除项目,具体操作如下 1.Android Studio彻底删除Module 当不需要某个Module(工程)时,删除 在"Project"视图中选择需要删除的module名,此处删除"app",点击右键,选择"Open Module Setting",出现如下界面,然后选择左上角的"-"号,将此module从"Test"项目列表中移除(并没有真正的从硬盘删除) 再次

  • android ListView内数据的动态添加与删除实例代码

    main.xml 文件: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_pa

  • Android Recyclerview实现多选,单选,全选,反选,批量删除的功能

    效果图如下: Recyclerview 实现多选,单选,全选,反选,批量删除的步骤 1.在Recyclerview布局中添加上底部的全选和反选按钮,删除按钮,和计算数量等控件 2.这里选中的控件没有用checkbox来做,用的是imageview,选中和不选中其实是两张图片 3.默认是不显示选中的控件的,点击编辑的时候显示,点击取消的时候隐藏 4.通过adapter和activity数据之间的传递,然后进行具体的操作 具体代码如下: 在recyclerview的布局中写全选,反选,删除,计数等相

  • Android中删除文件以及文件夹的命令记录

    记录一下命令: tools>adb remount tools>adb shell #su #cd system/sd/data //进入系统内指定文件夹 #ls //列表显示当前文件夹内容 #rm -r xxx //删除名字为xxx的文件夹及其里面的所有文件 #rm xxx //删除文件xxx #rmdir xxx //删除xxx的文件夹

  • Android递归方式删除某文件夹下的所有文件(.mp3文件等等)

    1.由于需要删除文件,因此需要如下权限: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 2.核心代码 复制代码 代码如下: package com.example.deleteyoumi; import java.io.File; import android.os.Bundle; import android.os.Han

  • Android通讯录开发之删除功能的实现方法

    无论是Android开发或者是其他移动平台的开发,ListView肯定是一个大咖,那么对ListView的操作肯定是不会少的,上一篇博客介绍了如何实现全选和反选的功能,本篇博客介绍删除功能,删除列表中的项无谓就是及时刷新列表,这又跟UI线程扯上关系了,还是那句话,数据的更新通知一定要在UI线程上做,不然会出现各种错误,比如出现adapter数据源改变,但没有及时收到通知的情况.在执行遍历删除的时候,最好不要每删一个就直接通知,下面是我的实现方法,将需要删除的contact保存到一个List然后通

  • Android中删除Preference详解

    Android的设置界面实现比较简单,有时甚至只需要使用一个简单的xml文件即可.声明简单,但是如何从PreferenceScreen或者PreferenceCategory中删除一个Preference会简单么.为什么有些人写的就无法删除成功呢?本文将从Android源码实现来分析一下. 声明文件 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:a

  • Android实现WebView删除缓存的方法

    本文实例讲述了Android实现WebView删除缓存的方法.分享给大家供大家参考.具体如下: 删除保存于手机上的缓存: // clear the cache before time numDays private int clearCacheFolder(File dir, long numDays) { int deletedFiles = 0; if (dir!= null && dir.isDirectory()) { try { for (File child:dir.listF

随机推荐