package yifeiyuan.practice.practicedemos.customview; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.annotation.TargetApi; import android.content.Context; import android.graphics.drawable.Drawable; import android.os.Build; import android.util.AttributeSet; import android.util.TypedValue; import android.view.View; import android.widget.ImageView; import android.widget.RelativeLayout; import java.util.ArrayList; import java.util.List; import yifeiyuan.practice.practicedemos.R; /** * Created by 程序亦非猿 on 15/10/27. */ public class ShareMenu extends RelativeLayout{ public static final int WEIBO = 0; public static final int QZONE = 1; public static final int QQ = 2; public static final int WEIXIN = 3; public static final int WEIXIN_CIRCLE = 4; public static final int MESSAGE = 5; public static final int FACEBOOK = 6; public static final int TWITTER = 7; // @IntDef(value = {WEIBO,QZONE,QQ,WEIXIN,WEIXIN_CIRCLE,MESSAGE,FACEBOOK,TWITTER}) // public @interface ShareType{} private Context mContext; private ActionListener mActionListener; private List<View> mViews; private int mY; public ShareMenu(Context context) { super(context); } public ShareMenu(Context context, AttributeSet attrs) { super(context, attrs); init(); } public ShareMenu(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) public ShareMenu(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); init(); } private void init() { mY = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50, mContext.getResources().getDisplayMetrics()); mActionListener = new ActionListener(); mViews = new ArrayList<>(); addActionViews(); } /*添加菜单view*/ private void addActionViews() { setGravity(CENTER_HORIZONTAL); //固定大小 Drawable wechat = getResources().getDrawable(R.mipmap.bg_share_weixin_n); int height = wechat.getIntrinsicHeight(); int width = wechat.getIntrinsicWidth(); LayoutParams lp = new LayoutParams(width, height); lp.addRule(ALIGN_PARENT_BOTTOM, TRUE);//居于底部 ImageView imageView = new ImageView(mContext); imageView.setLayoutParams(lp); imageView.setTag(MESSAGE); imageView.setImageResource(R.drawable.bg_share_duanxin); imageView.setOnClickListener(mActionListener); addView(imageView); mViews.add(imageView); imageView = new ImageView(mContext); imageView.setLayoutParams(lp); imageView.setTag(WEIBO); imageView.setImageResource(R.drawable.bg_share_weibo); imageView.setOnClickListener(mActionListener); addView(imageView); mViews.add(imageView); imageView = new ImageView(mContext); imageView.setLayoutParams(lp); imageView.setTag(QZONE); imageView.setImageResource(R.drawable.bg_share_qzone); imageView.setOnClickListener(mActionListener); addView(imageView); mViews.add(imageView); imageView = new ImageView(mContext); imageView.setLayoutParams(lp); imageView.setTag(QQ); imageView.setImageResource(R.drawable.bg_share_qq); imageView.setOnClickListener(mActionListener); addView(imageView); mViews.add(imageView); imageView = new ImageView(mContext); imageView.setLayoutParams(lp); imageView.setTag(WEIXIN_CIRCLE); imageView.setImageResource(R.drawable.bg_share_pyq); imageView.setOnClickListener(mActionListener); addView(imageView); mViews.add(imageView); imageView = new ImageView(mContext); imageView.setLayoutParams(lp); imageView.setTag(WEIXIN); imageView.setImageResource(R.drawable.bg_share_weixin); imageView.setOnClickListener(mActionListener); addView(imageView); mViews.add(imageView); // imageView = new ImageView(mContext); // imageView.setLayoutParams(lp); // imageView.setTag(FACEBOOK); // imageView.setImageResource(R.drawable.selector_login_fb); // imageView.setOnClickListener(mActionListener); // addView(imageView); // mViews.add(imageView); // // imageView = new ImageView(mContext); // imageView.setLayoutParams(lp); // imageView.setTag(TWITTER); // imageView.setImageResource(R.drawable.selector_login_twitter); // imageView.setOnClickListener(mActionListener); // addView(imageView); // mViews.add(imageView); } /** * 打开或者关闭菜单 */ public void toggleMenu(){ if (isEnabled()){ if (isMenuOpened){ closeMenu(); isMenuOpened = false; }else{ openMenu(); isMenuOpened = true; } if (null != mOpenEventListener) { mOpenEventListener.onMenuOpenCloseEvent(isMenuOpened); } } } /** *菜单是否打开 */ private boolean isMenuOpened = false; private ObjectAnimator[] mObjectAnimators; private void openMenu(){ AnimatorSet set = new AnimatorSet(); set.setDuration(200); int size = mViews.size(); mObjectAnimators = new ObjectAnimator[size]; for (int i = 0; i < size; i++) { View view = mViews.get(i); mObjectAnimators[i]= makeOpenAnimator(view, i); } set.playTogether(mObjectAnimators); set.addListener(mAnimatorListener); set.start(); } private void closeMenu(){ AnimatorSet set = new AnimatorSet(); set.setDuration(200); int size = mViews.size(); mObjectAnimators = new ObjectAnimator[size]; for (int i = 0; i < size; i++) { View view = mViews.get(i); mObjectAnimators[i]= makeCloseAnimator(view); } set.playTogether(mObjectAnimators); set.addListener(mAnimatorListener); set.start(); } private ObjectAnimator makeCloseAnimator(View view){ ObjectAnimator oa = ObjectAnimator.ofFloat(view,View.TRANSLATION_Y,0); oa.setDuration(200); return oa; } private ObjectAnimator makeOpenAnimator(View view, int position){ ObjectAnimator oa = ObjectAnimator.ofFloat(view,View.TRANSLATION_Y,-mY*(position+1)); oa.setDuration(200); return oa; } private AnimatorListenerAdapter mAnimatorListener = new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { setEnabled(false); } @Override public void onAnimationEnd(Animator animation) { setEnabled(true); } }; private class ActionListener implements OnClickListener{ @Override public void onClick(View v) { if (null != mOnActionClickListener) { mOnActionClickListener.onActionClickListener((Integer) v.getTag()); } toggleMenu(); } } private OnActionClickListener mOnActionClickListener; public void setOnActionClickListener(OnActionClickListener OnActionClickListener) { mOnActionClickListener = OnActionClickListener; } public interface OnActionClickListener{ void onActionClickListener(int actionType); } private OnMenuOpenOrClosedListener mOpenEventListener; public void setOnMenuOpenOrClosedListener(OnMenuOpenOrClosedListener OnMenuOpenOrClosedListener) { mOpenEventListener = OnMenuOpenOrClosedListener; } public interface OnMenuOpenOrClosedListener{ void onMenuOpenCloseEvent(boolean opened); } /** * @return true if menu was opened */ public boolean isMenuOpened(){ return isMenuOpened; } }