package com.mingle.sweetpick; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.view.animation.DecelerateInterpolator; import android.view.animation.LayoutAnimationController; import android.widget.RelativeLayout; import com.mingle.entity.MenuEntity; import com.mingle.sweetsheet.R; import com.mingle.widget.CRImageView; import com.mingle.widget.FreeGrowUpParentRelativeLayout; import com.mingle.widget.SweetView; import com.nineoldandroids.animation.ObjectAnimator; import com.nineoldandroids.animation.ValueAnimator; import java.util.List; /** * @author zzz40500 * @version 1.0 * @date 2015/8/9. * @github: https://github.com/zzz40500 */ public class CustomDelegate extends Delegate { private SweetView mSweetView; private RelativeLayout mContentRL; private CRImageView sliderIm; private FreeGrowUpParentRelativeLayout mFreeGrowUpParentRelativeLayout; private boolean mIsDragEnable; private View mContentView; private ViewGroup mAnimationView; private AnimationType mContentViewAnimationType; private ValueAnimator mContentViewValueAnimation; private int mContentViewHeight; private int sweetSheetColor; public CustomDelegate(boolean dragEnable, AnimationType contentViewAnimationType) { mIsDragEnable = dragEnable; mContentViewAnimationType = contentViewAnimationType; } public CustomDelegate(boolean dragEnable, AnimationType contentViewAnimationType, int contentViewHeight) { mContentViewHeight = contentViewHeight; mContentViewAnimationType = contentViewAnimationType; mIsDragEnable = dragEnable; } @Override public View createView() { View rootView = LayoutInflater.from(mParentVG.getContext()) .inflate(R.layout.layout_custom_sweet, null, false); mSweetView = (SweetView) rootView.findViewById(R.id.sv); mSweetView.setSweetSheetColor(sweetSheetColor); mFreeGrowUpParentRelativeLayout = (FreeGrowUpParentRelativeLayout) rootView.findViewById(R.id.freeGrowUpParentF); mContentRL = (RelativeLayout) rootView.findViewById(R.id.rl); sliderIm = (CRImageView) rootView.findViewById(R.id.sliderIM); mSweetView.setAnimationListener(new AnimationImp()); if (mContentView != null) { mContentRL.removeAllViews(); mContentRL.addView(mContentView); } if (mContentViewAnimationType == AnimationType.DuangLayoutAnimation) { mAnimationView = null; if (mContentView instanceof ViewGroup) { mAnimationView = (ViewGroup) mContentView; } else { mAnimationView = mContentRL; } Animation animation = AnimationUtils.loadAnimation(mContentRL.getContext(), R.anim.item_duang_show); LayoutAnimationController layoutAnimationController = new LayoutAnimationController(animation); layoutAnimationController.setDelay(0.1f); mAnimationView.setLayoutAnimation(layoutAnimationController); } if(mContentViewHeight > 0){ mFreeGrowUpParentRelativeLayout.setContentHeight(mContentViewHeight); } return rootView; } protected void setMenuList(final List<MenuEntity> menuEntities) { } public CustomDelegate setContentHeight(int height){ if(height >0 && mFreeGrowUpParentRelativeLayout != null){ mFreeGrowUpParentRelativeLayout.setContentHeight(height); }else{ mContentViewHeight=height; } return this; } public RelativeLayout getContentRelativeLayout() { return mContentRL; } protected void show() { super.show(); ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams (ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); if (mRootView.getParent() != null) { mParentVG.removeView(mRootView); } mParentVG.addView(mRootView, lp); mSweetView.show(); } public CustomDelegate setCustomView(View view) { if (mContentRL != null) { mContentRL.removeAllViews(); mContentRL.addView(view); } else { mContentView = view; } return this; } public CustomDelegate setCustomView(View view, RelativeLayout.LayoutParams params) { if (mContentRL != null) { mContentRL.removeAllViews(); mContentRL.addView(view, params); } else { mContentView = view; mContentView.setLayoutParams(params); } return this; } /** * 当 AnimationType = Custom 时候需要传递一个动画进来. */ public CustomDelegate setCustomViewAnimation(ValueAnimator viewAnimation) { mContentViewValueAnimation = viewAnimation; return this; } class AnimationImp implements SweetView.AnimationListener { @Override public void onStart() { mFreeGrowUpParentRelativeLayout.reset(); mStatus = SweetSheet.Status.SHOWING; sliderIm.setVisibility(View.INVISIBLE); mContentRL.setVisibility(View.GONE); } @Override public void onEnd() { if (mStatus == SweetSheet.Status.SHOWING) { mStatus = SweetSheet.Status.SHOW; if(mIsDragEnable) { sliderIm.setVisibility(View.VISIBLE); sliderIm.circularReveal(sliderIm.getWidth() / 2, sliderIm.getHeight() / 2, 0, sliderIm.getWidth()); } } } @Override public void onContentShow() { mContentRL.setVisibility(View.VISIBLE); setContentViewAnimation(); mContentRL.scheduleLayoutAnimation(); } } private void setContentViewAnimation() { switch (mContentViewAnimationType) { case DuangLayoutAnimation: duangLayoutAnimation(); break; case DuangAnimation: duangAnimation(); break; case AlphaAnimation: alphaAnimation(); break; case Custom: if (mContentViewValueAnimation != null) { mContentViewValueAnimation.start(); } else { throw new RuntimeException("you must invoke setCustomViewAnimation before "); } break; } } private void alphaAnimation() { ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(getContentRelativeLayout(), "alpha", 0, 1); objectAnimator.setDuration(1200); objectAnimator.setInterpolator(new DecelerateInterpolator()); objectAnimator.start(); } private void duangAnimation() { Animation animation = AnimationUtils.loadAnimation(mContentRL.getContext(), R.anim.item_duang_show2); getContentRelativeLayout().startAnimation(animation); } private void duangLayoutAnimation() { mAnimationView.setLayoutAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { mFreeGrowUpParentRelativeLayout.setClipChildren(false); } @Override public void onAnimationEnd(Animation animation) { mFreeGrowUpParentRelativeLayout.setClipChildren(true); } @Override public void onAnimationRepeat(Animation animation) { } }); mAnimationView.scheduleLayoutAnimation(); } /** * 定义了中间视图的动画类型,为四种 */ public enum AnimationType { //这个用 LayoutAnimation 方式实现的 DuangLayoutAnimation, //这个是对这个 View 进行动画 DuangAnimation, //这个是对这个 View 进行动画,它是简单额alpha 值变化 AlphaAnimation, //自定义的动画,需要调用 Custom } public void setSweetSheetColor(int sweetSheetColor) { this.sweetSheetColor = sweetSheetColor; } }