美文网首页高级UI
侧滑效果[第十三篇]:侧滑框架SmartSwipe之百叶窗侧滑返

侧滑效果[第十三篇]:侧滑框架SmartSwipe之百叶窗侧滑返

作者: NoBugException | 来源:发表于2019-11-21 17:21 被阅读0次

    首先,看一下效果:

    295.gif

    SmartSwipe框架中使用ActivityShuttersBackConsumer类实现百叶窗侧滑返回,代码如下:

    /**
     * @author billy.qi
     */
    public class ActivityShuttersBackConsumer extends ShuttersConsumer {
        protected ActivityTranslucentUtil mActivityTranslucentUtil;
        protected Activity mActivity;
    
        public ActivityShuttersBackConsumer(Activity activity) {
            this.mActivity = activity;
            this.mActivityTranslucentUtil = new ActivityTranslucentUtil(activity);
        }
    
        @Override
        public void onAttachToWrapper(SmartSwipeWrapper wrapper, SwipeHelper swipeHelper) {
            super.onAttachToWrapper(wrapper, swipeHelper);
            ActivityTranslucentUtil.convertWindowToTranslucent(mActivity);
        }
    
        @Override
        public void onSwipeAccepted(int activePointerId, boolean settling, float initialMotionX, float initialMotionY) {
            if (!mActivityTranslucentUtil.isTranslucent()) {
                mActivityTranslucentUtil.convertActivityToTranslucent();
            }
            super.onSwipeAccepted(activePointerId, settling, initialMotionX, initialMotionY);
        }
    
        @Override
        protected void onDisplayDistanceChanged(int distanceXToDisplay, int distanceYToDisplay, int dx, int dy) {
            if (mActivityTranslucentUtil.isTranslucent()) {
                super.onDisplayDistanceChanged(distanceXToDisplay, distanceYToDisplay, dx, dy);
            }
        }
    
        @Override
        public void onDetachFromWrapper() {
            super.onDetachFromWrapper();
            mActivityTranslucentUtil.convertActivityFromTranslucent();
        }
    
        @Override
        protected void onOpened() {
            super.onOpened();
            if (mListeners == null || mListeners.isEmpty()) {
                if (mActivity != null) {
                    mActivity.finish();
                    mActivity.overridePendingTransition(R.anim.anim_none, R.anim.anim_none);
                }
            }
        }
    
        @Override
        protected void onClosed() {
            super.onClosed();
            mActivityTranslucentUtil.convertActivityFromTranslucent();
        }
    
        @Override
        public int clampDistanceVertical(int distanceY, int dy) {
            //resolve smooth problem while convert to transparent
            if (mActivityTranslucentUtil.isTranslucent()) {
                return super.clampDistanceVertical(distanceY, dy);
            }
            return 0;
        }
    
        @Override
        public int clampDistanceHorizontal(int distanceX, int dx) {
            //resolve smooth problem while convert to transparent
            if (mActivityTranslucentUtil.isTranslucent()) {
                return super.clampDistanceHorizontal(distanceX, dx);
            }
            return 0;
        }
    
    }
    

    另外,Activity的侧滑返回需要一个辅助类SmartSwipeBack,如下:

    public class SmartSwipeBack {
        public static final ArrayList<Activity> ACTIVITIES = new ArrayList<>();
        private static IPreviousFinder mPreviousFinder;
    
        public interface SwipeBackConsumerFactory {
            /**
             * Create SwipeConsumer to do swipe back business for activity
             * @param activity activity to wrap with swipe back
             * @return SwipeConsumer
             */
            SwipeConsumer createSwipeBackConsumer(Activity activity);
        }
        public interface ActivitySwipeBackFilter {
            /**
             * Determine whether the activity parameter should swipe back
             * @param activity The activity to wrap or not
             * @return true: need to wrap with swipe back, false: do not wrap
             */
            boolean onFilter(Activity activity);
        }
    
        public static void activityBack(Application application, SwipeBackConsumerFactory factory) {
            activityBack(application, factory, null);
        }
    
        /**
         * The core function for global activity swipe back
         * @param application application
         * @param factory factory to create SwipeConsumer for each Activity
         * @param filter filter of activity, to determine which activity should finish via swipe motion
         */
        public static void activityBack(Application application, SwipeBackConsumerFactory factory, ActivitySwipeBackFilter filter) {
            if (activitySwipeBackListener == null) {
                activitySwipeBackListener = new ActivitySwipeBackListener(factory, filter);
            } else {
                application.unregisterActivityLifecycleCallbacks(activitySwipeBackListener);
                activitySwipeBackListener.mFactory = factory;
                activitySwipeBackListener.mFilter = filter;
            }
            application.registerActivityLifecycleCallbacks(activitySwipeBackListener);
        }
    
        ////////////////////////////////////////////
        //
        //  swipe back with StayConsumer
        //
        ////////////////////////////////////////////
    
        public static void activityStayBack(Application application, SmartSwipeBack.ActivitySwipeBackFilter filter) {
            final int edgeSize = SmartSwipe.dp2px(20, application);
            activityStayBack(application, filter, edgeSize, 0, SwipeConsumer.DIRECTION_LEFT);
        }
    
        public static void activityStayBack(Application application, SmartSwipeBack.ActivitySwipeBackFilter filter, final int edgeSize, final int minVelocity, final int direction) {
            SmartSwipeBack.activityBack(application, new SwipeBackConsumerFactory() {
                @Override
                public SwipeConsumer createSwipeBackConsumer(final Activity activity) {
                    return new StayConsumer()
                            .setMinVelocity(minVelocity)
                            .setEdgeSize(edgeSize)
                            .enableDirection(direction)
                            .addListener(new SimpleSwipeListener() {
                                @Override
                                public void onSwipeOpened(SmartSwipeWrapper wrapper, SwipeConsumer consumer, int direction) {
                                    if (activity != null) {
                                        activity.finish();
                                    }
                                }
                            });
                }
            }, filter);
        }
    
        ////////////////////////////////////////////
        //
        //  swipe back with ActivitySlidingBackConsumer
        //
        ////////////////////////////////////////////
    
        public static void activitySlidingBack(Application application, SmartSwipeBack.ActivitySwipeBackFilter filter) {
            final float factor = 0.5f;
            // with default scrimColor: transparent
            activitySlidingBack(application, filter, factor);
        }
    
        public static void activitySlidingBack(Application application, SmartSwipeBack.ActivitySwipeBackFilter filter, float factor) {
            //default edge size
            final int edgeSize = SmartSwipe.dp2px(20, application);
            final int shadowColor = 0x80000000;
            final int shadowSize = SmartSwipe.dp2px(10, application);
            final int direction = SwipeConsumer.DIRECTION_LEFT;
            activitySlidingBack(application, filter, edgeSize, Color.TRANSPARENT, shadowColor, shadowSize, factor, direction);
        }
    
        public static void activitySlidingBack(Application application, SmartSwipeBack.ActivitySwipeBackFilter filter
                , final int edgeSize, final int scrimColor, final int shadowColor, final int shadowSize
                , final float factor, final int direction) {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
                //if sdk version is less than 21, the compatibility of ActivitySlidingBackConsumer is not good enough
                //use StayConsumer instead for android sdk version <= 20
                activityStayBack(application, filter, edgeSize, 0, direction);
            } else {
                activityBack(application, new SwipeBackConsumerFactory() {
                    @Override
                    public SwipeConsumer createSwipeBackConsumer(final Activity activity) {
                        return new ActivitySlidingBackConsumer(activity)
                                .setRelativeMoveFactor(factor)
                                .setScrimColor(scrimColor)
                                .setShadowColor(shadowColor)
                                .setShadowSize(shadowSize)
                                .setEdgeSize(edgeSize)
                                .enableDirection(direction)
                                .addListener(new SimpleSwipeListener(){
                                    @Override
                                    public void onSwipeOpened(SmartSwipeWrapper wrapper, SwipeConsumer consumer, int direction) {
                                        if (activity != null) {
                                            activity.finish();
                                            activity.overridePendingTransition(R.anim.anim_none, R.anim.anim_none);
                                        }
                                    }
                                });
                    }
                }, filter);
            }
        }
    
        ////////////////////////////////////////
        //
        //  swipe back with BezierBackConsumer
        //
        ////////////////////////////////////////
    
        public static void activityBezierBack(Application application, SmartSwipeBack.ActivitySwipeBackFilter filter) {
            final int edgeSize = SmartSwipe.dp2px(20, application);
            activityBezierBack(application, filter, edgeSize);
        }
    
        public static void activityBezierBack(Application application, SmartSwipeBack.ActivitySwipeBackFilter filter, int edgeSize) {
            final int thickness = SmartSwipe.dp2px(30, application);
            final int size = SmartSwipe.dp2px(200, application);
            final int direction = SwipeConsumer.DIRECTION_LEFT;
            activityBezierBack(application, filter, edgeSize, size, thickness, Color.BLACK, Color.WHITE, direction);
        }
    
        public static void activityBezierBack(Application application, SmartSwipeBack.ActivitySwipeBackFilter filter
                , final int edgeSize, final int size, final int thickness, final int color, final int arrowColor, final int direction) {
            SmartSwipeBack.activityBack(application, new SwipeBackConsumerFactory() {
                @Override
                public SwipeConsumer createSwipeBackConsumer(final Activity activity) {
                    return new BezierBackConsumer()
                            .setColor(color)
                            .setArrowColor(arrowColor)
                            .setSize(size)
                            .setOpenDistance(thickness)
                            .addListener(new SimpleSwipeListener() {
                                @Override
                                public void onSwipeRelease(SmartSwipeWrapper wrapper, SwipeConsumer consumer, int direction, float progress, float xVelocity, float yVelocity) {
                                    if (progress >= 1) {
                                        activity.finish();
                                    }
                                }
                            })
                            .setEdgeSize(edgeSize)
                            .enableDirection(direction);
                }
            }, filter);
        }
    
        ////////////////////////////////////////
        //
        //  swipe back with ActivityDoorBackConsumer
        //
        ////////////////////////////////////////
    
        public static void activityDoorBack(Application application, SmartSwipeBack.ActivitySwipeBackFilter filter) {
            final int edgeSize = SmartSwipe.dp2px(20, application);
            final int scrimColor = 0x80000000;
            final boolean refreshable = true;
            activityDoorBack(application, filter, SwipeConsumer.DIRECTION_LEFT, edgeSize, scrimColor, refreshable);
        }
    
        public static void activityDoorBack(Application application, SmartSwipeBack.ActivitySwipeBackFilter filter
                , final int direction, final int edgeSize, final int scrimColor, final boolean refreshable) {
            SmartSwipeBack.activityBack(application, new SwipeBackConsumerFactory() {
                @Override
                public SwipeConsumer createSwipeBackConsumer(final Activity activity) {
                    return new ActivityDoorBackConsumer(activity)
                            .setRefreshable(refreshable)
                            .setScrimColor(scrimColor)
                            .enableDirection(direction)
                            .setEdgeSize(edgeSize)
                            .addListener(new SimpleSwipeListener() {
                                @Override
                                public void onSwipeOpened(SmartSwipeWrapper wrapper, SwipeConsumer consumer, int direction) {
                                    activity.finish();
                                    activity.overridePendingTransition(R.anim.anim_none, R.anim.anim_none);
                                }
                            });
                }
            }, filter);
        }
    
        ////////////////////////////////////////
        //
        //  swipe back with ActivityShuttersBackConsumer
        //
        ////////////////////////////////////////
    
        public static void activityShuttersBack(Application application, SmartSwipeBack.ActivitySwipeBackFilter filter) {
            final int edgeSize = SmartSwipe.dp2px(20, application);
            final int scrimColor = 0x80000000;
            final boolean refreshable = true;
            activityShuttersBack(application, filter, SwipeConsumer.DIRECTION_LEFT, edgeSize, scrimColor, refreshable);
        }
    
        public static void activityShuttersBack(Application application, SmartSwipeBack.ActivitySwipeBackFilter filter
                , final int direction, final int edgeSize, final int scrimColor, final boolean refreshable) {
            SmartSwipeBack.activityBack(application, new SwipeBackConsumerFactory() {
                @Override
                public SwipeConsumer createSwipeBackConsumer(final Activity activity) {
                    return new ActivityShuttersBackConsumer(activity)
                            .setRefreshable(refreshable)
                            .setScrimColor(scrimColor)
                            .enableDirection(direction)
                            .setEdgeSize(edgeSize)
                            .addListener(new SimpleSwipeListener() {
                                @Override
                                public void onSwipeOpened(SmartSwipeWrapper wrapper, SwipeConsumer consumer, int direction) {
                                    activity.finish();
                                    activity.overridePendingTransition(R.anim.anim_none, R.anim.anim_none);
                                }
                            });
                }
            }, filter);
        }
    
        private static ActivitySwipeBackListener activitySwipeBackListener;
    
        public static class ActivitySwipeBackListener implements Application.ActivityLifecycleCallbacks {
            private SwipeBackConsumerFactory mFactory;
            private ActivitySwipeBackFilter mFilter;
    
            ActivitySwipeBackListener(SwipeBackConsumerFactory factory, ActivitySwipeBackFilter filter) {
                this.mFactory = factory;
                this.mFilter = filter;
            }
    
            @Override
            public void onActivityCreated(final Activity activity, Bundle savedInstanceState) {
                ACTIVITIES.add(activity);
                if (mFactory == null) {
                    return;
                }
                if (mFilter != null && !mFilter.onFilter(activity)) {
                    return;
                }
                SmartSwipe.wrap(activity).addConsumer(mFactory.createSwipeBackConsumer(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 outState) { }
            @Override public void onActivityDestroyed(Activity activity) {
                ACTIVITIES.remove(activity);
            }
        }
    
        /**
         * find previous activity
         * @param fromActivity the given activity to find its previous
         * @return the previous activity if exists
         * @see ActivitySlidingBackConsumer
         */
        public static Activity findPreviousActivity(Activity fromActivity) {
            if (mPreviousFinder != null) {
                return mPreviousFinder.findPreviousActivity(fromActivity);
            }
            if (fromActivity != null) {
                int index = ACTIVITIES.indexOf(fromActivity);
                if (index > 0) {
                    return ACTIVITIES.get(index - 1);
                }
            }
            return null;
        }
    
        public static void setPreviousFinder(IPreviousFinder previousFinder) {
            mPreviousFinder = previousFinder;
        }
    
        public static interface IPreviousFinder {
            /**
             * find the previous activity for the given activity
             * @param fromActivity activity given
             * @return the previous activity
             */
            Activity findPreviousActivity(Activity fromActivity);
        }
    }
    

    代码实现如下:

        SmartSwipe.wrap(this)
                .addConsumer(new ActivityShuttersBackConsumer(this))
                .setScrimColor(0x7F000000)
                .enableAllDirections();
    

    百叶窗的几个重要属性在这里也会生效:

        ActivityShuttersBackConsumer activityShuttersBackConsumer = new ActivityShuttersBackConsumer(this);
        //遮罩玻璃颜色色值,如果为0,则不显示遮罩
        activityShuttersBackConsumer.setScrimColor(Color.BLUE);
        //百叶窗叶子数,默认为5
        activityShuttersBackConsumer.setLeavesCount(3);
        //侧滑时是否实时刷新,为true时能实时刷新显示,对于页面中有动画,能实时显示动画;为false时只取一次view的快照,但性能损耗低
        activityShuttersBackConsumer.setRefreshable(false);
        //当mRefreshable为true时,设置自动刷新的帧率,默认值为30
        activityShuttersBackConsumer.setRefreshFrameRate(30);
        //在获取view的快照成功前是否开始侧滑。在作为入场动画时较为有用:先设置为false,立即打开,再设置为true,然后平滑关闭
        activityShuttersBackConsumer.setWaitForScreenshot(true);
        SmartSwipe.wrap(this)
                .addConsumer(activityShuttersBackConsumer)
                .setScrimColor(0x7F000000)
                .enableAllDirections();
    

    [本章完...]

    相关文章

      网友评论

        本文标题:侧滑效果[第十三篇]:侧滑框架SmartSwipe之百叶窗侧滑返

        本文链接:https://www.haomeiwen.com/subject/vgbtwctx.html