package lee.devis.joker.MyView; import android.annotation.TargetApi; import android.content.Context; import android.graphics.Color; import android.os.Build; import android.os.Vibrator; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.animation.AlphaAnimation; import android.view.animation.Animation; import android.view.animation.Animation.AnimationListener; import android.view.animation.AnimationSet; import android.view.animation.RotateAnimation; import android.view.animation.ScaleAnimation; import android.view.animation.TranslateAnimation; import android.widget.RelativeLayout; public class PathView extends RelativeLayout { private boolean isExpand = false; private View[] items; private View startMenu; private Context mContext; private View bgView; public int DURATION = 300; public int MARGIN_RIGHT = 16; public int MARGIN_TOP = 16; public int MARGIN_BOTTOM = 16; public PathView(Context context) { super(context); initContentView(); } public PathView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mContext = context; initContentView(); } public PathView(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; initContentView(); } public void initContentView() { bgView = new View(getContext()); bgView.setBackgroundColor(Color.argb(0, 0, 0, 0)); LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); addView(bgView, params); bgView.setVisibility(View.GONE); bgView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { cols(DURATION); bgView.setVisibility(View.GONE); return true; } return false; } }); } public void setStartMenu(View view) { LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); params.rightMargin = MARGIN_RIGHT; params.bottomMargin = MARGIN_BOTTOM; params.topMargin = MARGIN_TOP; addView(view, params); this.startMenu = view; startMenu.setId(66666); startMenu.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Vibrator vibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE); vibrator.vibrate(55); if (isExpand) { cols(DURATION); } else { expand(DURATION); } } }); } public void expand(int duration) { bgView.setVisibility(View.VISIBLE); for (int i = 0; i < items.length; i++) { final View view = items[i]; view.setEnabled(false); float dy = startMenu.getY() - view.getY(); TranslateAnimation translateAnim = new TranslateAnimation(-startMenu.getWidth() / 2, 0, dy, 0); translateAnim.setDuration(duration); ScaleAnimation scaleAnim = new ScaleAnimation(0f, 1f, 0f, 1f, Animation.RELATIVE_TO_SELF, 1f, Animation.RELATIVE_TO_SELF, 0.5f); scaleAnim.setDuration(duration); AnimationSet set = new AnimationSet(true); set.addAnimation(scaleAnim); set.addAnimation(translateAnim); set.setInterpolator(getContext(), android.R.anim.linear_interpolator); set.setAnimationListener(new AnimationListener() { @Override public void onAnimationStart(Animation animation) { view.setVisibility(View.VISIBLE); } @Override public void onAnimationRepeat(Animation animation) { // TODO Auto-generated method stub } @Override public void onAnimationEnd(Animation animation) { isExpand = true; view.setEnabled(true); } }); roate(0, -135, DURATION); view.startAnimation(set); } } public void cols(int duration) { for (int i = 0; i < items.length; i++) { final View view = items[i]; view.setEnabled(false); float dy = startMenu.getY() - view.getY(); TranslateAnimation translateAnim = new TranslateAnimation(0, -startMenu.getWidth() / 2, 0, dy); translateAnim.setDuration(duration); ScaleAnimation scaleAnim = new ScaleAnimation(1f, 0f, 1f, 0f, Animation.RELATIVE_TO_SELF, 1f, Animation.RELATIVE_TO_SELF, 0.5f); scaleAnim.setDuration(duration); AnimationSet set = new AnimationSet(true); set.addAnimation(scaleAnim); set.addAnimation(translateAnim); set.setInterpolator(getContext(), android.R.anim.linear_interpolator); set.setAnimationListener(new AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationRepeat(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { view.setEnabled(true); view.setVisibility(View.GONE); isExpand = false; } }); bgView.setVisibility(View.GONE); roate(-135, 0, DURATION); view.startAnimation(set); } } private void roate(int fromDegree, int toDegree, int duration) { RotateAnimation anim = new RotateAnimation(fromDegree, toDegree, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); anim.setFillAfter(true); anim.setDuration(duration); anim.setAnimationListener(new AnimationListener() { @Override public void onAnimationStart(Animation animation) { startMenu.setEnabled(false); } @Override public void onAnimationRepeat(Animation animation) { // TODO Auto-generated method stub } @Override public void onAnimationEnd(Animation animation) { startMenu.setEnabled(true); } }); startMenu.startAnimation(anim); } public void setItems(View[] items) { for (int i = 0; i < items.length; i++) { View view = items[i]; view.setId(i + 1); LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); if (i == 0) { params.addRule(RelativeLayout.ABOVE, startMenu.getId()); } else { params.addRule(RelativeLayout.ABOVE, items[i - 1].getId()); } // params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); params.addRule(RelativeLayout.ALIGN_RIGHT, startMenu.getId()); // params.rightMargin = MARGIN_RIGHT; addView(view, params); view.setVisibility(View.INVISIBLE); } this.items = items; } public void setOnItemClickListener(final OnItemClickListener listener) { for (int i = 0; i < items.length; i++) { final View view = items[i]; final int position = i; view.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (v.getVisibility() == View.VISIBLE) { cols(DURATION); fadeOut(view, DURATION); listener.onItemClick(view, position); } } }); } } private void fadeOut(final View view, int duration) { AlphaAnimation alphaAnim = new AlphaAnimation(1, 0.0f); alphaAnim.setDuration(duration); ScaleAnimation scaleAnim = new ScaleAnimation(1f, 1.5f, 1f, 1.5f, Animation.RELATIVE_TO_SELF, 1f, Animation.RELATIVE_TO_SELF, 0.5f); scaleAnim.setDuration(duration); AnimationSet set = new AnimationSet(true); set.addAnimation(scaleAnim); set.addAnimation(alphaAnim); set.setInterpolator(getContext(), android.R.anim.accelerate_interpolator); set.setAnimationListener(new AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationRepeat(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { view.setVisibility(View.GONE); } }); view.startAnimation(set); } public interface OnItemClickListener { void onItemClick(View view, int position); } }