android项目添加activity右滑退出.返回的效果

项目第一版马上就要上线了,产品忽然要添加activity右滑返回上一页的效果,瞬间头大,但查了博客整理了思路,决定用一个比较老的框架:SlidingMenu

实现步骤:

一:先添加依赖。这个是用方法有三种,具体的自己百度。我用的是导入依赖

             1.gradle的dependencies里添加
                     `compile project(":SlidingLibrary")`
             2.导入SlidingMenu,new ->import module ->选择下载的SlidingMenu
             3.同步

二: 引入到项目中,因为我的要实现全局效果,所以我就添加到BaseActivity里面了,代码如下:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        //TODO 侧滑
       initslide(savedInstanceState);

        super.onCreate(savedInstanceState);
private void initslide(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);

    }

注:下面方法有的没用到,根据自己需求来


    private SlidingActivityHelper mHelper;
    //SlidingMenu
    private SlidingMenu mSlidingMenu;


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

别忘了Activity还要实现接口:

public abstract class BaseActivity extends AppCompatActivity implements   SlidingMenu.OnOpenedListener{

三: 设置主题为透明,及划入滑出动画,因为我要实现全局有侧滑效果,所以添加全局主题为透明

<application
        android:name=".conifg.MvpContactApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/Base.AppTheme">
     <style name="Base.AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/transparent</item>
    <item name="colorPrimaryDark">@color/transparent</item>
    <item name="colorAccent">@color/colorAccent</item>
    <!-- 以下为实现侧滑相关item  -->
    <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="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>
    <style name="JKActionBar.Custom"      parent="@style/Widget.AppCompat.Light.ActionBar.Solid.Inverse">
        <item name="displayOptions">showCustom</item>
        <item name="android:background">@android:color/holo_blue_bright</item>
        <item name="background">@android:color/transparent</item>
        <item name="android:displayOptions" tools:ignore="NewApi">showCustom</item>
        <item name="android:height">?actionBarSize</item>
    </style>

恩,现在运行应该就可以出现效果了,但是在我项目中有的还要实现沉浸式状态栏效果,比如启动页那样的效果我也没找到方案,所以就没有继承baseActivity。而因为已经把状态栏也设置为透明的,所以有时会出现显示下层页面状态栏的问题,so 在BaseActivity的oncreate的里面添加

        //TODO 这句话貌似应该放在setContentView(getLayoutId());的下面
        setWindowStatusBarColor(this.mActivity,R.color.black);      //实现状态栏黑色
 public void setWindowStatusBarColor(Activity activity, int colorResId) {
        try {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                Window window = activity.getWindow();
                window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                window.setStatusBarColor(activity.getResources().getColor(colorResId));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    **另外: 如果想让布局顶上状态栏实现沉浸式,可以在oncreat()方法里加上**
         //TODO 下面这个判断如果不加沉浸式无法实现,设置slidemenu的mActionbarOverlay = true也没用
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//5.0及以上
            View decorView = getWindow().getDecorView();
            int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
            decorView.setSystemUiVisibility(option);
            getWindow().setStatusBarColor(Color.TRANSPARENT);
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//4.45.0
            WindowManager.LayoutParams localLayoutParams = getWindow().getAttributes();
            localLayoutParams.flags = (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | localLayoutParams.flags);
        }

并且把SlidingActivityHelper类中onPostCreate方法的

mSlidingMenu.attachToActivity(mActivity,
                mEnableSlide ? SlidingMenu.SLIDING_WINDOW : SlidingMenu.SLIDING_CONTENT);

替换成

    mEnableSlide=false;
        this.mSlidingMenu.attachToActivity(this.mActivity, this.mEnableSlide ? 0 : 1, true);
研究源码可知mActionbarOverlay为true时才会触发 android:fitsSystemWindows="true"的效果

对于SlidingMenu的使用暂时先写这么多,至于demo源码有时间了再写

SlidingLarbry下载地址:

http://download.csdn.net/detail/qq_37797158/9806689

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值