Skip to content

Commit

Permalink
新增滑动返回功能
Browse files Browse the repository at this point in the history
  • Loading branch information
woxingxiao committed Mar 31, 2017
1 parent cc82cf0 commit c09bd2b
Show file tree
Hide file tree
Showing 37 changed files with 1,247 additions and 204 deletions.
1 change: 1 addition & 0 deletions SlideBack/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/build
27 changes: 27 additions & 0 deletions SlideBack/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
apply plugin: 'com.android.library'

android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 1
versionName "1.0"

testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
provided "com.android.support:appcompat-v7:$rootProject.ext.supportLibraryVersion"
// provided 'com.android.support:design:24.2.1'
}
17 changes: 17 additions & 0 deletions SlideBack/proguard-rules.pro
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in D:\AndroidSdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
11 changes: 11 additions & 0 deletions SlideBack/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<manifest package="com.oubowu.slideback"
xmlns:android="http://schemas.android.com/apk/res/android">

<application android:allowBackup="true"
android:label="@string/app_name"
android:supportsRtl="true"
>

</application>

</manifest>
101 changes: 101 additions & 0 deletions SlideBack/src/main/java/com/oubowu/slideback/ActivityHelper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
package com.oubowu.slideback;

import android.app.Activity;
import android.app.Application;
import android.os.Bundle;
import android.util.Log;

import java.util.Stack;

/**
* Created by Oubowu on 2016/9/20 3:28.
*/
public class ActivityHelper implements Application.ActivityLifecycleCallbacks {

private static Stack<Activity> mActivityStack;

public ActivityHelper() {
}

@Override
public void onActivityCreated(Activity activity, Bundle bundle) {
if (mActivityStack == null) {
mActivityStack = new Stack<>();
}
mActivityStack.add(activity);
}

@Override
public void onActivityStarted(Activity activity) {

}

@Override
public void onActivityResumed(Activity activity) {

}

@Override
public void onActivityPaused(Activity activity) {

}

@Override
public void onActivityStopped(Activity activity) {

}

@Override
public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {

}

@Override
public void onActivityDestroyed(Activity activity) {

// Log.e("TAG", "ActivityHelper-销毁: " + activity);
mActivityStack.remove(activity);

}

public Activity getPreActivity() {
if (mActivityStack == null) {
return null;
}
int size = mActivityStack.size();
if (size < 2) {
return null;
}
return mActivityStack.elementAt(size - 2);
}

public void finishAllActivity() {
if (mActivityStack == null) {
return;
}
for (Activity activity : mActivityStack) {
activity.finish();
}
}

public void printAllActivity() {
if (mActivityStack == null) {
return;
}
for (int i = 0; i < mActivityStack.size(); i++) {
Log.e("TAG", "位置" + i + ": " + mActivityStack.get(i));
}
}

/**
* 强制删掉activity,用于用户快速滑动页面的时候,因为页面还没来得及destroy导致的问题
*
* @param activity 删掉的activity
*/
void postRemoveActivity(Activity activity) {
if (mActivityStack != null) {
mActivityStack.remove(activity);
}
}

}
140 changes: 140 additions & 0 deletions SlideBack/src/main/java/com/oubowu/slideback/SlideBackHelper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
package com.oubowu.slideback;

import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.View;
import android.view.ViewGroup;

import com.oubowu.slideback.callbak.OnInternalStateListener;
import com.oubowu.slideback.callbak.OnSlideListener;
import com.oubowu.slideback.widget.SlideBackLayout;

/**
* Created by Oubowu on 2016/9/22 0022 14:31.
*/
// TODO: 2016/9/24 添加了上个页面的布局,如果页面有Toolbar的话其不随屏幕选择而大小变化,永远维持进入时的宽高比
public class SlideBackHelper {

public static ViewGroup getDecorView(Activity activity) {
return (ViewGroup) activity.getWindow().getDecorView();
}

public static Drawable getDecorViewDrawable(Activity activity) {
return getDecorView(activity).getBackground();
}

public static View getContentView(Activity activity) {
return getDecorView(activity).getChildAt(0);
}

/**
* 附着Activity,实现侧滑
*
* @param curActivity 当前Activity
* @param helper Activity栈管理类
* @param config 参数配置
* @param listener 滑动的监听
* @return 处理侧滑的布局,提高方法动态设置滑动相关参数
*/
public static SlideBackLayout attach(@NonNull final Activity curActivity, @NonNull final ActivityHelper helper, @Nullable final SlideConfig config, @Nullable final OnSlideListener listener) {

final ViewGroup decorView = getDecorView(curActivity);
final View contentView = decorView.getChildAt(0);
decorView.removeViewAt(0);

View content = contentView.findViewById(android.R.id.content);
if (content.getBackground() == null) {
content.setBackground(decorView.getBackground());
}

final Activity[] preActivity = {helper.getPreActivity()};
final View[] preContentView = {getContentView(preActivity[0])};
Drawable preDecorViewDrawable = getDecorViewDrawable(preActivity[0]);
content = preContentView[0].findViewById(android.R.id.content);
if (content.getBackground() == null) {
content.setBackground(preDecorViewDrawable);
}

final SlideBackLayout slideBackLayout;
slideBackLayout = new SlideBackLayout(curActivity, contentView, preContentView[0], preDecorViewDrawable, config, new OnInternalStateListener() {

@Override
public void onSlide(float percent) {
if (listener != null) {
listener.onSlide(percent);
}
}

@Override
public void onOpen() {
if (listener != null) {
listener.onOpen();
}
}

@Override
public void onClose(Boolean finishActivity) {

// finishActivity为true时关闭页面,为false时不关闭页面,为null时为其他地方关闭页面时调用SlideBackLayout.isComingToFinish的回调

if (listener != null) {
listener.onClose();
}

if ((finishActivity == null || !finishActivity) && listener != null) {
listener.onClose();
}

if (config != null && config.isRotateScreen()) {

if (finishActivity != null && finishActivity) {
// remove了preContentView后布局会重新调整,这时候contentView回到原处,所以要设不可见
contentView.setVisibility(View.INVISIBLE);
}

if (preActivity[0] != null && preContentView[0].getParent() != getDecorView(preActivity[0])) {
// Log.e("TAG", ((SlideBackLayout) preContentView[0].getParent()).getTestName() + "这里把欠人的布局放回到上个Activity");
preContentView[0].setX(0);
((ViewGroup) preContentView[0].getParent()).removeView(preContentView[0]);
getDecorView(preActivity[0]).addView(preContentView[0], 0);
}
//else {
// Log.e("TAG", "这个页面你都没加过,还是在上一个那里,你没欠我");
//}
}

if (finishActivity != null && finishActivity) {
curActivity.finish();
curActivity.overridePendingTransition(0, R.anim.anim_out_none);
helper.postRemoveActivity(curActivity);
} else if (finishActivity == null) {
helper.postRemoveActivity(curActivity);
}
}

@Override
public void onCheckPreActivity(SlideBackLayout slideBackLayout) {
// Log.e("TAG", "--------------------------------------------------");
// helper.printAllActivity();
// Log.e("TAG", "--------------------------------------------------");
Activity activity = helper.getPreActivity();
// Log.e("TAG", "SlideBackHelper-120行-onFocus(): " + preActivity[0] + ";" + activity);
if (activity != preActivity[0]) {
// Log.e("TAG", "SlideBackHelper-122行-onFocus(): 上个Activity变了");
preActivity[0] = activity;
preContentView[0] = getContentView(preActivity[0]);
slideBackLayout.updatePreContentView(preContentView[0]);
}
}

});

decorView.addView(slideBackLayout);

return slideBackLayout;
}


}
Loading

0 comments on commit c09bd2b

Please sign in to comment.