package com.hotbitmapgg.moequest.notice; import com.hotbitmapgg.moequest.R; import java.text.SimpleDateFormat; import java.util.Date; import android.animation.Animator; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.annotation.SuppressLint; import android.app.PendingIntent; import android.content.Context; import android.os.Handler; import android.os.Message; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; import android.view.ViewConfiguration; import android.view.WindowManager; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; @SuppressLint("ViewConstructor") public class FloatView extends LinearLayout { private float rawX = 0; private float rawY = 0; private float touchX = 0; private float startY = 0; public LinearLayout rootView; public int originalLeft; public int viewWidth; private float validWidth; private VelocityTracker velocityTracker; private int maxVelocity; private Distance distance; private ScrollOrientationEnum scrollOrientationEnum = ScrollOrientationEnum.NONE; public static WindowManager.LayoutParams winParams = new WindowManager.LayoutParams(); public FloatView(final Context context, int i) { super(context); LinearLayout view = (LinearLayout) LayoutInflater.from(getContext()) .inflate(R.layout.notification_bg, null); maxVelocity = ViewConfiguration.get(context).getScaledMaximumFlingVelocity(); rootView = (LinearLayout) view.findViewById(R.id.rootView); addView(view); viewWidth = context.getResources().getDisplayMetrics().widthPixels; validWidth = viewWidth / 2.0f; originalLeft = 0; distance = new Distance(context); } public void setCustomView(View view) { rootView.addView(view); } @Override protected void onFinishInflate() { super.onFinishInflate(); } private HeadsUp headsUp; private long cutDown; private Handler mHandle = null; private CutDownTime cutDownTime; private class CutDownTime extends Thread { @Override public void run() { super.run(); while (cutDown > 0) { try { Thread.sleep(1000); cutDown--; } catch (InterruptedException e) { e.printStackTrace(); } } if (cutDown == 0) { mHandle.sendEmptyMessage(0); } } } ; public HeadsUp getHeadsUp() { return headsUp; } private int pointerId; public boolean onTouchEvent(MotionEvent event) { rawX = event.getRawX(); rawY = event.getRawY(); acquireVelocityTracker(event); cutDown = headsUp.getDuration(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: touchX = event.getX(); startY = event.getRawY(); pointerId = event.getPointerId(0); break; case MotionEvent.ACTION_MOVE: switch (scrollOrientationEnum) { case NONE: if (Math.abs((rawX - touchX)) > 20) { scrollOrientationEnum = ScrollOrientationEnum.HORIZONTAL; } else if (startY - rawY > 20) { scrollOrientationEnum = ScrollOrientationEnum.VERTICAL; } break; case HORIZONTAL: updatePosition((int) (rawX - touchX)); break; case VERTICAL: if (startY - rawY > 20) { cancel(); } break; } break; case MotionEvent.ACTION_UP: velocityTracker.computeCurrentVelocity(1000, maxVelocity); int dis = (int) velocityTracker.getYVelocity(pointerId); if (scrollOrientationEnum == ScrollOrientationEnum.NONE) { if (headsUp.getNotification().contentIntent != null) { try { headsUp.getNotification().contentIntent.send(); cancel(); } catch (PendingIntent.CanceledException e) { e.printStackTrace(); } } break; } int toX; if (preLeft > 0) { toX = (int) (preLeft + Math.abs(dis)); } else { toX = (int) (preLeft - Math.abs(dis)); } if (toX <= -validWidth) { float preAlpha = 1 - Math.abs(preLeft) / validWidth; preAlpha = preAlpha >= 0 ? preAlpha : 0; translationX(preLeft, -(validWidth + 10), preAlpha, 0); } else if (toX <= validWidth) { float preAlpha = 1 - Math.abs(preLeft) / validWidth; preAlpha = preAlpha >= 0 ? preAlpha : 0; translationX(preLeft, 0, preAlpha, 1); } else { float preAlpha = 1 - Math.abs(preLeft) / validWidth; preAlpha = preAlpha >= 0 ? preAlpha : 0; translationX(preLeft, validWidth + 10, preAlpha, 0); } preLeft = 0; scrollOrientationEnum = ScrollOrientationEnum.NONE; break; } return super.onTouchEvent(event); } /** * @param event 向VelocityTracker添加MotionEvent * @see android.view.VelocityTracker#obtain() * @see android.view.VelocityTracker#addMovement(MotionEvent) */ private void acquireVelocityTracker(MotionEvent event) { if (null == velocityTracker) { velocityTracker = VelocityTracker.obtain(); } velocityTracker.addMovement(event); } private int preLeft; public void updatePosition(int left) { float preAlpha = 1 - Math.abs(preLeft) / validWidth; float leftAlpha = 1 - Math.abs(left) / validWidth; preAlpha = preAlpha >= 0 ? preAlpha : 0; leftAlpha = leftAlpha >= 0 ? leftAlpha : 0; translationX(preLeft, left, preAlpha, leftAlpha); preLeft = left; } public void translationX(float fromX, float toX, float formAlpha, final float toAlpha) { ObjectAnimator a1 = ObjectAnimator.ofFloat(rootView, "alpha", formAlpha, toAlpha); ObjectAnimator a2 = ObjectAnimator.ofFloat(rootView, "translationX", fromX, toX); AnimatorSet animatorSet = new AnimatorSet(); animatorSet.playTogether(a1, a2); animatorSet.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { if (toAlpha == 0) { HeadsUpManager.getInstant(getContext()).dismiss(); cutDown = -1; if (velocityTracker != null) { velocityTracker.clear(); try { velocityTracker.recycle(); } catch (IllegalStateException e) { } } } } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } }); animatorSet.start(); } public void setNotification(final HeadsUp headsUp) { this.headsUp = headsUp; mHandle = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (headsUp.isActivateStatusBar()) { HeadsUpManager.getInstant(getContext()).silencerNotify(headsUp); } HeadsUpManager.getInstant(getContext()).animDismiss(headsUp); } }; cutDownTime = new CutDownTime(); if (!headsUp.isSticky()) { cutDownTime.start(); } cutDown = headsUp.getDuration(); if (headsUp.getCustomView() == null) { View defaultView = LayoutInflater.from(getContext()) .inflate(R.layout.notification, rootView, false); rootView.addView(defaultView); ImageView imageView = (ImageView) defaultView.findViewById(R.id.iconIM); TextView titleTV = (TextView) defaultView.findViewById(R.id.titleTV); TextView timeTV = (TextView) defaultView.findViewById(R.id.timeTV); TextView messageTV = (TextView) defaultView.findViewById(R.id.messageTV); imageView.setImageResource(headsUp.getIcon()); titleTV.setText(headsUp.getTitleStr()); messageTV.setText(headsUp.getMsgStr()); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm"); timeTV.setText(simpleDateFormat.format(new Date())); if (headsUp.isExpand() && headsUp.getActions().size() > 0) { defaultView.findViewById(R.id.menuL).setVisibility(VISIBLE); defaultView.findViewById(R.id.line).setVisibility(VISIBLE); defaultView.findViewById(R.id.menu1).setVisibility(VISIBLE); ImageView imageView1 = (ImageView) defaultView.findViewById(R.id.menuIM1); ImageView imageView2 = (ImageView) defaultView.findViewById(R.id.menuIM2); ImageView imageView3 = (ImageView) defaultView.findViewById(R.id.menuIM3); TextView text1 = (TextView) defaultView.findViewById(R.id.menuText1); TextView text2 = (TextView) defaultView.findViewById(R.id.menuText2); TextView text3 = (TextView) defaultView.findViewById(R.id.menuText3); imageView1.setImageResource(headsUp.getActions().get(0).icon); text1.setText(headsUp.getActions().get(0).title); defaultView.findViewById(R.id.menu1).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { try { headsUp.getActions().get(0).actionIntent.send(); cancel(); } catch (PendingIntent.CanceledException e) { e.printStackTrace(); } } }); if (headsUp.getActions().size() > 1) { defaultView.findViewById(R.id.menu2).setVisibility(VISIBLE); imageView2.setImageResource(headsUp.getActions().get(1).icon); text2.setText(headsUp.getActions().get(1).title); defaultView.findViewById(R.id.menu2).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { try { headsUp.getActions().get(1).actionIntent.send(); cancel(); } catch (PendingIntent.CanceledException e) { e.printStackTrace(); } } }); } if (headsUp.getActions().size() > 2) { defaultView.findViewById(R.id.menu3).setVisibility(VISIBLE); imageView3.setImageResource(headsUp.getActions().get(2).icon); text3.setText(headsUp.getActions().get(2).title); defaultView.findViewById(R.id.menu3).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { try { headsUp.getActions().get(2).actionIntent.send(); cancel(); } catch (PendingIntent.CanceledException e) { e.printStackTrace(); } } }); } } } else { setCustomView(headsUp.getCustomView()); } } protected void cancel() { HeadsUpManager.getInstant(getContext()).animDismiss(); cutDown = -1; cutDownTime.interrupt(); if (velocityTracker != null) { try { velocityTracker.clear(); velocityTracker.recycle(); } catch (IllegalStateException e) { } } } enum ScrollOrientationEnum { VERTICAL, HORIZONTAL, NONE } }