launcher滑屏特效集合汇总

本文从 CM 源码中摘录了 Android Launcher 的多种屏幕滑动特效,包括但不限于缩放、旋转、立方体、堆叠、折叠、圆柱形和交叉淡入淡出等特效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面是本人从CM源码中摘录出来的Android Launcher屏幕滑动特效大集合。做记录用,有兴趣的看看。

protected static abstract class TransitionEffect {
	//定义各种动画效果
        public static final String TRANSITION_EFFECT_NONE = "none";
        public static final String TRANSITION_EFFECT_ZOOM_IN = "zoom-in";
        public static final String TRANSITION_EFFECT_ZOOM_OUT = "zoom-out";
        public static final String TRANSITION_EFFECT_ROTATE_UP = "rotate-up";
        public static final String TRANSITION_EFFECT_ROTATE_DOWN = "rotate-down";
        public static final String TRANSITION_EFFECT_CUBE_IN = "cube-in";
        public static final String TRANSITION_EFFECT_CUBE_OUT = "cube-out";
        public static final String TRANSITION_EFFECT_STACK = "stack";
        public static final String TRANSITION_EFFECT_ACCORDION = "accordion";
        public static final String TRANSITION_EFFECT_FLIP = "flip";
        public static final String TRANSITION_EFFECT_CYLINDER_IN = "cylinder-in";
        public static final String TRANSITION_EFFECT_CYLINDER_OUT = "cylinder-out";
        public static final String TRANSITION_EFFECT_CROSSFADE = "crossfade";
        public static final String TRANSITION_EFFECT_OVERVIEW = "overview";


        protected final Workspace mWorkspace;
        private final String mName;


        public TransitionEffect(Workspace workspace, String name) {
            mWorkspace = workspace;
            mName = name;
        }


        public abstract void screenScrolled(View v, int i, float scrollProgress);


        public final String getName() {
            return mName;
        }


        public static void setFromString(Workspace workspace, String effect) { 
            if (effect.equals(Workspace.TransitionEffect.TRANSITION_EFFECT_NONE)) {
                workspace.setTransitionEffect(null);
            } else if (effect.equals(Workspace.TransitionEffect.TRANSITION_EFFECT_ZOOM_IN)) {
                workspace.setTransitionEffect(new Workspace.TransitionEffect.Zoom(workspace, true));
            } else if (effect.equals(Workspace.TransitionEffect.TRANSITION_EFFECT_ZOOM_OUT)) {
                workspace.setTransitionEffect(new Workspace.TransitionEffect.Zoom(workspace, false));
            } else if (effect.equals(Workspace.TransitionEffect.TRANSITION_EFFECT_CUBE_IN)) {
                workspace.setTransitionEffect(new Workspace.TransitionEffect.Cube(workspace, true));
            } else if (effect.equals(Workspace.TransitionEffect.TRANSITION_EFFECT_CUBE_OUT)) {
                workspace.setTransitionEffect(new Workspace.TransitionEffect.Cube(workspace, false));
            } else if (effect.equals(Workspace.TransitionEffect.TRANSITION_EFFECT_ROTATE_UP)) {
                workspace.setTransitionEffect(new Workspace.TransitionEffect.Rotate(workspace, true));
            } else if (effect.equals(Workspace.TransitionEffect.TRANSITION_EFFECT_ROTATE_DOWN)) {
                workspace.setTransitionEffect(new Workspace.TransitionEffect.Rotate(workspace, false));
            } else if (effect.equals(Workspace.TransitionEffect.TRANSITION_EFFECT_STACK)) {
                workspace.setTransitionEffect(new Workspace.TransitionEffect.Stack(workspace));
            } else if (effect.equals(Workspace.TransitionEffect.TRANSITION_EFFECT_ACCORDION)) {
                workspace.setTransitionEffect(new Workspace.TransitionEffect.Accordion(workspace));
            } else if (effect.equals(Workspace.TransitionEffect.TRANSITION_EFFECT_FLIP)) {
                workspace.setTransitionEffect(new Workspace.TransitionEffect.Flip(workspace));
            } else if (effect.equals(Workspace.TransitionEffect.TRANSITION_EFFECT_CYLINDER_IN)) {
                workspace.setTransitionEffect(new Workspace.TransitionEffect.Cylinder(workspace, true));
            } else if (effect.equals(Workspace.TransitionEffect.TRANSITION_EFFECT_CYLINDER_OUT)) {
                workspace.setTransitionEffect(new Workspace.TransitionEffect.Cylinder(workspace, false));
            } else if (effect.equals(Workspace.TransitionEffect.TRANSITION_EFFECT_CROSSFADE)) {
                workspace.setTransitionEffect(new Workspace.TransitionEffect.Crossfade(workspace));
            } else if (effect.equals(Workspace.TransitionEffect.TRANSITION_EFFECT_OVERVIEW)) {
                workspace.setTransitionEffect(new Workspace.TransitionEffect.Overview(workspace));
            }
        }


        public static class Zoom extends TransitionEffect {
            private boolean mIn;


            public Zoom(Workspace workspace, boolean in) {
                super(workspace, in ? TRANSITION_EFFECT_ZOOM_IN : TRANSITION_EFFECT_ZOOM_OUT);
                mIn = in;
            }


            @Override
            public void screenScrolled(View v, int i, float scrollProgress) {
                float scale = 1.0f + (mIn ? -0.8f : 0.4f) * Math.abs(scrollProgress);


                // Extra translation to account for the increase in size
                if (!mIn) {
                    float translationX = v.getMeasuredWidth() * 0.1f * -scrollProgress;
                    v.setTranslationX(translationX);
                }


                v.setScaleX(scale);
                v.setScaleY(scale);
            }
        }


        public static class Rotate extends TransitionEffect {
            private boolean mUp;


            public Rotate(Workspace pagedView, boolean up) {
                super(pagedView, up ? TRANSITION_EFFECT_ROTATE_UP : TRANSITION_EFFECT_ROTATE_DOWN);
                mUp = up;
            }


            @Override
            public void screenScrolled(View v, int i, float scrollProgress) {
                float rotation =
                        (mUp ? TRANSITION_SCREEN_ROTATION : -TRANSITION_SCREEN_ROTATION) * scrollProgress;


                float translationX = v.getMeasuredWidth() * scrollProgress;


                float rotatePoint =
                        (v.getMeasuredWidth() * 0.5f) /
                                (float) Math.tan(Math.toRadians((double) (TRANSITION_SCREEN_ROTATION * 0.5f)));


                v.setPivotX(v.getMeasuredWidth() * 0.5f);
                if (mUp) {
                    v.setPivotY(-rotatePoint);
                } else {
                    v.setPivotY(v.getMeasuredHeight() + rotatePoint);
                }
                v.setRotation(rotation);
                v.setTranslationX(translationX);
            }
        }


        public static class Cube extends TransitionEffect {
            private boolean mIn;


            public Cube(Workspace workspace, boolean in) {
                super(workspace, in ? TRANSITION_EFFECT_CUBE_IN : TRANSITION_EFFECT_CUBE_OUT);
                mIn = in;
            }


            @Override
            public void screenScrolled(View v, int i, float scrollProgress) {
                float rotation = (mIn ? 90.0f : -90.0f) * scrollProgress;


                v.setPivotX(scrollProgress < 0 ? 0 : v.getMeasuredWidth());
                v.setPivotY(v.getMeasuredHeight() * 0.5f);
                v.setRotationY(rotation);
            }
        }


        public static class Stack extends TransitionEffect {
            private ZInterpolator mZInterpolator = new ZInterpolator(0.5f);
            private DecelerateInterpolator mLeftScreenAlphaInterpolator = new DecelerateInterpolator(4);
            protected AccelerateInterpolator mAlphaInterpolator = new AccelerateInterpolator(0.9f);


            public Stack(Workspace workspace) {
                super(workspace, TRANSITION_EFFECT_STACK);
            }


            @Override
            public void screenScrolled(View v, int i, float scrollProgress) {
                final boolean isRtl = mWorkspace.isLayoutRtl();
                float interpolatedProgress;
                float translationX;
                float maxScrollProgress = Math.max(0, scrollProgress);
                float minScrollProgress = Math.min(0, scrollProgress);


                if (mWorkspace.isLayoutRtl()) {
                    translationX = maxScrollProgress * v.getMeasuredWidth();
                    interpolatedProgress = mZInterpolator.getInterpolation(Math.abs(maxScrollProgress));
                } else {
                    translationX = minScrollProgress * v.getMeasuredWidth();
                    interpolatedProgress = mZInterpolator.getInterpolation(Math.abs(minScrollProgress));
                }
                float scale = (1 - interpolatedProgress) +
                        interpolatedProgress * TRANSITION_SCALE_FACTOR;


                float alpha;
                if (isRtl && (scrollProgress > 0)) {
                    alpha = mAlphaInterpolator.getInterpolation(1 - Math.abs(maxScrollProgress));
                } else if (!isRtl && (scrollProgress < 0)) {
                    alpha = mAlphaInterpolator.getInterpolation(1 - Math.abs(scrollProgress));
                } else {
                    //  On large screens we need to fade the page as it nears its leftmost position
                    alpha = mLeftScreenAlphaInterpolator.getInterpolation(1 - scrollProgress);
                }


                v.setTranslationX(translationX);
                v.setScaleX(scale);
                v.setScaleY(scale);
                if (v instanceof CellLayout) {
                    ((CellLayout) v).getShortcutsAndWidgets().setAlpha(alpha);
                } else {
                    v.setAlpha(alpha);
                }


                // If the view has 0 alpha, we set it to be invisible so as to prevent
                // it from accepting touches
                if (alpha == 0) {
                    v.setVisibility(INVISIBLE);
                } else if (v.getVisibility() != VISIBLE) {
                    v.setVisibility(VISIBLE);
                }
            }
        }


        public static class Accordion extends TransitionEffect {
            public Accordion(Workspace workspace) {
                super(workspace, TRANSITION_EFFECT_ACCORDION);
            }


            @Override
            public void screenScrolled(View v, int i, float scrollProgress) {
                float scale = 1.0f - Math.abs(scrollProgress);


                v.setScaleX(scale);
                v.setPivotX(scrollProgress < 0 ? 0 : v.getMeasuredWidth());
                v.setPivotY(v.getMeasuredHeight() / 2f);
            }
        }


        public static class Flip extends TransitionEffect {
            public Flip(Workspace workspace) {
                super(workspace, TRANSITION_EFFECT_FLIP);
            }


            @Override
            public void screenScrolled(View v, int i, float scrollProgress) {
                float rotation = -180.0f * Math.max(-1f, Math.min(1f, scrollProgress));


                v.setCameraDistance(mWorkspace.mDensity * Workspace.CAMERA_DISTANCE);
                v.setPivotX(v.getMeasuredWidth() * 0.5f);
                v.setPivotY(v.getMeasuredHeight() * 0.5f);
                v.setRotationY(rotation);


                if (scrollProgress >= -0.5f && scrollProgress <= 0.5f) {
                    v.setTranslationX(v.getMeasuredWidth() * scrollProgress);
                } else {
                    v.setTranslationX(0f);
                }
            }
        }


        public static class Cylinder extends TransitionEffect {
            private boolean mIn;


            public Cylinder(Workspace workspace, boolean in) {
                super(workspace, in ? TRANSITION_EFFECT_CYLINDER_IN : TRANSITION_EFFECT_CYLINDER_OUT);
                mIn = in;
            }


            @Override
            public void screenScrolled(View v, int i, float scrollProgress) {
                float rotation = (mIn ? TRANSITION_SCREEN_ROTATION : -TRANSITION_SCREEN_ROTATION) * scrollProgress;


                v.setPivotX((scrollProgress + 1) * v.getMeasuredWidth() * 0.5f);
                v.setPivotY(v.getMeasuredHeight() * 0.5f);
                v.setRotationY(rotation);
            }
        }


        public static class Crossfade extends TransitionEffect {
            public Crossfade(Workspace workspace) {
                super(workspace, TRANSITION_EFFECT_CROSSFADE);
            }


            @Override
            public void screenScrolled(View v, int i, float scrollProgress) {
                float alpha = 1 - Math.abs(scrollProgress);
                v.setPivotX(v.getMeasuredWidth() * 0.5f);
                v.setPivotY(v.getMeasuredHeight() * 0.5f);
                v.setAlpha(alpha);
            }
        }


        public static class Overview extends TransitionEffect {
            private AccelerateDecelerateInterpolator mScaleInterpolator = new AccelerateDecelerateInterpolator();


            public Overview(Workspace workspace) {
                super(workspace, TRANSITION_EFFECT_OVERVIEW);
            }


            @Override
            public void screenScrolled(View v, int i, float scrollProgress) {
                float scale = 1.0f - 0.1f *
                        mScaleInterpolator.getInterpolation(Math.min(0.3f, Math.abs(scrollProgress)) / 0.3f);


                v.setPivotX(scrollProgress < 0 ? 0 : v.getMeasuredWidth());
                v.setPivotY(v.getMeasuredHeight() * 0.5f);
                v.setScaleX(scale);
                v.setScaleY(scale);
                mWorkspace.setChildAlpha(v, scale);
            }
        }
    }

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值