Android实现左滑退出Activity的完美封装

 更新时间:2020年12月15日 09:56:14   作者:代码君哈哈  
这篇文章主要介绍了Android实现左滑退出Activity的完美封装,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1:定义一个自己的父级容器,让它继承自一个布局(LinearLayout、RelativeLayout都可以)

public class SildingFinishLayout extends RelativeLayout implements View.OnTouchListener {
  /**
   * SildingFinishLayout布局的父布局
   */
  private ViewGroup mParentView;
  /**
   * 处理滑动逻辑的View
   */
  private View touchView;
  /**
   * 滑动的最小距离
   */
  private int mTouchSlop;
  /**
   * 按下点的X坐标
   */
  private int downX;
  /**
   * 按下点的Y坐标
   */
  private int downY;
  /**
   * 临时存储X坐标
   */
  private int tempX;
  /**
   * 滑动类
   */
  private Scroller mScroller;
  /**
   * SildingFinishLayout的宽度
   */
  private int viewWidth;
  /**
   * 记录是否正在滑动
   */
  private boolean isSilding;


  private OnSildingFinishListener onSildingFinishListener;
  private boolean isFinish;


  public SildingFinishLayout(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
  }


  public SildingFinishLayout(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);


    mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
    mScroller = new Scroller(context);
  }


  @Override
  protected void onLayout(boolean changed, int l, int t, int r, int b) {
    super.onLayout(changed, l, t, r, b);
    if (changed) {
// 获取SildingFinishLayout所在布局的父布局
      mParentView = (ViewGroup) this.getParent();
      viewWidth = this.getWidth();
    }
  }


  /**
   * 设置OnSildingFinishListener, 在onSildingFinish()方法中finish Activity
   *
   * @param onSildingFinishListener
   */
  public void setOnSildingFinishListener(
      OnSildingFinishListener onSildingFinishListener) {
    this.onSildingFinishListener = onSildingFinishListener;
  }


  /**
   * 设置Touch的View
   *
   * @param touchView
   */
  public void setTouchView(View touchView) {
    this.touchView = touchView;
    touchView.setOnTouchListener(this);
  }


  public View getTouchView() {
    return touchView;
  }


  /**
   * 滚动出界面
   */
  private void scrollRight() {
    final int delta = (viewWidth + mParentView.getScrollX());
// 调用startScroll方法来设置一些滚动的参数,我们在computeScroll()方法中调用scrollTo来滚动item
    mScroller.startScroll(mParentView.getScrollX(), 0, -delta + 1, 0,
        Math.abs(delta));
    postInvalidate();
  }


  /**
   * 滚动到起始位置
   */
  private void scrollOrigin() {
    int delta = mParentView.getScrollX();
    mScroller.startScroll(mParentView.getScrollX(), 0, -delta, 0,
        Math.abs(delta));
    postInvalidate();
  }


  /**
   * touch的View是否是AbsListView, 例如ListView, GridView等其子类
   *
   * @return
   */
  private boolean isTouchOnAbsListView() {
    return touchView instanceof AbsListView ? true : false;
  }


  /**
   * touch的view是否是ScrollView或者其子类
   *
   * @return
   */
  private boolean isTouchOnScrollView() {
    return touchView instanceof ScrollView ? true : false;
  }


  @Override
  public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction()) {
      case MotionEvent.ACTION_DOWN:
        downX = tempX = (int) event.getRawX();
        downY = (int) event.getRawY();
        break;
      case MotionEvent.ACTION_MOVE:
        int moveX = (int) event.getRawX();
        int deltaX = tempX - moveX;
        tempX = moveX;
        if (Math.abs(moveX - downX) > mTouchSlop
            && Math.abs((int) event.getRawY() - downY) < mTouchSlop) {
          isSilding = true;


// 若touchView是AbsListView,
// 则当手指滑动,取消item的点击事件,不然我们滑动也伴随着item点击事件的发生
          if (isTouchOnAbsListView()) {
            MotionEvent cancelEvent = MotionEvent.obtain(event);
            cancelEvent
                .setAction(MotionEvent.ACTION_CANCEL
                    | (event.getActionIndex() << MotionEvent.ACTION_POINTER_INDEX_SHIFT));
            v.onTouchEvent(cancelEvent);
          }


        }


        if (moveX - downX >= 0 && isSilding) {
          mParentView.scrollBy(deltaX, 0);


// 屏蔽在滑动过程中ListView ScrollView等自己的滑动事件
          if (isTouchOnScrollView() || isTouchOnAbsListView()) {
            return true;
          }
        }
        break;
      case MotionEvent.ACTION_UP:
        isSilding = false;
        if (mParentView.getScrollX() <= -viewWidth / 2) {
          isFinish = true;
          scrollRight();
        } else {
          scrollOrigin();
          isFinish = false;
        }
        break;
    }


// 假如touch的view是AbsListView或者ScrollView 我们处理完上面自己的逻辑之后
// 再交给AbsListView, ScrollView自己处理其自己的逻辑
    if (isTouchOnScrollView() || isTouchOnAbsListView()) {
      return v.onTouchEvent(event);
    }


// 其他的情况直接返回true
    return true;
  }


  @Override
  public void computeScroll() {
// 调用startScroll的时候scroller.computeScrollOffset()返回true,
    if (mScroller.computeScrollOffset()) {
      mParentView.scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
      postInvalidate();


      if (mScroller.isFinished()) {


        if (onSildingFinishListener != null && isFinish) {
          onSildingFinishListener.onSildingFinish();
        }
      }
    }
  }

  public interface OnSildingFinishListener {
    public void onSildingFinish();
  }
}

2.Acitity

在Activity的onCreate()方法里面  

 @Override
  public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
    super.onCreate(savedInstanceState, persistentState);
    SildingFinishLayout mSildingFinishLayout = (SildingFinishLayout) findViewById(R.id.timed_task_SildingFinishLayout);
mSildingFinishLayout
    mSildingFinishLayout .setOnSildingFinishListener(new SildingFinishLayout.OnSildingFinishListener() {
      @Override
      public void onSildingFinish() {
        finish();
      }
    });
    mSildingFinishLayout .setTouchView(mSildingFinishLayout);//绑定底层的布局就可以了 :不起作用的话换个你activity 布局里面view就可以啦 
  }

截止目前,这个功能已经实现了

解决问题:这个会出现左滑 背景白色问题

1.style.xml中中增加

<style name="AppTheme" parent="android:Theme.Light">
  <item name="android:windowIsTranslucent">true</item>
  <item name="android:windowNoTitle">true</item>
  <item name="android:windowBackground">@android:color/transparent</item>
</style>

2 acvitiy 的属性中加上

android:theme="@style/AppTheme" 

3 一些属性的详解

<item name="android:windowFrame">@null</item> :Dialog的windowFrame框为无
<item name="android:windowIsFloating">true</item>:是否浮现在activity之上
<item name="android:windowIsTranslucent">false</item>:是否半透明
<item name="android:windowNoTitle">true</item>:是否显示title
<item name="android:windowBackground">@drawable/dia_bg</item>:设置dialog的背景
<item name="android:backgroundDimEnabled">false</item>: 背景是否透明显示

到此这篇关于Android实现左滑退出Activity的完美封装的文章就介绍到这了,更多相关Android 左滑退出Activity内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android中悬浮窗口的实现原理实例分析

    Android中悬浮窗口的实现原理实例分析

    这篇文章主要介绍了Android中悬浮窗口的实现原理,以实例形式较为详细的分析了Android悬浮窗口的原理与具体实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • android BitmapFactory.Options使用方法详解

    android BitmapFactory.Options使用方法详解

    这篇文章主要为大家详细介绍了android BitmapFactory.Options使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • Google大佬都用的广播goAsync源码分析

    Google大佬都用的广播goAsync源码分析

    这篇文章主要为大家介绍了Google大佬都用的广播 goAsync源码分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • Android存储访问框架的使用小结

    Android存储访问框架的使用小结

    这篇文章主要介绍了Android存储访问框架的使用,存储访问框架API和MediaStore API的差异,在于存储访问框架API,是基于系统文件选择框的,用户选择了文件,那么相当于授权了, 可以访问所有类型的文件,需要的朋友可以参考下
    2022-01-01
  • android如何获取经纬度

    android如何获取经纬度

    这篇文章主要为大家详细介绍了android获取经纬度的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • 详解Android Studio 3.0的新特性与适配

    详解Android Studio 3.0的新特性与适配

    这篇文章主要介绍了详解Android Studio 3.0的新特性与适配,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • App中如何获取gradle的配置信息

    App中如何获取gradle的配置信息

    这篇文章主要给大家介绍了关于App中如何获取gradle的配置信息的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-02-02
  • Android启动页设置及动态权限跳转问题解决

    Android启动页设置及动态权限跳转问题解决

    在我遇到这个实际问题之前,我一直认为启动页的作用是美化产品,提升软件逼格。但实际上,它更重要的是起到了一个拦截器的作用,这篇文章主要介绍了Android启动页设置以及动态权限跳转,需要的朋友可以参考下
    2022-04-04
  • Android WebView无法弹出软键盘的原因及解决办法

    Android WebView无法弹出软键盘的原因及解决办法

    这篇文章主要介绍了Android WebView无法弹出软键盘的原因及解决办法的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • Android中SurfaceView和view画出触摸轨迹

    Android中SurfaceView和view画出触摸轨迹

    这篇文章主要介绍了Android中SurfaceView和view画出触摸轨迹的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-03-03

最新评论