Android使用SlidingPaneLayout 实现仿微信的滑动返回

上周,公司的项目改版要求加上一个右滑返回上一个界面,于是就在网上找了一些开源库打算实现.但是在使用的时候遇见了许多的问题.试了两天用过 https://github.com/ikew0ng/SwipeBackLayout , https://github.com/r0adkll/Slidr 等库都没成功.

然后在//www.jb51.net/article/138869.htm看见了使用SlidingPaneLayout 来实现的一个滑动返回案例然后就看了看发现不错于是就使用了这个.

虽然上面链接里面已近写好啦.但是还是写一下代码:

先看看最终效果:

实现如下:

主要是在baesActivity里面

public class BaesActivity extends AppCompatActivity implements SlidingPaneLayout.PanelSlideListener{
 @Override
 protected void onCreate(@Nullable Bundle savedInstanceState) {
 initSlideBackClose();//滑动返回的设置
 super.onCreate(savedInstanceState);
 }
 private void initSlideBackClose() {
 if (isSupportSwipeBack()) {
  SlidingPaneLayout slidingPaneLayout = new SlidingPaneLayout(this);
  // 通过反射改变mOverhangSize的值为0,
  // 这个mOverhangSize值为菜单到右边屏幕的最短距离,
  // 默认是32dp,现在给它改成0
  try {
  Field overhangSize = SlidingPaneLayout.class.getDeclaredField("mOverhangSize");
  overhangSize.setAccessible(true);
  overhangSize.set(slidingPaneLayout, 0);
  } catch (Exception e) {
  e.printStackTrace();
  }
  slidingPaneLayout.setPanelSlideListener(this);
  slidingPaneLayout.setSliderFadeColor(getResources()
   .getColor(android.R.color.transparent));
  // 左侧的透明视图
  View leftView = new View(this);
  leftView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
  slidingPaneLayout.addView(leftView, 0);
  ViewGroup decorView = (ViewGroup) getWindow().getDecorView();
  // 右侧的内容视图
  ViewGroup decorChild = (ViewGroup) decorView.getChildAt(0);
  decorChild.setBackgroundColor(getResources()
   .getColor(android.R.color.white));
  decorView.removeView(decorChild);
  decorView.addView(slidingPaneLayout);
  // 为 SlidingPaneLayout 添加内容视图
  slidingPaneLayout.addView(decorChild, 1);
 }
 }
 //设置是否使用滑动返回
 protected boolean isSupportSwipeBack() {
 return true;
 }
 @Override
 public void onPanelSlide(View panel, float slideOffset) {
 }
 @Override
 public void onPanelOpened(View panel) {
 finish();
 }
 @Override
 public void onPanelClosed(View panel) {
 }
}

然后让Acitivity继承baesActivity就可以了

public class MainActivity extends BaesActivity

看看效果

怎么会这样!

然后就去看看那需要改动,发现在BaesActivity里面写了一个方法:

 //设置是否使用滑动返回
 protected boolean isSupportSwipeBack() {
 return true;
 }

在不需要返回的界面重写此方法并返回 false,就行了向这样

 @Override
 protected boolean isSupportSwipeBack() {
 return false;
 }

主界面不滑动的问题解决了,但是还有一个问题在滑动的时候左边显示的是一个白板,这怎么破?

这就要设置  activity 的 style了 在AndroidManifest.xml 文件里面找到 application 就是黄色那行,跳进去

 <application
 android:name=".MyApplication"
 android:allowBackup="true"
 android:icon="@mipmap/ic_launcher"
 android:label="@string/app_name"
 android:roundIcon="@mipmap/ic_launcher_round"
 android:supportsRtl="true"
 android:theme="@style/AppTheme">//设置样式
 <activity android:name=".MainActivity">
  <intent-filter>
  <action android:name="android.intent.action.MAIN" />

  <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
 </activity>
 <activity android:name=".TwoActivity"/>
 <activity android:name=".ThreeActivity"/>
 </application>

设置styles.xml ,添加黄色部分的内容

 <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>
 <!--设置窗口背景为透明-->
 <item name ="android:windowIsTranslucent">true</item>
 <item name="android:windowBackground">@android:color/transparent</item>
 </style>

运行起来:

偶买噶! 我的首页怎么变成这样了,透明了?怎么办,

小事,因为我们设置了上面那两行的原因,现在只要把界面的根布局里面添加一个背景色就行了

<android.support.constraint.ConstraintLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
 android:background="#f2f2f2"
 tools:context="com.mvp.tl.myslidingpanelayoutdemo.MainActivity">
 <Button
 android:id="@+id/next"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="第一个,下一界面"
 app:layout_constraintBottom_toBottomOf="parent"
 app:layout_constraintLeft_toLeftOf="parent"
 app:layout_constraintRight_toRightOf="parent"
 app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>

OK,初步实现就这样了,但是这效果也太丑了吧!

嗯,现在来改改Activity的开启关闭的样式

还是在styles.xml 进行修改<resources>

 <!-- 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>
 <!--设置窗口背景为透明-->
 <item name ="android:windowIsTranslucent">true</item>
 <item name="android:windowBackground">@android:color/transparent</item>
 <!--activity启动关闭样式-->
 <item name="android:windowAnimationStyle">@style/activityAnimation</item>
 </style>
 <!--activity启动关闭动画-->
<style name="activityAnimation" parent="@android:style/Animation">
<item name="android:activityOpenEnterAnimation">@anim/in_from_right</item>
<item name="android:activityCloseExitAnimation">@anim/out_to_left</item>
</style> 

anim/in_from_right.xml和anim/out_to_left在

进行设置:

in_from_right.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
 <translate
 android:duration="500"
 android:fillAfter="true"
 android:fromXDelta="100%p"
 android:interpolator="@android:anim/accelerate_interpolator"
 android:toXDelta="0" />
</set>

out_to_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
 <translate
 android:duration="500"
 android:fillAfter="true"
 android:fromXDelta="0"
 android:interpolator="@android:anim/accelerate_interpolator"
 android:toXDelta="100%p" />
</set>

然后看看效果

OK,效果出来了.但是当它遇到ViewPager的时候呢?

怎么这样,ViewPager的右滑无法使用了,SlidingPaneLayout的右滑抢了ViewPager的滑动事件.怎么办

自定义SlidingPaneLayout

import android.content.Context;
import android.support.v4.view.MotionEventCompat;
import android.support.v4.widget.SlidingPaneLayout;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ViewConfiguration;
/*
在使用侧滑菜单的时候如果主界面中有ViewPager的时候调用该自定义控件,避免二者的冲突事件的发生
 */
public class PageEnabledSlidingPaneLayout extends SlidingPaneLayout {
 private float mInitialMotionX;
 private float mInitialMotionY;
 private float mEdgeSlop;//手滑动的距离
 public PageEnabledSlidingPaneLayout(Context context) {
 this(context, null);
 }
 public PageEnabledSlidingPaneLayout(Context context, AttributeSet attrs) {
 this(context, attrs, 0);
 }
 public PageEnabledSlidingPaneLayout(Context context, AttributeSet attrs, int defStyle) {
 super(context, attrs, defStyle);
 ViewConfiguration config = ViewConfiguration.get(context);
 mEdgeSlop = config.getScaledEdgeSlop();//getScaledTouchSlop是一个距离
 }
 @Override
 public boolean onInterceptTouchEvent(MotionEvent ev) {
 switch (MotionEventCompat.getActionMasked(ev)) {
  case MotionEvent.ACTION_DOWN: {
  mInitialMotionX = ev.getX();
  mInitialMotionY = ev.getY();
  break;
  }
  case MotionEvent.ACTION_MOVE: {
  final float x = ev.getX();
  final float y = ev.getY();
  // The user should always be able to "close" the pane, so we only check
  // for child scrollability if the pane is currently closed.
  if (mInitialMotionX > mEdgeSlop && !isOpen() && canScroll(this, false,
   Math.round(x - mInitialMotionX), Math.round(x), Math.round(y))) {
   // How do we set super.mIsUnableToDrag = true?
   // send the parent a cancel event
   MotionEvent cancelEvent = MotionEvent.obtain(ev);
   cancelEvent.setAction(MotionEvent.ACTION_CANCEL);
   return super.onInterceptTouchEvent(cancelEvent);
  }
  }
 }
 return super.onInterceptTouchEvent(ev);
 }
}

并用其替换BaesActivity 里面的SlidingPaneLayout 就可以了

OK,最终效果就这样完成了.

总结

以上所述是小编给大家介绍的Android使用SlidingPaneLayout 实现仿微信的滑动返回效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Android仿考拉全局滑动返回及联动效果的实现方法

    前言 首次通过右滑来返回到上一个页面的操作是在 IOS7上出现.到目前android应用上支持这种操作的依然不多.分析其主要原因应该是android已有实体的返回按键,这样的功能变得不重要,但我觉得有这样的功能便于单手操作,能提升app的用户体验,特别是从ios转到android的用户.写这篇博文希望可以对大家有所帮助,希望自己的app上有滑动返回功能的可以参考下. 原理的简单描述 Android系统里有很多滑动相关的API和类,比如ViewDragHelper就是一个很好的滑动助手类.首先设置

  • Android 再按一次返回键退出程序实现思路

    用户退出应用前给出一个提示是很有必要的,因为可能是用户并不真的想退出,而只是一不小心按下了返回键,大部分应用的做法是在应用退出去前给出一个Dialog,我觉得这样不太友好,用户还得移动手指去按dialog中的按钮.个人觉得"再按一次返回键退出程序"是best practice,实现也很简单,直接上代码: 复制代码 代码如下: private long exitTime = 0; @Override public boolean onKeyDown(int keyCode, KeyEve

  • Android 滑动返回Activity的实现代码

    Android 滑动返回Activity的实现代码 近来玩微信的时候偶然发现,向左滑动朋友圈竟然可以返回主页,故引起兴趣特研究 代码很简洁 package com.example.wyj.cainiaoshopping.activity; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import com.

  • Android开发笔记之:返回键的复写onBackPressed()介绍

    在android开发中,当不满足触发条件就按返回键的时候,就要对此进行检测.尤其是当前Activity需要往前一个Activity传送消息时.即Activity1跳转到Activity3如果采用的是startActivityForResult这种方式,如果不重写返回键,程序不知道要返回给Activity1什么内容就会报错.因此,必须对Activity3的返回按键重写,这里让他传一个"ERROR"信息: 复制代码 代码如下: @Override    public void onBack

  • Android返回键功能的实现方法

    本文实例讲述了Android返回键功能的实现方法.分享给大家供大家参考.具体如下: 在开发android应用时,常常通过按返回键(即keyCode == KeyEvent.KEYCODE_BACK)就能关闭程序,其实大多情况下并没有关闭改应用 我们可以这样做,当用户点击自定义的退出按钮或返回键时(需要捕获动作),我们在onDestroy()里强制退出应用,或直接杀死进程,具体操作代码如下: public boolean onKeyDown(int keyCode, KeyEvent event)

  • Android双击返回键退出程序的实现方法

    本文实例讲述了Android双击返回键退出程序的实现方法,是Android程序开发中一个非常实用的功能,分享给大家供大家参考之用.具体方法如下: 一.实现思路: 用户按下返回键时设定一个定时器来监控是否2秒内实现了退出,如果用户没有接着按返回键,则清除第一次按返回键的效果,使程序还原到第一次按下返回键之前的状态.定时器是每次用户按下返回键才去创建. 二.功能代码: /** * 菜单.返回键响应 */ @Override public boolean onKeyDown(int keyCode,

  • Android中让按钮拥有返回键功能的方法及重写返回键功能

    让按钮拥有返回键的功能很简单,在点击事件加上finish();就OK了. 如: 复制代码 代码如下: public void onClick(View v){ finish(); } finish() 仅仅是把activity从当前的状态退出,但是资源并没有给清理. 其实android的机制决定了用户无法完全退出application,即使用System.exit(). android自己决定何时该从内存中释放程序,当系统没有可用内存时,就会按照一定的优先级来销毁应用程序. android手机操

  • android监听返回按钮事件的方法

    本文实例讲述了android监听返回按钮事件的方法.分享给大家供大家参考.具体如下: 用户在点击手机的返回按钮时,默认是推出当前的activty,但是有时用户不小心按到返回,所以需要给用户一个提示,这就需要重写onkeydown事件,实现的效果如下: java代码如下: @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.l

  • Android使用SlidingPaneLayout 实现仿微信的滑动返回

    上周,公司的项目改版要求加上一个右滑返回上一个界面,于是就在网上找了一些开源库打算实现.但是在使用的时候遇见了许多的问题.试了两天用过 https://github.com/ikew0ng/SwipeBackLayout , https://github.com/r0adkll/Slidr 等库都没成功. 然后在//www.jb51.net/article/138869.htm看见了使用SlidingPaneLayout 来实现的一个滑动返回案例然后就看了看发现不错于是就使用了这个. 虽然上面链

  • Android仿微信activity滑动关闭效果

    Android仿微信activity滑动关闭功能 1.利用具体利用v4包下的slidingPaneLayout实现透明的activity,代码如下: BaseActivity: public class BaseSlideCloseActivity extends AppCompatActivity implements SlidingPaneLayout.PanelSlideListener { @Override protected void onCreate(Bundle savedIns

  • Android仿微信通讯录滑动快速定位功能

    先给大家展示下效果图: 实现代码如下: 下面简单说下实现原理. public class IndexBar extends LinearLayout implements View.OnTouchListener { private static final String[] INDEXES = new String[]{"#", "A", "B", "C", "D", "E", &qu

  • Android仿微信左右滑动点击切换页面和图标

    本文实例为大家分享了Android仿微信左右滑动点击切换页面和图标的具体代码,供大家参考,具体内容如下 目标效果: 使用鼠标滑动屏幕或者点击下边的小图标,可以更改页面和图标,因为没有那么多素材所以只用了两张图片区分. 1.layout文件夹下新建top.xml页面,作为顶部标题. top.xml页面: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="h

  • Android仿微信右滑返回功能的实例代码

    先上效果图,如下: 先分析一下功能的主要技术点,右滑即手势判断,当滑到一直距离时才执行返回,并且手指按下的位置是在屏幕的最左边(这个也是有一定范围的),  这些可以实现onTouchEvent来实现. 接着就是返回时,有滑动效果,很显然这个是Acitivty切换动画实现的.好啦,分析完了就开干.下面上代码: @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()){ case Mot

  • Android中使用PopupWindow 仿微信点赞和评论弹出

    微信朋友圈的点赞和评论功能,有2个组成部分:左下角的"更多"按钮:点击该按钮后弹出的对话框: PopupWindow,弹出框使用PopupWindow实现,这是点赞和评论的载体,具体要涉及 PopupWindow 点击非窗口位置和再次点击消失以及显示位置的问题(根据相应更多按钮的位置确定 PopupWindow 的显示位置 package com.example.cmm.helloworld; import android.app.AlertDialog; import android

  • android 中viewpager+fragment仿微信底部TAG完美渐变

    viewpager+fragment仿微信底部TAG完美渐变,在图片渐变的同时字的颜色也在变,注意,是渐变哦! 效果图: activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:zhy="http://schemas.android.com/apk/res/com.Sing.weixin" xmlns:tools="

  • Android仿微信列表滑动删除之可滑动控件(一)

    这次是列表滑动删除的第三波,仿微信的列表滑动删除.先上个效果图: 前面的文章里面说过开源框架SwipeListView的实现原理是每个列表item中包含上下两层view,普通状态下上层的view覆盖着下层的view,当用户滑开上层的view,下层的view就显示出来了.但是仔细观察微信列表的item,很明显并非这个实现方案,微信的item应该一个单层view,只不过这个item超出了所在的ListView的宽度,在用户滑动item的时候,item超出屏幕的view则会显示在屏幕之上,这种滑动实现

  • Android仿微信列表滑动删除 如何实现滑动列表SwipeListView

    接上一篇,本篇主要讲如何实现滑动列表SwipeListView. 上篇完成了滑动控件SwipeItemView,这个控件是一个自定义的ViewGroup,作为列表的一个item,为列表提供一些方法让这个SwipeItemView能滑动其视图内容,同时滑动过程中会有顺滑的动画效果.而本篇讲的SwipeListView则是这个列表的具体实现了.当然啦,这个SwipeListView继承自ListView,为了实现我们需要的功能,重点就是重写ListView的onTouchEvent()以及onInt

  • Android用ActionBar高仿微信主界面的实例代码

    经过前面两篇文章的学习,我想大家对ActionBar都已经有一个相对较为深刻的理解了.唯一欠缺的是,前面我们都只是学习了理论知识而已,虽然知识点已经掌握了,但是真正投入到项目实战当中时会不会掉链子还很难说.那么不用担心,本篇文章我就将带领大家一起进入ActionBar的应用实战,将理论和实践完美结合到一起. 如果你还没有看过我的前两篇文章,建议先去阅读一下 Android ActionBar完全解析使用官方推荐的最佳导航栏(上)和 Android ActionBar完全解析使用官方推荐的最佳导航

随机推荐