标签:
这几个动效是从cm里拿出来的,需要修改的代码,在Workspace.java里增加些代码。修改步骤:
定义几个变量和常量:
/*****************************tangxuankai add start**************************/ protected TransitionEffect mTransitionEffect; protected boolean mUseTransitionEffect = true; private boolean mScrollTransformsSet; protected static final float TRANSITION_SCREEN_ROTATION = 35f; protected static float CAMERA_DISTANCE = 6500; protected static final float TRANSITION_SCALE_FACTOR = 0.5f; /*****************************tangxuankai add end**************************/
protected void screenScrolled(int screenCenter) {
………………
/************tangxuankai add to change scroll animation start*************************/
		// TODO change ScreenScroll animation 
	boolean isInOverscroll = false; //mOverScrollX < 0 || mOverScrollX > mMaxScrollX;
//        // Apply transition effect and adjacent screen fade if enabled
//    	SharedPreferences sp = getContext().getSharedPreferences(
//    			"com.android.launcher3.prefs", Context.MODE_PRIVATE);
		int screenEffectNum = 4;//sp.getInt("screenEffect", 0);
		for (int i = 0; i < getChildCount(); i++) {
			View v = getPageAt(i);
			if (v != null) {
				float scrollProgress = getScrollProgress(screenCenter, v, i);
				switch (screenEffectNum) {
				case 0:
					changeScreenEffect(isInOverscroll, i, v, scrollProgress,"none");
					break;
				case 1:
					changeScreenEffect(isInOverscroll, i, v, scrollProgress,"cube-out");
					break;
				case 2:
					changeScreenEffect(isInOverscroll, i, v, scrollProgress,"zoom-in");
					break;
				case 3:
					changeScreenEffect(isInOverscroll, i, v, scrollProgress,"stack");
					break;
				case 4:
					changeScreenEffect(isInOverscroll, i, v, scrollProgress,"flip");
					break;
				case 5:
					changeScreenEffect(isInOverscroll, i, v, scrollProgress,"cylinder-in");
					break;
				case 6:
					changeScreenEffect(isInOverscroll, i, v, scrollProgress,"rotate-down");
					break;
				case 7:
					changeScreenEffect(isInOverscroll, i, v, scrollProgress,"accordion");
					break;
				default:
					break;
				}
			}
		}
		/************tangxuankai add to change scroll animation end*************************/
}然后在代码里增加:
	private void changeScreenEffect(boolean isInOverscroll, int i, View v,
			float scrollProgress,String effect) {
		TransitionEffect.setFromString(this, effect);
		if (mTransitionEffect != null && mUseTransitionEffect && !isInOverscroll) {
		    mTransitionEffect.screenScrolled(v, i, scrollProgress);
		} else if (mScrollTransformsSet) {
		    v.setPivotX(v.getMeasuredWidth() * 0.5f);
		    v.setPivotY(v.getMeasuredHeight() * 0.5f);
		    v.setRotation(0);
		    v.setRotationX(0);
		    v.setRotationY(0);
		    v.setScaleX(1f);
		    v.setScaleY(1f);
		    v.setTranslationX(0f);
		    v.setTranslationY(0f);
		    v.setVisibility(VISIBLE);
		    setChildAlpha(v, 1f);
		    v.setAlpha(1.0f);
		}
	}
	
	public boolean isLayoutRtl(){
		return Utilities.isRtl(mLauncher.getResources());
	}
    
	public TransitionEffect getTransitionEffect() {
        return mTransitionEffect;
    }
	
	public void setTransitionEffect(TransitionEffect effect) {
        mTransitionEffect = effect;
        // Reset scroll transforms
        if (mScrollTransformsSet) {
            for (int i = 0; i < getChildCount(); i++) {
                View v = getPageAt(i);
                if (v != null) {
                    v.setPivotX(v.getMeasuredWidth() * 0.5f);
                    v.setPivotY(v.getMeasuredHeight() * 0.5f);
                    v.setRotation(0);
                    v.setRotationX(0);
                    v.setRotationY(0);
                    v.setScaleX(1f);
                    v.setScaleY(1f);
                    v.setTranslationX(0f);
                    v.setTranslationY(0f);
                    v.setVisibility(VISIBLE);
                    setChildAlpha(v, 1f);
                }
            }
            mScrollTransformsSet = false;
        }
    }
	
	protected void setChildAlpha(View child, float alpha) {
        child.setAlpha(alpha);
    }
	
	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);
            }
        }
    }Change WorkSpace PageScroll effect
标签:
原文地址:http://blog.csdn.net/tangxuankai/article/details/51351339