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

Android微信右滑退出功能的实现代码,第1张

概述先给大家展示下效果图,如果大家感觉效果不错,请参考实例代码, act2是Main2Activity,act3是Main3Activity

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

@H_419_1@ @H_419_1@

act2是Main2Activity,act3是Main3Activity@H_419_1@

原理@H_419_1@

滚动@H_419_1@

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

@H_419_1@ @H_419_1@

DecorVIEw@H_419_1@

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

使上一个Activity可见@H_419_1@

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

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

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

实现@H_419_1@

第一步设置透明主题@H_419_1@

<!-- 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背景色去掉了。@H_419_1@

滚动DecorVIEw内容@H_419_1@

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

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

Main3Activity.java@H_419_1@

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); }}

写在最后@H_419_1@

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

总结@H_419_1@

以上所述是小编给大家介绍的AndroID微信右滑退出功能的实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程小技巧网站的支持!@H_419_1@ 您可能感兴趣的文章:Android仿微信滑动退出ActivityAndroid应用退出登录的实现方法 总结

以上是内存溢出为你收集整理的Android微信右滑退出功能的实现代码全部内容,希望文章能够帮你解决Android微信右滑退出功能的实现代码所遇到的程序开发问题。

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

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存