转载请标明出处:

http://blog.csdn.net/hanhailong726188/article/details/46453627

本文出自:【海龙的博客】

一、概述

在上一篇博文中,博文地址Android-通过SlidingPaneLayout高仿微信6.2最新版手势滑动返回(一),我们是通过官方自带的SlidingPaneLayout来实现的手势滑动返回。在这篇博文中,我们将採用SlidingMenu来高仿。

事实上实现的原理都一样。仅仅只是是把SlidingPaneLayout换成SlidingMenu而已,只是SlidingMenu本身的功能比官方自带的强大,不仅能够实现像微信一样的边缘滑动返回,还支持全屏幕滑动返回。

你还能够加入动画效果。只是这里笔者业务时间不多。这里就没有实现!

首先来看一下效果图,一个是边缘滑动的,一个是全屏幕滑动,效果很赞。比我们上一篇博文中实现的还要给力些!

  • 边缘滑动效果图
  • 全屏幕滑动效果图

以下我们从头開始一步一步来实现这个手势滑动返回效果,从新建project到引入SlidingMenu,然后通过改动Activity主题样式、抽取出实现SwipeBack的父类BaseSwipeBackActivity等等

二、以下開始进入主题

首先肯定是通过AndroidStudio新建一个SlidingMenuSwipeBackDemoproject,然后把下好的SlidingMenu库移到项目中,在settings.gradle文件加入这个库,并在app内的build.gradle加入这个库依赖

settings.gradle

include ‘:app’

include ‘:SlidingLibrary’

app内的build.gradle

compile project(":SlidingLibrary")

这里我把SlidingMenu的库名称改成SlidingLibrary了。项目就差点儿相同建好了,见效果图:


下一步就是把我们上个博文中的一些用到的资源文件拷过来,如须要用到的动画资源slide_in_right.xml、slide_out_right.xml、styles.xml,这里初略的展示下styles.xml文件内容,代码例如以下:

<style name="JK.SwipeBack.Transparent.Theme" parent="AppTheme">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowAnimationStyle">@style/JK.Animation.SlidingBack</item>
<item name="android:actionBarStyle">@style/JKActionBar.Custom</item>
</style> <style name="JKActionBar.Custom" parent="@style/Widget.AppCompat.Light.ActionBar.Solid.Inverse">
<item name="displayOptions">showCustom</item>
<item name="android:background">@android:color/transparent</item>
<item name="background">@android:color/transparent</item>
<item name="android:displayOptions" tools:ignore="NewApi">showCustom</item>
<item name="android:height">? actionBarSize</item>
</style> <style name="JK.Animation.SlidingBack" parent="@android:style/Animation.Activity">
<item name="android:activityOpenEnterAnimation">@anim/slide_in_right</item>
<item name="android:activityOpenExitAnimation">@anim/slide_out_right</item>
<item name="android:activityCloseEnterAnimation">@anim/slide_in_right</item>
<item name="android:activityCloseExitAnimation">@anim/slide_out_right</item>
<item name="android:wallpaperOpenEnterAnimation">@anim/slide_in_right</item>
<item name="android:wallpaperOpenExitAnimation">@anim/slide_out_right</item>
<item name="android:wallpaperCloseEnterAnimation">@anim/slide_in_right</item>
<item name="android:wallpaperCloseExitAnimation">@anim/slide_out_right</item>
<item name="android:wallpaperIntraOpenEnterAnimation">@anim/slide_in_right</item>
<item name="android:wallpaperIntraOpenExitAnimation">@anim/slide_out_right</item>
<item name="android:wallpaperIntraCloseEnterAnimation">@anim/slide_in_right</item>
<item name="android:wallpaperIntraCloseExitAnimation">@anim/slide_out_right</item>
</style>

接下来我们创建BaseSwipeBackActivity这个基类。全部实现手势滑动返回的类继承自它就OK了,不须要手势滑动的不须要继承它。大招来了,看BaseSwipeBackActivity源代码文件。由于代码凝视的比較具体,这里我就直接贴代码了,代码很的简单

package com.hhl.slidingmenuswipebackdemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup; import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
import com.jeremyfeinstein.slidingmenu.lib.app.SlidingActivityHelper; /**
* Created by hailonghan on 15/6/11.
*/
public abstract class BaseSwipeBackActivity extends AppCompatActivity implements SlidingMenu.OnOpenedListener { private SlidingActivityHelper mHelper;
//SlidingMenu
private SlidingMenu mSlidingMenu; @Override
protected void onCreate(Bundle savedInstanceState) {
mHelper = new SlidingActivityHelper(this);
mHelper.onCreate(savedInstanceState); //这里借用了SlidingMenu的setBehindContentView方法来设置一个透明菜单
View behindView = new View(this);
behindView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
behindView.setBackgroundColor(getResources().getColor(android.R.color.transparent));
setBehindContentView(behindView); mSlidingMenu = getSlidingMenu();
//设置阴影宽度为10个px
mSlidingMenu.setShadowWidth(10);
//设置阴影
mSlidingMenu.setShadowDrawable(R.drawable.slide_shadow);
//设置以下的布局,也就是我们上面定义的透明菜单离右边屏幕边缘的距离为0,也就是滑动开以后菜单会全屏幕显示
mSlidingMenu.setBehindOffset(0);
mSlidingMenu.setFadeDegree(0.35f);
//菜单打开监听。由于菜单打开后我们要finish掉当前的Activity
mSlidingMenu.setOnOpenedListener(this); //设置手势滑动方向。由于我们要实现微信那种右滑动的效果,这里设置成SlidingMenu.LEFT模式
mSlidingMenu.setMode(SlidingMenu.LEFT);
//由于微信是仅仅有边缘滑动。我们设置成TOUCHMODE_MARGIN模式,假设你想要全屏幕滑动,仅仅须要把这个改成TOUCHMODE_FULLSCREEN就OK了
mSlidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);
super.onCreate(savedInstanceState);
} @Override
public void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
mHelper.onPostCreate(savedInstanceState);
} @Override
public boolean onSupportNavigateUp() {
return true;
} @Override
public View findViewById(int id) {
View v = super.findViewById(id);
if (v != null)
return v;
return mHelper.findViewById(id);
} @Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mHelper.onSaveInstanceState(outState);
} @Override
public void setContentView(int id) {
setContentView(getLayoutInflater().inflate(id, null));
} @Override
public void setContentView(View v) {
setContentView(v, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
} @Override
public void setContentView(View v, ViewGroup.LayoutParams params) {
super.setContentView(v, params);
mHelper.registerAboveContentView(v, params);
} public void setBehindContentView(int id) {
setBehindContentView(getLayoutInflater().inflate(id, null));
} public void setBehindContentView(View v) {
setBehindContentView(v, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
} public void setBehindContentView(View v, ViewGroup.LayoutParams params) {
mHelper.setBehindContentView(v, params);
} public SlidingMenu getSlidingMenu() {
return mHelper.getSlidingMenu();
} public void toggle() {
mHelper.toggle();
} public void showContent() {
mHelper.showContent();
} public void showMenu() {
mHelper.showMenu();
} public void showSecondaryMenu() {
mHelper.showSecondaryMenu();
} public void setSlidingActionBarEnabled(boolean b) {
mHelper.setSlidingActionBarEnabled(b);
} @Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
boolean b = mHelper.onKeyUp(keyCode, event);
if (b) return b;
return super.onKeyUp(keyCode, event);
} //滑动全然打开菜单后结束掉当前的Activity
@Override
public void onOpened() {
this.finish();
} @Override
public void finish() {
super.finish();
this.overridePendingTransition(0, R.anim.slide_out_right);
}
}

这里须要注意的是。你假设想要边缘滑动返回,仅仅须要将SlidingMenu的滑动模式改成TOUCHMODE_MARGIN就能够了,全屏幕滑动的话改成TOUCHMODE_FULLSCREEN就OK了


写到这基本上就差点儿相同了,我感觉没啥难度的,就是把Activity的样式改成透明,抽取出一个父类BaseSwipeBackActivity。在父类里面加入SlidingMenu。将左菜单设置成透明,然后菜单全然打开后finish掉当前的Activity


最后附上github源代码下载地址github

Android-通过SlidingMenu高仿微信6.2最新版手势滑动返回(二)的更多相关文章

  1. Android-通过SlidingPaneLayout高仿微信6.2最新版手势滑动返回(一)

    近期更新了微信版本号到6.2.发现里面有个很好的体验,就是在第二个页面Activity能手势向右滑动返回,在手势滑动的过程中能看到第一个页面,这样的体验很赞,这里高仿了一下. 这里使用的是v4包里面的 ...

  2. Android -- 真正的 高仿微信 打开网页的进度条效果

    (本博客为原创,http://www.cnblogs.com/linguanh/) 目录: 一,为什么说是真正的高仿? 二,为什么要搞缓慢效果? 三,我的实现思路 四,代码,内含注释 五,使用方法与截 ...

  3. Android开发之高仿微信图片选择器

    记得刚开始做Andriod项目那会,经常会碰到一些上传图片的功能需求,特别是社交类的app,比如用户头像,说说配图,商品配图等功能都需要让我们到系统相册去选取图片,但官方却没有提供可以选取多张图片的相 ...

  4. Android ActionBar应用实战,高仿微信主界面的设计

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/26365683 经过前面两篇文章的学习,我想大家对ActionBar都已经有一个相对 ...

  5. Android高仿微信(一)——如何消除启动时的白屏

    默认情况下,APP启动时会先把屏幕刷成白色,然后才绘制第一个Activity中的View,这两个步骤之间的延迟会造成启动后先看到白屏(时间大概为1秒左右).时间不长,但是我们也看到,一般的APP时不存 ...

  6. Android 高仿微信实时聊天 基于百度云推送

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38799363 ,本文出自:[张鸿洋的博客] 一直在仿微信界面,今天终于有幸利用百 ...

  7. Android 高仿微信头像截取 打造不一样的自定义控件

    转载请表明出处:http://blog.csdn.net/lmj623565791/article/details/39761281,本文出自:[张鸿洋的博客] 1.概述 前面已经写了关于检测手势识别 ...

  8. android高仿微信拍照、多选、预览、删除(去除相片)相冊功能

    先声明授人与鱼不如授人与渔,仅仅能提供一个思路,当然须要源代码的同学能够私下有偿问我要源代码:QQ:508181017 工作了将近三年时间了,一直没正儿八经的研究系统自带的相冊和拍照,这回来个高仿微信 ...

  9. Android 高仿微信即时聊天 百度云为基础的推

    转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/38799363 ,本文出自:[张鸿洋的博客] 一直在仿微信界面,今天最终有幸利用百 ...

随机推荐

  1. 【CF1015A】Points in Segments(签到)

    题意:有一条上面有n个点的数轴,给定m次操作,每次覆盖(x[i],y[i]),求最后没有被覆盖过的点的数量与他们的编号 n,m<=100 思路: #include<cstdio> # ...

  2. jsp文件放在WebRoot下还是WebInfo下

    观点一:(较为赞同) 安全性不是真正的原因,因为jsp是要解析后才显示到浏览器的,即使用户知道你jsp的路径,也不可能通过浏览器看到jsp源码的,而如果是通过其它手段入侵服务器的话,放在WEB-INF ...

  3. VirtualBox 與 Vmware 差異

    VirtualBox 4.3.36_Ubuntu r105129 與 VMware® Workstation 12 Player  12.5.2 build-4638234, 分別在各自的 Ubunt ...

  4. AC日记——[CQOI2014]危桥 洛谷 P3163

    题目描述 Alice和Bob居住在一个由N座岛屿组成的国家,岛屿被编号为0到N-1.某些岛屿之间有桥相连,桥上的道路是双向的,但一次只能供一人通行.其中一些桥由于年久失修成为危桥,最多只能通行两次.A ...

  5. LA 2995 Image Is Everything

    题目链接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show ...

  6. 基于sklearn的分类器实战

    已迁移到我新博客,阅读体验更佳基于sklearn的分类器实战 完整代码实现见github:click me 一.实验说明 1.1 任务描述 1.2 数据说明 一共有十个数据集,数据集中的数据属性有全部 ...

  7. Codeforces Gym 100338H High Speed Trains 组合数学+dp+高精度

    原题链接:http://codeforces.com/gym/100338/attachments/download/2136/20062007-winter-petrozavodsk-camp-an ...

  8. 在eclipse使用map reduce编写word count程序生成jar包并在虚拟机运行的步骤

    ---恢复内容开始--- 1.首先准备一个需要统计的单词文件 word.txt,我们的单词是以空格分开的,统计时按照空格分隔即可 hello hadoop hello yarnhello zookee ...

  9. Markdown编辑器的使用

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/LoveJavaYDJ/article/details/73692917 一.Markdown和edi ...

  10. js/jq仿window文件夹框选操作插件

    0.先给大家看看效果: 1.创建一个index.html文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ...