Android微信右滑退出功能的实现代码

 更新时间:2018年01月22日 15:30:44   作者:August1996  
这篇文章主要介绍了Android微信右滑退出功能的实现代码,非常不错,具有参考借鉴价值,需要的朋友可以参考下

先给大家展示下效果图,如果大家感觉效果不错,请参考实例代码,

 

act2是Main2Activity,act3是Main3Activity

原理

滚动

首先我们知道每个Activity展示的内容一般都是DecorView去承载的,不知道的看下图,其中状态栏背景也包括在内:

 

DecorView

所以我们第一步,只需要滚动DecorView内容或者平移DecorView就行了。

使上一个Activity可见

上面的Activity不可见其实是因为被当前Activity给挡住了。那问题来了。

Q:为什么我把布局颜色设置成透明背景,可还是看不到上面的Activity呢?

A:看上面的DecorView那张图,我们Activity布局只是填充content里面的内容,也就是说我们是被ContentFrameLayout包裹住的,Activity布局文件的根元素并不是Activity的根元素,由层级可知。 我们的Activity被上层的Activity挡住,其实是因为DecorView具有背景颜色,我们只需要把它的背景色去掉就行了。

实现

第一步设置透明主题

<!-- Base application theme. -->
 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
  <!-- Customize your theme here. -->
  <item name="colorPrimary">@color/colorPrimary</item>
  <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
  <item name="colorAccent">@color/colorAccent</item>
 </style>
 <style name="CustomTheme" parent="AppTheme">
  <item name="android:windowIsTranslucent">true</item>
  <item name="android:windowBackground">@android:color/transparent</item>
 </style>
<activity android:name=".Main2Activity">
   <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
   </intent-filter>
  </activity>
  <activity
   android:name=".Main3Activity"
   android:theme="@style/CustomTheme" />

我们把Main3Activity的DecorView背景色去掉了。

滚动DecorView内容

这里我们使用滚动DecorView内容而不是滚动整个DecorView。

首先大家需要搞懂一个View的 ScrollBy 和 ScrollTo 是什么回事,参考 Android scrollTo和scrollBy方法使用说明

Main3Activity.java

public class Main3Activity extends AppCompatActivity {
 /**
  * DecorView左边滑出间距占屏幕宽度PRESENT_TO_FINISH时表示用户需要退出当前Activity
  */
 private static final float PRESENT_TO_FINISH = 0.3f;
 /**
  * 用户距离左边MIN_EDGE_DISTANCE内拖动有效
  */
 private static final int MIN_EDGE_DISTANCE = 100;
 /**
  * 屏幕宽度
  */
 private static float mScreenW = -1;
 /**
  * 用户计算用户在屏幕滑动的距离
  */
 private float mStartX = 0;
 /**
  * 当前是否允许拖动
  */
 private boolean mIsScrollEnable = false;
 /**
  * 当前Activity的DecorView
  */
 private View mDecorView;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main3);
  // 初始化
  mDecorView = getWindow().getDecorView();
  if (mScreenW == -1) {
   DisplayMetrics metrics = new DisplayMetrics();
   getWindowManager().getDefaultDisplay()
     .getMetrics(metrics);
   mScreenW = metrics.widthPixels;
  }
 }
 @Override
 public boolean onTouchEvent(MotionEvent event) {
  if (event.getAction() == MotionEvent.ACTION_DOWN) {
   mStartX = event.getX();
   if (mStartX < MIN_EDGE_DISTANCE) {
    // 距离左边距离足够小,设置为可拖动状态
    mIsScrollEnable = true;
   }
  } else if (event.getAction() == MotionEvent.ACTION_MOVE && mIsScrollEnable) {
   // 滚动DecorView内容
   float dX = event.getX() - mStartX;
   mStartX = event.getX();
   mDecorView.scrollBy((int) -dX, 0);
   return true;
  } else if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) {
   // 触摸操作取消,重置
   mIsScrollEnable = false;
   // 根据当前滑动状态判断最终是滑到左边还是滑到右边(结束Activity)
   final int targetX = -mDecorView.getScrollX() / mScreenW > PRESENT_TO_FINISH ? (int) -mScreenW : 0;
   ValueAnimator animator = ValueAnimator.ofInt(mDecorView.getScrollX(), targetX);
   animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
     mDecorView.scrollTo((Integer) animation.getAnimatedValue(), 0);
    }
   });
   animator.addListener(new Animator.AnimatorListener() {
    @Override
    public void onAnimationStart(Animator animation) {
    }
    @Override
    public void onAnimationEnd(Animator animation) {
     if (targetX == -mScreenW) {
      finish();
     }
    }
    @Override
    public void onAnimationCancel(Animator animation) {
    }
    @Override
    public void onAnimationRepeat(Animator animation) {
    }
   });
   animator.start();
  }
  return super.onTouchEvent(event);
 }
}

写在最后

这是最简单最简单的做法,无任何封装与扩展,包括一些可能存在的滚动冲突也没有去处理。大家可以封装一个比较完善并且容易使用的库,加入ListView之类的滑动冲突处理以及背景色透明渐变之类的,然后里面的xml代码转换成对应deJava代码写法。一句话使Activity实现该功能也是可以做到的。

总结

以上所述是小编给大家介绍的Android微信右滑退出功能的实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Android自定义Dialog实现加载对话框效果

    Android自定义Dialog实现加载对话框效果

    这篇文章将介绍如何定制当今主流的对话框,通过自定义dialog实现加载对话框效果,具体实现代码大家通过本文学习吧
    2018-05-05
  • Android编程中ViewPage判断左右滑动方向的方法

    Android编程中ViewPage判断左右滑动方向的方法

    这篇文章主要介绍了Android编程中ViewPage判断左右滑动方向的方法,涉及Android中ViewPage针对滑动判定的相关技巧,非常简单实用,需要的朋友可以参考下
    2015-10-10
  • Android 基于Bitmap的四种图片压缩方式

    Android 基于Bitmap的四种图片压缩方式

    本文中探究的图片压缩方式主要是基于 Bitmap 的 api 实现。文中探究实现的压缩方式有四种:质量压缩、采样率压缩、Matrix 缩放压缩、图片编码格式压缩,感兴趣的朋友可以参考下
    2021-05-05
  • Android创建Alert框的方法

    Android创建Alert框的方法

    这篇文章主要介绍了Android创建Alert框的方法,实例分析了Android创建alert弹出窗口的相关技巧,需要的朋友可以参考下
    2015-07-07
  • Android Http实现文件的上传和下载

    Android Http实现文件的上传和下载

    这篇文章主要为大家详细介绍了Android Http实现文件的上传和下载,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • Android编程中关于单线程模型的理解与分析

    Android编程中关于单线程模型的理解与分析

    这篇文章主要介绍了Android编程中关于单线程模型的理解与分析,较为详细的分析了Android编程中关于单线程的原理与相关使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • Android中AsyncTask的用法实例分享

    Android中AsyncTask的用法实例分享

    AsyncTask的特点是任务在主线程之外运行,而回调方法是在主线程中执行, 这就有效地避免了使用Handler带来的麻烦
    2014-02-02
  • Android实现TCP客户端支持读写操作

    Android实现TCP客户端支持读写操作

    这篇文章主要介绍了Android-实现TCP客户端,支持读写操作,主要是通过socket读写tcp,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • android获取屏幕像素思路及代码

    android获取屏幕像素思路及代码

    本文为大家详细介绍下android是怎样获取屏幕像素的,感兴趣的各位可以参考下哈,希望对你学习android有所帮助
    2013-04-04
  • Android中的图片优化完全指南

    Android中的图片优化完全指南

    这篇文章主要给大家介绍了关于Android中图片优化的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11

最新评论