当前位置: 首页 > news >正文

Android-通过SlidingMenu高仿微信6.2最新版手势滑动返回(二)

转载请标明出处:
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

转载于:https://www.cnblogs.com/blfbuaa/p/7224386.html

相关文章:

  • jquery的事件和动画
  • C#的初学之路(一)
  • 查询oracle数据库中当前数据库所有表的名称
  • HTML5移动开发实战必备知识——本地存储(2)
  • Maven管理不同环境的配置文件
  • Git错误解决(windows版本下的Git Shell)
  • Sublime Text3快捷键
  • exports 和 module.exports 的区别
  • C#内存流示例-----用内存流来读取图片
  • dinic(当前最优模板)
  • tomcat catalina.sh JAVA_OPTS参数说明与配置
  • Hibernate学习10——Hibernate 查询方式
  • 2014年24段魔尺变球视频教程(升级版)
  • 九大内置对象
  • 测试用例编写(功能测试框架)
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • JDK 6和JDK 7中的substring()方法
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • LeetCode18.四数之和 JavaScript
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • Terraform入门 - 3. 变更基础设施
  • XForms - 更强大的Form
  • 从伪并行的 Python 多线程说起
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 记一次删除Git记录中的大文件的过程
  • 离散点最小(凸)包围边界查找
  • 【干货分享】dos命令大全
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 交换综合实验一
  • #控制台大学课堂点名问题_课堂随机点名
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (12)Hive调优——count distinct去重优化
  • (C语言)fgets与fputs函数详解
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (八)Spring源码解析:Spring MVC
  • (二)正点原子I.MX6ULL u-boot移植
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (七)c52学习之旅-中断
  • (实战篇)如何缓存数据
  • (一)UDP基本编程步骤
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • .md即markdown文件的基本常用编写语法
  • .net core 控制台应用程序读取配置文件app.config
  • .net 按比例显示图片的缩略图
  • .net 反编译_.net反编译的相关问题
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET 使用配置文件
  • .net 提取注释生成API文档 帮助文档
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .NET4.0并行计算技术基础(1)