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 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 fragment, boolean addToBackStack) { + public void push(Class 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 fragment) { + public void push(Class fragment) { push(fragment, true); } - public void switchTo(Class fragment) { + public void switchTo(Class 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 fragment, boolean addToBackStack) { + @AnimRes int popExit, @NonNull Class 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 fragment, boolean addToBackStack) { + public void supportPush(Class 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 fragment) { - supportPush(fragment, true); + public void supportSwitchTo(android.support.v4.app.Fragment fragment) { + supportPush(0, 0, 0, 0, fragment, true); } - public void supportSwitchTo(Class fragment) { + public void supportSwitchTo(Class 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 fragment, boolean addToBackStack) { + if(!(getActivity() instanceof BaseActivity) || getActivity().isFinishing()) return; + + ((BaseActivity) getActivity()).supportPush(fragment, addToBackStack); + } + + public final void push(Class 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" /> +