├── .gitignore ├── .idea ├── .name ├── compiler.xml ├── copyright │ └── profiles_settings.xml ├── encodings.xml ├── gradle.xml ├── misc.xml ├── modules.xml ├── runConfigurations.xml └── vcs.xml ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── example │ │ └── ziv │ │ └── swipebackexample │ │ └── ApplicationTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── ziv │ │ │ └── swipebackexample │ │ │ ├── BaseActivity.java │ │ │ ├── FourthActivity.java │ │ │ ├── MainActivity.java │ │ │ ├── SecondActivity.java │ │ │ ├── SwipeBackActivity.java │ │ │ ├── ThirdActivity.java │ │ │ └── utils │ │ │ ├── AndroidBug5497Workaround.java │ │ │ ├── DensityUtil.java │ │ │ └── StateBarTranslucentUtils.java │ └── res │ │ ├── anim │ │ ├── activity_close_enter.xml │ │ ├── activity_close_exit.xml │ │ ├── activity_open_enter.xml │ │ └── activity_open_exit.xml │ │ ├── drawable-v21 │ │ ├── ic_menu_camera.xml │ │ ├── ic_menu_gallery.xml │ │ ├── ic_menu_manage.xml │ │ ├── ic_menu_send.xml │ │ ├── ic_menu_share.xml │ │ └── ic_menu_slideshow.xml │ │ ├── drawable │ │ └── side_nav_bar.xml │ │ ├── layout │ │ ├── activity_fifth.xml │ │ ├── activity_fourth.xml │ │ ├── activity_header.xml │ │ ├── activity_main.xml │ │ ├── activity_second.xml │ │ ├── activity_third.xml │ │ ├── app_bar_main.xml │ │ ├── content_main.xml │ │ └── nav_header_main.xml │ │ ├── menu │ │ ├── activity_main_drawer.xml │ │ └── main.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ ├── raw │ │ └── swipeback_example2.gif │ │ ├── values-v21 │ │ └── styles.xml │ │ ├── values-w820dp │ │ └── dimens.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── drawables.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── example │ └── ziv │ └── swipebackexample │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | -------------------------------------------------------------------------------- /.idea/.name: -------------------------------------------------------------------------------- 1 | SwipeBackExample -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 23 | 24 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 19 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 46 | 47 | 49 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SwipeBackExample 2 | 一个右滑退出+沉浸式(透明)状态栏效果的例子 3 | 4 | ##详细的介绍可看这里:[Android右滑退出+沉浸式(透明)状态栏](http://www.jianshu.com/p/7dcfd243b1df) 5 | 6 | 7 | ##效果: 8 | ![右滑退出+沉浸式(透明)状态栏效果.gif](https://github.com/XiaoJiaqing/SwipeBackExample/blob/master/app/src/main/res/raw/swipeback_example2.gif) 9 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 23 5 | buildToolsVersion "23.0.3" 6 | 7 | defaultConfig { 8 | applicationId "com.example.ziv.swipebackexample" 9 | minSdkVersion 15 10 | targetSdkVersion 23 11 | versionCode 1 12 | versionName "1.0" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | compile fileTree(dir: 'libs', include: ['*.jar']) 24 | testCompile 'junit:junit:4.12' 25 | compile 'com.android.support:appcompat-v7:23.3.0' 26 | compile 'com.android.support:design:23.3.0' 27 | compile 'me.imid.swipebacklayout.lib:library:1.0.0' 28 | // compile 'com.readystatesoftware.systembartint:systembartint:1.0.3' 29 | } 30 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in C:\Users\Ziv\AppData\Local\Android\Sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/example/ziv/swipebackexample/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.example.ziv.swipebackexample; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 11 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/ziv/swipebackexample/BaseActivity.java: -------------------------------------------------------------------------------- 1 | package com.example.ziv.swipebackexample; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | import android.support.v7.widget.Toolbar; 6 | import android.widget.RelativeLayout; 7 | import com.example.ziv.swipebackexample.utils.StateBarTranslucentUtils; 8 | import java.io.File; 9 | 10 | import me.imid.swipebacklayout.lib.SwipeBackLayout; 11 | 12 | /** 13 | * Created by JiaQing on 2016/7/17. 14 | */ 15 | public class BaseActivity extends SwipeBackActivity { 16 | 17 | protected String TAG = this.getClass().getSimpleName(); 18 | 19 | // 右滑返回 20 | private SwipeBackLayout mSwipeBackLayout; 21 | protected RelativeLayout mTitleBar; 22 | protected Toolbar mToolBar; 23 | 24 | protected Context context; 25 | 26 | @Override 27 | protected void onCreate(Bundle savedInstanceState) { 28 | super.onCreate(savedInstanceState); 29 | context = this; 30 | mSwipeBackLayout = getSwipeBackLayout(); 31 | // 设置滑动方向,可设置EDGE_LEFT, EDGE_RIGHT, EDGE_ALL, EDGE_BOTTOM 32 | mSwipeBackLayout.setEdgeTrackingEnabled(SwipeBackLayout.EDGE_LEFT); 33 | } 34 | 35 | protected void initView() { 36 | 37 | mToolBar = (Toolbar) findViewById(R.id.toolbar); 38 | //设置状态栏透明 39 | StateBarTranslucentUtils.setStateBarTranslucent(this); 40 | //状态栏着色 41 | StateBarTranslucentUtils.setStateBarColor(this); 42 | 43 | } 44 | 45 | protected void initData() { 46 | 47 | File file ; 48 | 49 | } 50 | 51 | } 52 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/ziv/swipebackexample/FourthActivity.java: -------------------------------------------------------------------------------- 1 | package com.example.ziv.swipebackexample; 2 | import android.content.Intent; 3 | import android.os.Bundle; 4 | import android.view.View; 5 | 6 | /** 7 | * Created by JiaQing on 2016/7/24. 8 | * 使用android:fitsSystemWindows=true属性,然后新建一个和ToolBar背景色一样的View添加到原来状态栏的位置 9 | */ 10 | public class FourthActivity extends BaseActivity { 11 | 12 | 13 | View mStatusBarView; 14 | 15 | @Override 16 | protected void onCreate(Bundle savedInstanceState) { 17 | super.onCreate(savedInstanceState); 18 | setContentView(R.layout.activity_fourth); 19 | // 20 | // //以下方案在5.0以上部分手机内会有问题,会有半透明的背景 21 | // final int sdk = Build.VERSION.SDK_INT; 22 | // Window window = getWindow(); 23 | // WindowManager.LayoutParams params = window.getAttributes(); 24 | // 25 | // if (sdk >= Build.VERSION_CODES.KITKAT) { 26 | // int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS; 27 | // // 设置透明状态栏 28 | // if ((params.flags & bits) == 0) { 29 | // params.flags |= bits; 30 | // window.setAttributes(params); 31 | // } 32 | // } 33 | initView(); 34 | } 35 | 36 | @Override 37 | protected void initView() { 38 | super.initView(); 39 | } 40 | 41 | 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/ziv/swipebackexample/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.example.ziv.swipebackexample; 2 | 3 | import android.content.Intent; 4 | import android.os.Build; 5 | import android.os.Bundle; 6 | import android.support.design.widget.FloatingActionButton; 7 | import android.support.design.widget.Snackbar; 8 | import android.view.View; 9 | import android.support.design.widget.NavigationView; 10 | import android.support.v4.view.GravityCompat; 11 | import android.support.v4.widget.DrawerLayout; 12 | import android.support.v7.app.ActionBarDrawerToggle; 13 | import android.support.v7.widget.Toolbar; 14 | import android.view.Menu; 15 | import android.view.MenuItem; 16 | import android.widget.RelativeLayout; 17 | 18 | import com.example.ziv.swipebackexample.utils.StateBarTranslucentUtils; 19 | 20 | /** 21 | * Created by JiaQing on 2016/7/17. 22 | * 含有DrawerLayout+NavigationView 页面 23 | * 不使用android:fitsSystemWindows=true属性, 24 | * 在ToolBar外面套一层布局,然后为ToolBar设置顶部margin 25 | */ 26 | public class MainActivity extends BaseActivity 27 | implements NavigationView.OnNavigationItemSelectedListener { 28 | 29 | @Override 30 | protected void onCreate(Bundle savedInstanceState) { 31 | super.onCreate(savedInstanceState); 32 | setContentView(R.layout.activity_main); 33 | setSwipeBackEnable(false); 34 | Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 35 | setSupportActionBar(toolbar); 36 | 37 | FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 38 | fab.setOnClickListener(new View.OnClickListener() { 39 | @Override 40 | public void onClick(View view) { 41 | Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 42 | .setAction("Action", null).show(); 43 | } 44 | }); 45 | 46 | DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 47 | ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( 48 | this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 49 | 50 | drawer.setDrawerListener(toggle); 51 | toggle.syncState(); 52 | 53 | NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 54 | navigationView.setNavigationItemSelectedListener(this); 55 | initView(); 56 | initData(); 57 | 58 | //DrawerLayout兼容4.4 59 | if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { 60 | //将侧边栏顶部延伸至status bar 61 | drawer.setFitsSystemWindows(true); 62 | //将主页面顶部延伸至status bar;虽默认为false,但经测试,DrawerLayout需显示设置 63 | drawer.setClipToPadding(false); 64 | } 65 | } 66 | 67 | 68 | @Override 69 | protected void initView() { 70 | // super.initView(); 71 | mToolBar = (Toolbar) findViewById(R.id.toolbar); 72 | //设置状态栏透明 73 | StateBarTranslucentUtils.setStateBarTranslucent(this); 74 | 75 | 76 | //获得状态栏高度 77 | int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); 78 | int stateBarHeight = getResources().getDimensionPixelSize(resourceId); 79 | //设置margin 80 | RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) mToolBar.getLayoutParams(); 81 | layoutParams.setMargins(0, stateBarHeight, 0, 0); 82 | mToolBar.setLayoutParams(layoutParams); 83 | } 84 | 85 | 86 | @Override 87 | protected void initData() { 88 | super.initData(); 89 | } 90 | 91 | @Override 92 | public void onBackPressed() { 93 | DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 94 | if (drawer.isDrawerOpen(GravityCompat.START)) { 95 | drawer.closeDrawer(GravityCompat.START); 96 | } else { 97 | super.onBackPressed(); 98 | } 99 | } 100 | 101 | @Override 102 | public boolean onCreateOptionsMenu(Menu menu) { 103 | // Inflate the menu; this adds items to the action bar if it is present. 104 | getMenuInflater().inflate(R.menu.main, menu); 105 | return true; 106 | } 107 | 108 | @Override 109 | public boolean onOptionsItemSelected(MenuItem item) { 110 | // Handle action bar item clicks here. The action bar will 111 | // automatically handle clicks on the Home/Up button, so long 112 | // as you specify a parent activity in AndroidManifest.xml. 113 | int id = item.getItemId(); 114 | 115 | //noinspection SimplifiableIfStatement 116 | if (id == R.id.action_settings) { 117 | return true; 118 | } 119 | 120 | return super.onOptionsItemSelected(item); 121 | } 122 | 123 | @SuppressWarnings("StatementWithEmptyBody") 124 | @Override 125 | public boolean onNavigationItemSelected(MenuItem item) { 126 | // Handle navigation view item clicks here. 127 | int id = item.getItemId(); 128 | 129 | if (id == R.id.nav_camera) { 130 | // Handle the camera action 131 | } else if (id == R.id.nav_gallery) { 132 | 133 | } else if (id == R.id.nav_slideshow) { 134 | 135 | } else if (id == R.id.nav_manage) { 136 | 137 | } else if (id == R.id.nav_share) { 138 | 139 | } else if (id == R.id.nav_send) { 140 | 141 | } 142 | 143 | DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 144 | drawer.closeDrawer(GravityCompat.START); 145 | return true; 146 | } 147 | 148 | 149 | public void next(View view) { 150 | startActivity(new Intent(context, SecondActivity.class)); 151 | } 152 | } 153 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/ziv/swipebackexample/SecondActivity.java: -------------------------------------------------------------------------------- 1 | package com.example.ziv.swipebackexample; 2 | 3 | import android.content.Intent; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.os.Bundle; 6 | import android.support.v7.widget.Toolbar; 7 | import android.view.View; 8 | 9 | import com.example.ziv.swipebackexample.utils.StateBarTranslucentUtils; 10 | 11 | /** 12 | * Created by JiaQing on 2016/7/24. 13 | * 使用android:fitsSystemWindows=true属性, 14 | * 直接在根布局设置一个和ToolBar一样的背景色,测试时发现这个方法在有DrawerLayout时好像不管用 15 | */ 16 | public class SecondActivity extends BaseActivity { 17 | 18 | @Override 19 | protected void onCreate(Bundle savedInstanceState) { 20 | super.onCreate(savedInstanceState); 21 | setContentView(R.layout.activity_second); 22 | initView(); 23 | initData(); 24 | } 25 | 26 | @Override 27 | protected void initView() { 28 | //super.initView(); 29 | mToolBar = (Toolbar) findViewById(R.id.toolbar); 30 | 31 | //设置状态栏透明 32 | StateBarTranslucentUtils.setStateBarTranslucent(this); 33 | } 34 | 35 | public void next(View view){ 36 | startActivity(new Intent(context,ThirdActivity.class)); 37 | } 38 | 39 | 40 | 41 | 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/ziv/swipebackexample/SwipeBackActivity.java: -------------------------------------------------------------------------------- 1 | 2 | package com.example.ziv.swipebackexample; 3 | 4 | import android.app.Activity; 5 | import android.os.Bundle; 6 | import android.support.v7.app.AppCompatActivity; 7 | import android.view.View; 8 | import me.imid.swipebacklayout.lib.SwipeBackLayout; 9 | import me.imid.swipebacklayout.lib.Utils; 10 | import me.imid.swipebacklayout.lib.app.SwipeBackActivityBase; 11 | import me.imid.swipebacklayout.lib.app.SwipeBackActivityHelper; 12 | /** 13 | * Created by JiaQing on 2016/7/17. 14 | * 官方给SwipeBackActivity继承的是Activity。这里需要是AppCompatActivity 15 | */ 16 | public class SwipeBackActivity extends AppCompatActivity implements SwipeBackActivityBase { 17 | private SwipeBackActivityHelper mHelper; 18 | 19 | @Override 20 | protected void onCreate(Bundle savedInstanceState) { 21 | super.onCreate(savedInstanceState); 22 | mHelper = new SwipeBackActivityHelper(this); 23 | mHelper.onActivityCreate(); 24 | } 25 | 26 | @Override 27 | protected void onPostCreate(Bundle savedInstanceState) { 28 | super.onPostCreate(savedInstanceState); 29 | mHelper.onPostCreate(); 30 | } 31 | 32 | @Override 33 | public View findViewById(int id) { 34 | View v = super.findViewById(id); 35 | if (v == null && mHelper != null) 36 | return mHelper.findViewById(id); 37 | return v; 38 | } 39 | 40 | @Override 41 | public SwipeBackLayout getSwipeBackLayout() { 42 | return mHelper.getSwipeBackLayout(); 43 | } 44 | 45 | @Override 46 | public void setSwipeBackEnable(boolean enable) { 47 | getSwipeBackLayout().setEnableGesture(enable); 48 | } 49 | 50 | @Override 51 | public void scrollToFinishActivity() { 52 | Utils.convertActivityToTranslucent(this); 53 | getSwipeBackLayout().scrollToFinishActivity(); 54 | } 55 | 56 | } 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/ziv/swipebackexample/ThirdActivity.java: -------------------------------------------------------------------------------- 1 | package com.example.ziv.swipebackexample; 2 | 3 | import android.content.Intent; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.os.Bundle; 6 | import android.support.v7.widget.Toolbar; 7 | import android.view.View; 8 | import android.widget.RelativeLayout; 9 | 10 | import com.example.ziv.swipebackexample.utils.AndroidBug5497Workaround; 11 | import com.example.ziv.swipebackexample.utils.StateBarTranslucentUtils; 12 | 13 | /** 14 | * Created by JiaQing on 2016/7/17. 15 | * 如果设置全屏后,没有android:fitsSystemWindows=true这个属性,点击输入框后会出现输入框被输入法挡住的问题 16 | */ 17 | public class ThirdActivity extends BaseActivity { 18 | 19 | @Override 20 | protected void onCreate(Bundle savedInstanceState) { 21 | super.onCreate(savedInstanceState); 22 | setContentView(R.layout.activity_third); 23 | // AndroidBug5497Workaround.assistActivity(this); 24 | initView(); 25 | initData(); 26 | } 27 | 28 | @Override 29 | protected void initView() { 30 | // super.initView(); 31 | mToolBar = (Toolbar) findViewById(R.id.toolbar); 32 | //设置状态栏透明 33 | StateBarTranslucentUtils.setStateBarTranslucent(this); 34 | 35 | //获得状态栏高度 36 | int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); 37 | int stateBarHeight = getResources().getDimensionPixelSize(resourceId); 38 | //设置margin 39 | RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) mToolBar.getLayoutParams(); 40 | layoutParams.setMargins(0, stateBarHeight, 0, 0); 41 | mToolBar.setLayoutParams(layoutParams); 42 | 43 | } 44 | 45 | public void next(View view){ 46 | startActivity(new Intent(context,FourthActivity.class)); 47 | } 48 | 49 | 50 | 51 | public void dynamicAdjustmentHeight(View view){ 52 | 53 | AndroidBug5497Workaround.assistActivity(this); 54 | 55 | } 56 | 57 | } 58 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/ziv/swipebackexample/utils/AndroidBug5497Workaround.java: -------------------------------------------------------------------------------- 1 | package com.example.ziv.swipebackexample.utils; 2 | 3 | import android.app.Activity; 4 | import android.graphics.Rect; 5 | import android.os.Build; 6 | import android.view.View; 7 | import android.view.ViewTreeObserver; 8 | import android.widget.FrameLayout; 9 | 10 | 11 | /** 12 | * Created by Ziv on 2016/7/31. 13 | */ 14 | public class AndroidBug5497Workaround { 15 | 16 | public static void assistActivity(Activity activity) { 17 | new AndroidBug5497Workaround(activity); 18 | } 19 | 20 | private View mChildOfContent; 21 | private int usableHeightPrevious; 22 | private FrameLayout.LayoutParams frameLayoutParams; 23 | private int contentHeight; 24 | boolean isfirst = true; 25 | Activity activity; 26 | int statusBarHeight; 27 | 28 | private AndroidBug5497Workaround(Activity activity) { 29 | 30 | //获取状态栏的高度 31 | int resourceId = activity.getResources().getIdentifier("status_bar_height", "dimen", "android"); 32 | statusBarHeight = activity.getResources().getDimensionPixelSize(resourceId); 33 | 34 | this.activity = activity; 35 | FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content); 36 | mChildOfContent = content.getChildAt(0); 37 | 38 | //界面出现变动都会调用这个监听事件 39 | mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 40 | public void onGlobalLayout() { 41 | 42 | if (isfirst) { 43 | contentHeight = mChildOfContent.getHeight();//兼容华为等机型 44 | isfirst = false; 45 | } 46 | possiblyResizeChildOfContent(); 47 | } 48 | }); 49 | frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams(); 50 | } 51 | 52 | //重新调整跟布局的高度 53 | private void possiblyResizeChildOfContent() { 54 | int usableHeightNow = computeUsableHeight(); 55 | 56 | //当前可见高度和上一次可见高度不一致 布局变动 57 | if (usableHeightNow != usableHeightPrevious) { 58 | //int usableHeightSansKeyboard2 = mChildOfContent.getHeight();//兼容华为 59 | int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight(); 60 | int heightDifference = usableHeightSansKeyboard - usableHeightNow; 61 | if (heightDifference > (usableHeightSansKeyboard / 4)) { 62 | // keyboard probably just became visible 63 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 64 | //frameLayoutParams.height = usableHeightSansKeyboard - heightDifference; 65 | frameLayoutParams.height = usableHeightSansKeyboard - heightDifference + statusBarHeight; 66 | } else { 67 | frameLayoutParams.height = usableHeightSansKeyboard - heightDifference; 68 | } 69 | } else { 70 | frameLayoutParams.height = contentHeight; 71 | } 72 | mChildOfContent.requestLayout(); 73 | usableHeightPrevious = usableHeightNow; 74 | } 75 | } 76 | 77 | /** 78 | * 计算mChildOfContent可见高度 79 | * 80 | * @return 81 | */ 82 | private int computeUsableHeight() { 83 | Rect r = new Rect(); 84 | mChildOfContent.getWindowVisibleDisplayFrame(r); 85 | return (r.bottom - r.top); 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/ziv/swipebackexample/utils/DensityUtil.java: -------------------------------------------------------------------------------- 1 | package com.example.ziv.swipebackexample.utils; 2 | 3 | import android.content.Context; 4 | 5 | /** 6 | * 尺寸转换 7 | * @email 937211946@qq.com 8 | * @author xjq 9 | * @date 2015年12月3日 下午6:03:28 10 | */ 11 | public class DensityUtil { 12 | /** 13 | * 将px值转换为dip或dp值,保证尺寸大小不变 14 | * 15 | */ 16 | public static int px2dip(Context context, float pxValue) { 17 | final float scale = context.getResources().getDisplayMetrics().density; 18 | return (int) (pxValue / scale + 0.5f); 19 | } 20 | 21 | /** 22 | * 将dip或dp值转换为px值,保证尺寸大小不变 23 | * 24 | */ 25 | public static int dip2px(Context context, float dipValue) { 26 | final float scale = context.getResources().getDisplayMetrics().density; 27 | return (int) (dipValue * scale + 0.5f); 28 | } 29 | 30 | /** 31 | * 将px值转换为sp值,保证文字大小不变 32 | * 33 | */ 34 | public static int px2sp(Context context, float pxValue) { 35 | final float fontScale = context.getResources().getDisplayMetrics().scaledDensity; 36 | return (int) (pxValue / fontScale + 0.5f); 37 | } 38 | 39 | /** 40 | * 将sp值转换为px值,保证文字大小不变 41 | * 42 | * @param spValue 43 | */ 44 | public static int sp2px(Context context, float spValue) { 45 | final float fontScale = context.getResources().getDisplayMetrics().scaledDensity; 46 | return (int) (spValue * fontScale + 0.5f); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/ziv/swipebackexample/utils/StateBarTranslucentUtils.java: -------------------------------------------------------------------------------- 1 | package com.example.ziv.swipebackexample.utils; 2 | 3 | import android.app.Activity; 4 | import android.content.Context; 5 | import android.graphics.Color; 6 | import android.os.Build; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | import android.view.Window; 10 | import android.view.WindowManager; 11 | 12 | /** 13 | * Created by Ziv on 2016/7/31. 14 | */ 15 | public class StateBarTranslucentUtils { 16 | 17 | 18 | public static void setStateBarTranslucent(Activity activity) { 19 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//4.4 全透明状态栏 20 | activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 21 | } 22 | 23 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//5.0 全透明实现 24 | // activity.getWindow().setStatusBarColor(Color.TRANSPARENT); //直接用这个方法会有兼容性问题 25 | Window window = activity.getWindow(); 26 | window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 27 | window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 28 | | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); 29 | window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 30 | window.setStatusBarColor(Color.TRANSPARENT);//calculateStatusColor(Color.WHITE, (int) alphaValue) 31 | } 32 | } 33 | 34 | 35 | public static void setStateBarColor(Activity activity) { 36 | // 设置状态栏颜色 37 | ViewGroup contentLayout = (ViewGroup) activity.findViewById(android.R.id.content); 38 | setupStatusBarView(activity, contentLayout, Color.parseColor("#FF5677FC")); 39 | 40 | // 设置Activity layout的fitsSystemWindows 41 | View contentChild = contentLayout.getChildAt(0); 42 | contentChild.setFitsSystemWindows(true); 43 | } 44 | 45 | 46 | private static void setupStatusBarView(Activity activity, ViewGroup contentLayout, int color) { 47 | 48 | View mStatusBarView = null; 49 | 50 | View statusBarView = new View(activity); 51 | ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams( 52 | ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity)); 53 | contentLayout.addView(statusBarView, lp); 54 | 55 | mStatusBarView = statusBarView; 56 | 57 | 58 | mStatusBarView.setBackgroundColor(color); 59 | } 60 | 61 | /** 62 | * 获得状态栏高度 63 | */ 64 | private static int getStatusBarHeight(Context context) { 65 | int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); 66 | return context.getResources().getDimensionPixelSize(resourceId); 67 | } 68 | 69 | } 70 | -------------------------------------------------------------------------------- /app/src/main/res/anim/activity_close_enter.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/anim/activity_close_exit.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/anim/activity_open_enter.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/anim/activity_open_exit.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ic_menu_camera.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ic_menu_gallery.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ic_menu_manage.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ic_menu_send.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ic_menu_share.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ic_menu_slideshow.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/side_nav_bar.xml: -------------------------------------------------------------------------------- 1 | 3 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_fifth.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_fourth.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | 19 | 20 | 21 |