android项目添加activity右滑退出.返回的效果
2017-04-07 16:17
411 查看
项目第一版马上就要上线了,产品忽然要添加activity右滑返回上一页的效果,瞬间头大,但查了博客整理了思路,决定用一个比较老的框架:SlidingMenu
注:下面方法有的没用到,根据自己需求来
别忘了Activity还要实现接口:
恩,现在运行应该就可以出现效果了,但是在我项目中有的还要实现沉浸式状态栏效果,比如启动页那样的效果我也没找到方案,所以就没有继承baseActivity。而因为已经把状态栏也设置为透明的,所以有时会出现显示下层页面状态栏的问题,so 在BaseActivity的oncreate的里面添加
并且把SlidingActivityHelper类中onPostCreate方法的
替换成
对于SlidingMenu的使用暂时先写这么多,至于demo源码有时间了再写
SlidingLarbry下载地址:
http://download.csdn.net/detail/qq_37797158/9806689
实现步骤:
一:先添加依赖。这个是用方法有三种,具体的自己百度。我用的是导入依赖
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.4到5.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
相关文章推荐
- Android UI效果实现——Activity滑动退出效果
- Android中实现“程序前后台切换效果”和“返回正在运行的程序,而不是一个新Activity”
- Android 设定Activity的进入和退出效果
- android 中FragmentActivity中模拟返回键返回上一个Activity效果
- Android编程设定activity进入和退出效果的方法
- Android双击返回键退出Activity的两种方法
- Android双击返回键退出Activity的两种方法
- Cocos2D-X2.2.3学习笔记9(处理重力感应事件,移植到Android加入两次返回退出游戏效果)
- 让Android点击通知栏信息后返回正在运行的程序,并完全退出所有activity
- Android中实现“程序前后台切换效果”和“返回正在运行的程序,而不是一个新Activity”
- android应用面试宝典;footerview自动添加在下翻页的最后一项;主界面返回键退出提示
- Unity响应Android的返回键,退出当前Activity
- Android 设定Activity的进入和退出效果
- Android Activity 启动/退出 动画效果
- android 设定activity的进入和退出效果
- Android wiki:02.给activity添加动画效果
- android Activity右滑返回,退出当前activity
- android退出程序——把activity添加到list,退出时finish()掉所有的activity
- android 中FragmentActivity中模拟返回键返回上一个Activity效果
- android Activity右滑返回,退出当前activity