diff --git a/README.md b/README.md
index 2e338d4..5c86f9a 100644
--- a/README.md
+++ b/README.md
@@ -22,9 +22,11 @@ Snake
![扫描图中二维码下载](https://raw.githubusercontent.com/yuanhoujun/Android_Slide_To_Close/develop/image/demo_snapshot.jpg)
扫描上方二维码或 [直接点这里下载](https://www.pgyer.com/Wd3H)
-
+``
## 更新日志
* [版本 **0.2.0** 更新说明](https://github.com/yuanhoujun/Android_Slide_To_Close/blob/develop/docs/update_log_0.2.0.md)
+* [版本 **0.3.0** 更新说明](https://github.com/yuanhoujun/Android_Slide_To_Close/blob/develop/docs/update_log_0.3.0.md)
+
## 使用方法
1)添加依赖
@@ -91,11 +93,30 @@ public class FirstFragment extends Fragment {
```
在使用了主构造器的情况下,使用**Snake.newProxy**接口创建实例的时候需要传入构造参数,以上述代码片段为例,可以这样使用:
+
```
FirstFragment fragment = Snake.newProxy(FirstFragment.class, 1, 2);
```
+
**Snake.newProxySupport**接口同理
+## 0.3.0版本后,Fragment新增继承方式集成
+按照下面的对应关系,改变你的Fragment父类就可以完成滑动关闭集成:
+* `android.app.Fragment` => `com.youngfeng.snake.app.Fragment`
+* `android.support.v4.app.Fragment` => `com.youngfeng.snake.support.v4.app.Fragment`
+
+## 两种集成方案的区别
+集成方案|newProxy/newProxySupport|使用继承
+:---:|:---:|:---:
+侵入性|无|改变了顶级父类
+难易程度|稍难一点|简单
+动画处理|需要自行处理|不需要处理
+实例创建|必须使用newProxy/newProxySupport创建|可以自行处理
+
+注意:使用继承方式集成的情况下,原来的API完全可以通用。你可以选择使用Snake的API进行滑动控制,也可以使用父类中的方法进行滑动控制,这取决于你自己。甚至实例创建你依然可以交给newProxy/newProxySupport接口。
+
+一点建议:如果你的工程有一致的编程规范,代码工整,我推荐你使用继承的方式集成。如果你的工程相对较乱,整体表现不一致,我推荐你使用newProxy/newProxySupport方式集成,灵活性更高。
+
## 滑动参数配置
通常情况下,完成上面的步骤,你已经可以正常使用滑动关闭功能了。可是,有些同学可能希望对滑动样式进行定制化。别担心,
**Snake**提供了两种方式对滑动参数进行配置。
@@ -222,6 +243,11 @@ public class BaseFragment extends Fragment implements SnakeAnimationController {
![欧阳锋工作室](https://raw.githubusercontent.com/yuanhoujun/Android_Slide_To_Close/develop/image/%E6%AC%A7%E9%98%B3%E9%94%8B%E5%B7%A5%E4%BD%9C%E5%AE%A4.jpg)
+## 交流群
+**QQ群**:288177681
+
+如果你在使用过程中遇到了任何问题,欢迎加群交流。如果你想给作者支持,请点击上方star支持。
+
**相关文章**
* [将滑动关闭进行到底](https://www.jianshu.com/p/7cf6864c9bde)
diff --git a/build.gradle b/build.gradle
index 4fa7873..79e4398 100644
--- a/build.gradle
+++ b/build.gradle
@@ -39,9 +39,9 @@ buildscript {
]
ext.snakeVersions = [
- 'snake': '0.2.0',
- 'snakeAnnotations': '0.2.0',
- 'snakeCompiler': '0.2.0'
+ 'snake': '0.3.0',
+ 'snakeAnnotations': '0.3.0',
+ 'snakeCompiler': '0.3.0'
]
ext.deps = [
diff --git a/demo/build.gradle b/demo/build.gradle
index 9fe886d..95ad9f5 100644
--- a/demo/build.gradle
+++ b/demo/build.gradle
@@ -8,8 +8,8 @@ android {
applicationId "com.youngfeng.snake.demo"
minSdkVersion versions.minSdk
targetSdkVersion versions.compileSdk
- versionCode 100
- versionName "1.0.0"
+ versionCode 110
+ versionName "1.1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
@@ -51,8 +51,8 @@ dependencies {
api deps.butterknife
annotationProcessor deps.butterknifeCompiler
- implementation 'com.youngfeng.android:snake:0.2.0'
- annotationProcessor 'com.youngfeng.android:snake-compiler:0.2.0'
+ implementation 'com.youngfeng.android:snake:0.3.0'
+ annotationProcessor 'com.youngfeng.android:snake-compiler:0.3.0'
// implementation project(":snake")
// annotationProcessor project(":snake-compiler")
diff --git a/demo/src/main/AndroidManifest.xml b/demo/src/main/AndroidManifest.xml
index 06a8f4b..b37996e 100644
--- a/demo/src/main/AndroidManifest.xml
+++ b/demo/src/main/AndroidManifest.xml
@@ -49,6 +49,10 @@
android:name=".support.SupportDragFragmentContainerActivity"
android:configChanges="orientation|screenSize"
android:screenOrientation="fullUser"/>
+
fragment, boolean addToBackStack) {
+ @AnimatorRes int popExit, @NonNull Class extends android.app.Fragment> fragment, boolean addToBackStack) {
try {
if (fragment.getName().equals(mCurrentFragmentTag)) return;
@@ -218,21 +218,21 @@ public void push(@AnimatorRes int enter, @AnimatorRes int exit, @AnimatorRes int
}
}
- public void push(Class extends BaseFragment> fragment, boolean addToBackStack) {
+ public void push(Class extends android.app.Fragment> fragment, boolean addToBackStack) {
push(R.animator.snake_slide_in_right, R.animator.snake_slide_out_left,
R.animator.snake_slide_in_left, R.animator.snake_slide_out_right, fragment, addToBackStack);
}
- public void push(Class extends BaseFragment> fragment) {
+ public void push(Class extends android.app.Fragment> fragment) {
push(fragment, true);
}
- public void switchTo(Class extends BaseFragment> fragment) {
+ public void switchTo(Class extends android.app.Fragment> fragment) {
push(0, 0, 0, 0, fragment, true);
}
public void push(@AnimatorRes int enter, @AnimatorRes int exit, @AnimatorRes int popEnter,
- @AnimatorRes int popExit, @NonNull Fragment fragment, boolean addToBackStack) {
+ @AnimatorRes int popExit, @NonNull android.app.Fragment fragment, boolean addToBackStack) {
try {
if (fragment.getClass().getName().equals(mCurrentFragmentTag)) return;
@@ -265,17 +265,17 @@ public void push(@AnimatorRes int enter, @AnimatorRes int exit, @AnimatorRes int
}
}
- public void push(BaseFragment fragment, boolean addToBackStack) {
+ public void push(android.app.Fragment fragment, boolean addToBackStack) {
push(R.animator.snake_slide_in_right, R.animator.snake_slide_out_left,
R.animator.snake_slide_in_left, R.animator.snake_slide_out_right, fragment, addToBackStack);
}
- public void push(BaseFragment fragment) {
+ public void push(android.app.Fragment fragment) {
push(fragment, true);
}
public void supportPush(@AnimRes int enter, @AnimRes int exit, @AnimRes int popEnter,
- @AnimRes int popExit, @NonNull Class extends BaseSupportFragment> fragment, boolean addToBackStack) {
+ @AnimRes int popExit, @NonNull Class extends android.support.v4.app.Fragment> fragment, boolean addToBackStack) {
try {
if (fragment.getName().equals(mCurrentFragmentTag)) return;
@@ -313,16 +313,16 @@ public void supportPush(@AnimRes int enter, @AnimRes int exit, @AnimRes int popE
}
}
- public void supportPush(Class extends BaseSupportFragment> fragment, boolean addToBackStack) {
+ public void supportPush(Class extends android.support.v4.app.Fragment> fragment, boolean addToBackStack) {
supportPush(R.anim.snake_slide_in_right, R.anim.snake_slide_out_left,
R.anim.snake_slide_in_left, R.anim.snake_slide_out_right, fragment, addToBackStack);
}
- public void supportPush(Class extends BaseSupportFragment> fragment) {
- supportPush(fragment, true);
+ public void supportSwitchTo(android.support.v4.app.Fragment fragment) {
+ supportPush(0, 0, 0, 0, fragment, true);
}
- public void supportSwitchTo(Class extends BaseSupportFragment> fragment) {
+ public void supportSwitchTo(Class extends android.support.v4.app.Fragment> fragment) {
supportPush(0, 0, 0, 0, fragment, true);
}
@@ -360,13 +360,13 @@ public void supportPush(@AnimRes int enter, @AnimRes int exit, @AnimRes int popE
}
}
- public void supportPush(BaseSupportFragment fragment, boolean addToBackStack) {
+ public void supportPush(android.support.v4.app.Fragment fragment, boolean addToBackStack) {
supportPush(R.anim.snake_slide_in_right, R.anim.snake_slide_out_left,
R.anim.snake_slide_in_left, R.anim.snake_slide_out_right, fragment, addToBackStack);
}
- public void supportPush(BaseFragment fragment) {
- push(fragment, true);
+ public void supportPush(android.support.v4.app.Fragment fragment) {
+ supportPush(fragment, true);
}
public boolean popFragment() {
diff --git a/demo/src/main/java/com/youngfeng/snake/demo/ui/BaseSupportFragment2.java b/demo/src/main/java/com/youngfeng/snake/demo/ui/BaseSupportFragment2.java
new file mode 100644
index 0000000..72ddd04
--- /dev/null
+++ b/demo/src/main/java/com/youngfeng/snake/demo/ui/BaseSupportFragment2.java
@@ -0,0 +1,181 @@
+package com.youngfeng.snake.demo.ui;
+
+import android.animation.Animator;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
+import android.support.v7.widget.Toolbar;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.youngfeng.snake.Snake;
+import com.youngfeng.snake.animation.SnakeAnimationController;
+import com.youngfeng.snake.demo.R;
+import com.youngfeng.snake.demo.annotations.BindView;
+import com.youngfeng.snake.demo.ui.widget.TranslateLinearLayout;
+
+import butterknife.ButterKnife;
+
+/**
+ * Base class of all support fragments, it extends from {@link com.youngfeng.snake.support.v4.app.Fragment}
+ *
+ * @author Scott Smith 2017-12-24 10:29
+ */
+public class BaseSupportFragment2 extends com.youngfeng.snake.support.v4.app.Fragment implements SnakeAnimationController {
+ private Toolbar mToolbar;
+ private TranslateLinearLayout mContentView;
+ private final String KEY_STATE_HIDDEN = "com.youngfeng:fragment.state.hidden";
+ private boolean mDisableAnimation = false;
+
+ @Override
+ public void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ if(null != savedInstanceState) {
+ restore(savedInstanceState);
+ }
+ }
+
+ @Override
+ public void onActivityCreated(@Nullable Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+
+ autoUpdateTitle();
+ onInitView();
+ }
+
+ public void autoUpdateTitle() {
+ if(needAutoUpdateTitle()) {
+ setTitle(getClass().getSimpleName().replace("_SnakeProxy", ""));
+ }
+ }
+
+ private void restore(@NonNull Bundle savedInstanceState) {
+ boolean isHidden = savedInstanceState.getBoolean(KEY_STATE_HIDDEN);
+ if(isHidden) {
+ getFragmentManager().beginTransaction().hide(this).commitAllowingStateLoss();
+ } else {
+ getFragmentManager().beginTransaction().show(this).commitAllowingStateLoss();
+ }
+ }
+
+ public void setTitle(int titleId) {
+ setTitle(getString(titleId));
+ }
+
+ public void setTitle(CharSequence title) {
+ if(null != mToolbar) {
+ TextView titleView = mToolbar.findViewById(R.id.text_title);
+ titleView.setText(title);
+ }
+ }
+
+ @Nullable
+ @Override
+ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
+ mContentView = new TranslateLinearLayout(getActivity());
+ mContentView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT));
+ mContentView.setOrientation(LinearLayout.VERTICAL);
+ addToolbarToContentView();
+ bindViewToContentView(inflater, container);
+
+ return mContentView;
+ }
+
+ private void addToolbarToContentView() {
+ mToolbar = toolbar();
+
+ if(null != mToolbar && null != mContentView) {
+ mContentView.removeView(mToolbar);
+ mContentView.addView(mToolbar, 0);
+
+ mToolbar.findViewById(R.id.text_return_back).setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ getActivity().onBackPressed();
+ }
+ });
+ }
+ }
+
+ private void bindViewToContentView(LayoutInflater inflater, ViewGroup container) {
+ BindView bindView = getClass().getAnnotation(BindView.class);
+ if(null != bindView) {
+ View view = inflater.inflate(bindView.layoutId(), container, false);
+ mContentView.addView(view);
+
+ if(bindView.bindToButterKnife()) {
+ ButterKnife.bind(this, mContentView);
+ }
+ }
+ }
+
+ @Override
+ public Animator onCreateAnimator(int transit, boolean enter, int nextAnim) {
+ return Snake.wrap(super.onCreateAnimator(transit, enter, nextAnim), this);
+ }
+
+ // @Override
+// public Animator onCreateAnimator(int transit, boolean enter, int nextAnim) {
+// if(mDisableAnimation) {
+// return AnimationFactory.emptyAnimator();
+// }
+// return super.onCreateAnimator(transit, enter, nextAnim);
+// }
+
+ @Override
+ public void disableAnimation(boolean disable) {
+ mDisableAnimation = disable;
+ }
+
+ @Override
+ public boolean animationDisabled() {
+ return mDisableAnimation;
+ }
+
+ protected @Nullable Toolbar toolbar() {
+ return (Toolbar) LayoutInflater.from(getActivity())
+ .inflate(R.layout.default_toolbar, mContentView, false);
+ }
+
+ public final void push(Class extends BaseSupportFragment2> fragment, boolean addToBackStack) {
+ if(!(getActivity() instanceof BaseActivity) || getActivity().isFinishing()) return;
+
+ ((BaseActivity) getActivity()).supportPush(fragment, addToBackStack);
+ }
+
+ public final void push(Class extends BaseSupportFragment2> fragment) {
+ push(fragment, true);
+ }
+
+ public final void push(BaseSupportFragment2 fragment, boolean addToBackStack) {
+ if(!(getActivity() instanceof BaseActivity) || getActivity().isFinishing()) return;
+
+ ((BaseActivity) getActivity()).supportPush(fragment, addToBackStack);
+ }
+
+ public final void push(BaseSupportFragment2 fragment) {
+ push(fragment, true);
+ }
+
+ public final void pop() {
+
+ }
+
+ public void toast(String msg) {
+ if(getActivity() instanceof BaseActivity) {
+ ((BaseActivity)getActivity()).toast(msg);
+ }
+ }
+
+ protected void onInitView() {}
+
+ protected boolean needAutoUpdateTitle() {
+ return true;
+ }
+}
diff --git a/demo/src/main/res/layout/activity_main.xml b/demo/src/main/res/layout/activity_main.xml
index 5baaf88..2473abd 100644
--- a/demo/src/main/res/layout/activity_main.xml
+++ b/demo/src/main/res/layout/activity_main.xml
@@ -56,6 +56,13 @@
android:layout_height="wrap_content"
android:text="@string/mix_use" />
+
+