/*
* Copyright 2016 bingoogolapple
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.bingoogolapple.swipebacklayout;
import android.app.Activity;
import android.content.Intent;
import android.support.annotation.DrawableRes;
import android.support.annotation.FloatRange;
import android.view.View;
/**
* 作者:王浩 邮件:bingoogolapple@gmail.com
* 创建时间:17/1/4 下午3:44
* 描述:滑动返回帮助类
*/
public class BGASwipeBackHelper {
private Activity mActivity;
private Delegate mDelegate;
private BGASwipeBackLayout mSwipeBackLayout;
public BGASwipeBackHelper(Activity activity, Delegate delegate) {
mActivity = activity;
mDelegate = delegate;
initSwipeBackFinish();
}
/**
* 初始化滑动返回
*/
private void initSwipeBackFinish() {
if (mDelegate.isSupportSwipeBack()) {
mSwipeBackLayout = new BGASwipeBackLayout(mActivity);
mSwipeBackLayout.attachToActivity(mActivity);
mSwipeBackLayout.setPanelSlideListener(new BGASwipeBackLayout.PanelSlideListener() {
@Override
public void onPanelSlide(View panel, float slideOffset) {
// 开始滑动返回时关闭软键盘
if (slideOffset < 0.03) {
BGAKeyboardUtil.closeKeyboard(mActivity);
}
mDelegate.onSwipeBackLayoutSlide(slideOffset);
}
@Override
public void onPanelOpened(View panel) {
mDelegate.onSwipeBackLayoutExecuted();
}
@Override
public void onPanelClosed(View panel) {
mDelegate.onSwipeBackLayoutCancel();
}
});
}
}
/**
* 设置滑动返回是否可用。默认值为 true
*
* @param swipeBackEnable
* @return
*/
public BGASwipeBackHelper setSwipeBackEnable(boolean swipeBackEnable) {
if (mSwipeBackLayout != null) {
mSwipeBackLayout.setSwipeBackEnable(swipeBackEnable);
}
return this;
}
/**
* 设置是否仅仅跟踪左侧边缘的滑动返回。默认值为 true
*
* @param isOnlyTrackingLeftEdge
* @return
*/
public BGASwipeBackHelper setIsOnlyTrackingLeftEdge(boolean isOnlyTrackingLeftEdge) {
if (mSwipeBackLayout != null) {
mSwipeBackLayout.setIsOnlyTrackingLeftEdge(isOnlyTrackingLeftEdge);
}
return this;
}
/**
* 设置是否是微信滑动返回样式。默认值为 true
*
* @param isWeChatStyle
* @return
*/
public BGASwipeBackHelper setIsWeChatStyle(boolean isWeChatStyle) {
if (mSwipeBackLayout != null) {
mSwipeBackLayout.setIsWeChatStyle(isWeChatStyle);
}
return this;
}
/**
* 设置阴影资源 id。默认值为 R.drawable.bga_sbl_shadow
*
* @param shadowResId
* @return
*/
public BGASwipeBackHelper setShadowResId(@DrawableRes int shadowResId) {
if (mSwipeBackLayout != null) {
mSwipeBackLayout.setShadowResId(shadowResId);
}
return this;
}
/**
* 设置是否显示滑动返回的阴影效果。默认值为 true
*
* @param isNeedShowShadow
* @return
*/
public BGASwipeBackHelper setIsNeedShowShadow(boolean isNeedShowShadow) {
if (mSwipeBackLayout != null) {
mSwipeBackLayout.setIsNeedShowShadow(isNeedShowShadow);
}
return this;
}
/**
* 设置阴影区域的透明度是否根据滑动的距离渐变。默认值为 true
*
* @param isShadowAlphaGradient
* @return
*/
public BGASwipeBackHelper setIsShadowAlphaGradient(boolean isShadowAlphaGradient) {
if (mSwipeBackLayout != null) {
mSwipeBackLayout.setIsShadowAlphaGradient(isShadowAlphaGradient);
}
return this;
}
/**
* 设置触发释放后自动滑动返回的阈值,默认值为 0.3f
*
* @param threshold
*/
public BGASwipeBackHelper setSwipeBackThreshold(@FloatRange(from = 0.0f, to = 1.0f) float threshold) {
if (mSwipeBackLayout != null) {
mSwipeBackLayout.setSwipeBackThreshold(threshold);
}
return this;
}
/**
* 是否正在滑动
*
* @return
*/
public boolean isSliding() {
if (mSwipeBackLayout != null) {
return mSwipeBackLayout.isSliding();
}
return false;
}
/**
* 执行跳转到下一个 Activity 的动画
*/
public void executeForwardAnim() {
executeForwardAnim(mActivity);
}
/**
* 执行回到到上一个 Activity 的动画
*/
public void executeBackwardAnim() {
executeBackwardAnim(mActivity);
}
/**
* 执行滑动返回到到上一个 Activity 的动画
*/
public void executeSwipeBackAnim() {
executeSwipeBackAnim(mActivity);
}
/**
* 执行跳转到下一个 Activity 的动画。这里弄成静态方法,方便在 Fragment 中调用
*/
public static void executeForwardAnim(Activity activity) {
activity.overridePendingTransition(R.anim.bga_sbl_activity_forward_enter, R.anim.bga_sbl_activity_forward_exit);
}
/**
* 执行回到到上一个 Activity 的动画。这里弄成静态方法,方便在 Fragment 中调用
*/
public static void executeBackwardAnim(Activity activity) {
activity.overridePendingTransition(R.anim.bga_sbl_activity_backward_enter, R.anim.bga_sbl_activity_backward_exit);
}
/**
* 执行滑动返回到到上一个 Activity 的动画。这里弄成静态方法,方便在 Fragment 中调用
*/
public static void executeSwipeBackAnim(Activity activity) {
activity.overridePendingTransition(R.anim.bga_sbl_activity_swipeback_enter, R.anim.bga_sbl_activity_swipeback_exit);
}
/**
* 跳转到下一个 Activity,并且销毁当前 Activity
*
* @param cls 下一个 Activity 的 Class
*/
public void forwardAndFinish(Class<?> cls) {
forward(cls);
mActivity.finish();
}
/**
* 跳转到下一个 Activity,不销毁当前 Activity
*
* @param cls 下一个 Activity 的 Class
*/
public void forward(Class<?> cls) {
BGAKeyboardUtil.closeKeyboard(mActivity);
mActivity.startActivity(new Intent(mActivity, cls));
executeForwardAnim();
}
/**
* 跳转到下一个 Activity,不销毁当前 Activity
*
* @param cls 下一个 Activity 的 Class
* @param requestCode 请求码
*/
public void forward(Class<?> cls, int requestCode) {
forward(new Intent(mActivity, cls), requestCode);
}
/**
* 跳转到下一个 Activity,销毁当前 Activity
*
* @param intent 下一个 Activity 的意图对象
*/
public void forwardAndFinish(Intent intent) {
forward(intent);
mActivity.finish();
}
/**
* 跳转到下一个 Activity,不销毁当前 Activity
*
* @param intent 下一个 Activity 的意图对象
*/
public void forward(Intent intent) {
BGAKeyboardUtil.closeKeyboard(mActivity);
mActivity.startActivity(intent);
executeForwardAnim();
}
/**
* 跳转到下一个 Activity,不销毁当前 Activity
*
* @param intent 下一个 Activity 的意图对象
* @param requestCode 请求码
*/
public void forward(Intent intent, int requestCode) {
BGAKeyboardUtil.closeKeyboard(mActivity);
mActivity.startActivityForResult(intent, requestCode);
executeForwardAnim();
}
/**
* 回到上一个 Activity,并销毁当前 Activity
*/
public void backward() {
BGAKeyboardUtil.closeKeyboard(mActivity);
mActivity.finish();
executeBackwardAnim();
}
/**
* 滑动返回上一个 Activity,并销毁当前 Activity
*/
public void swipeBackward() {
BGAKeyboardUtil.closeKeyboard(mActivity);
mActivity.finish();
executeSwipeBackAnim();
}
/**
* 回到上一个 Activity,并销毁当前 Activity(应用场景:欢迎、登录、注册这三个界面)
*
* @param cls 上一个 Activity 的 Class
*/
public void backwardAndFinish(Class<?> cls) {
BGAKeyboardUtil.closeKeyboard(mActivity);
mActivity.startActivity(new Intent(mActivity, cls));
mActivity.finish();
executeBackwardAnim();
}
public interface Delegate {
/**
* 是否支持滑动返回
*
* @return
*/
boolean isSupportSwipeBack();
/**
* 正在滑动返回
*
* @param slideOffset 从 0 到 1
*/
void onSwipeBackLayoutSlide(float slideOffset);
/**
* 没达到滑动返回的阈值,取消滑动返回动作,回到默认状态
*/
void onSwipeBackLayoutCancel();
/**
* 滑动返回执行完毕,销毁当前 Activity
*/
void onSwipeBackLayoutExecuted();
}
}