public class RocketToast implements OnTouchListener {
private static final String TAG = "RocketToast";
private Context mContext;
private WindowManager mWM;
private WindowManager.LayoutParams mRocketParams = new WindowManager.LayoutParams();
private ImageView mRocketView;
private float downX;
private float downY;
private WindowManager.LayoutParams mTipParams = new WindowManager.LayoutParams();
private ImageView mTipView;
private boolean mCurrentIn = false;// 用来标记当前火箭是否在提示框中
public RocketToast(Context context) {
this.mContext = context;
mWM = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
// ###火箭相关的初始化####
// LayoutParams
final WindowManager.LayoutParams params = mRocketParams;
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
params.width = WindowManager.LayoutParams.WRAP_CONTENT;
params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
// | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
params.format = PixelFormat.TRANSLUCENT;
params.type = WindowManager.LayoutParams.TYPE_PRIORITY_PHONE;
params.gravity = Gravity.LEFT | Gravity.TOP;
params.setTitle("rocket");
// 火箭的view:
mRocketView = new ImageView(context);
// // mRocketView.setImageResource(R.drawable.desktop_rocket_launch_1);
// mRocketView.setBackgroundResource(R.drawable.rocket);
// AnimationDrawable rocketAnimation = (AnimationDrawable) mRocketView
// .getBackground();
// rocketAnimation.start();
AnimationDrawable rocketAnimation = new AnimationDrawable();
rocketAnimation.setOneShot(false);
rocketAnimation.addFrame(
context.getResources().getDrawable(
R.drawable.desktop_rocket_launch_1), 80);
rocketAnimation.addFrame(
context.getResources().getDrawable(
R.drawable.desktop_rocket_launch_2), 80);
mRocketView.setImageDrawable(rocketAnimation);
rocketAnimation.start();
// 设置火箭的touch监听
mRocketView.setOnTouchListener(this);
// ###提示相关的初始化#####
mTipView = new ImageView(context);
// 显示的动画 :
AnimationDrawable tipAnimation = new AnimationDrawable();
tipAnimation.setOneShot(false);
tipAnimation.addFrame(
context.getResources()
.getDrawable(R.drawable.desktop_bg_tips_1), 80);
tipAnimation.addFrame(
context.getResources()
.getDrawable(R.drawable.desktop_bg_tips_2), 80);
mTipView.setImageDrawable(tipAnimation);
tipAnimation.start();
mTipParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
mTipParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
mTipParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
mTipParams.format = PixelFormat.TRANSLUCENT;
mTipParams.type = WindowManager.LayoutParams.TYPE_TOAST;
mTipParams.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL;
mTipParams.setTitle("tip");
}
public void show() {
hide();
mWM.addView(mRocketView, mRocketParams);
}
public void hide() {
if (mRocketView.getParent() != null) {
// 已经被添加到windowmanager中,才可以移除
mWM.removeView(mRocketView);
}
}
private void showTip() {
hideTip();
mWM.addView(mTipView, mTipParams);
}
private void hideTip() {
if (mTipView.getParent() != null) {
mWM.removeView(mTipView);
}
}
private boolean isInTip() {
// 1. 获得火箭左上角的点相对窗体的坐标
// 输出函数
int[] rocketLoc = new int[2];
mRocketView.getLocationOnScreen(rocketLoc);
// Log.d(TAG, "rocket : " + rocketLoc[0] + " " + rocketLoc[1]);
// 2. 获得提示框左上角的点相对窗体的坐标
int[] tipLoc = new int[2];
mTipView.getLocationOnScreen(tipLoc);
// Log.d(TAG, "tip : " + tipLoc[0] + " " + tipLoc[1]);
int height = mRocketView.getHeight();
int width = mRocketView.getWidth();
int tipWidth = mTipView.getWidth();
// 3. 比对 火箭和提示框左上角的x,y的位置,判断是否在其中
// a)判断y方向
boolean isYIn = rocketLoc[1] + height / 2f > tipLoc[1];
// b)判断x方向左侧
boolean isXLeftIn = rocketLoc[0] + width / 2f > tipLoc[0];
// c)判断x方向右侧
boolean isXRightIn = (rocketLoc[0] + width / 2f) < (tipLoc[0] + tipWidth);
return isYIn && isXLeftIn && isXRightIn;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
downX = event.getRawX();
downY = event.getRawY();
// 按下时,显示提示框
showTip();
break;
case MotionEvent.ACTION_MOVE:
float moveX = event.getRawX();
float moveY = event.getRawY();
float diffX = moveX - downX;
float diffY = moveY - downY;
// 移动火箭的位置
mRocketParams.x += diffX;
mRocketParams.y += diffY;
mWM.updateViewLayout(mRocketView, mRocketParams);
// 当移动时,如果小火箭进入了提示框,提示框背景发生改变--》提示可以发射
if (!mCurrentIn && isInTip()) {
// Log.d(TAG, "提示可以发射");
mTipView.setImageResource(R.drawable.desktop_bg_tips_3);
mCurrentIn = true;
} else if (mCurrentIn && !isInTip()) {
// 如果小火箭离开了提示框,提示框背景发生改变--》提示放入
Log.d(TAG, "提示放入可以发射");
AnimationDrawable tipAnimation = new AnimationDrawable();
tipAnimation.setOneShot(false);
tipAnimation.addFrame(
mContext.getResources().getDrawable(
R.drawable.desktop_bg_tips_1), 80);
tipAnimation.addFrame(
mContext.getResources().getDrawable(
R.drawable.desktop_bg_tips_2), 80);
mTipView.setImageDrawable(tipAnimation);
tipAnimation.start();
mCurrentIn = false;
}
downX = moveX;
downY = moveY;
break;
case MotionEvent.ACTION_UP:
// 如果火箭是在提示框中,松开时,要发射
if (mCurrentIn) {
// 要发射
// 1. 小火箭到屏幕中央
// 火箭的宽度和高度
int rocketWidth = mRocketView.getWidth();
int rocketHeight = mRocketView.getHeight();
// 屏幕宽度,高度
DisplayMetrics metrics = mContext.getResources()
.getDisplayMetrics();
int screenWidth = metrics.widthPixels;
int screenHeight = metrics.heightPixels;
// X : 屏幕宽度一半-火箭宽度的一半
// Y : 屏幕的高度-火箭的高度
int x = (int) (screenWidth / 2f - rocketWidth / 2f + 0.5f);// 四舍五入
int y = screenHeight - rocketHeight;
mRocketParams.x = x;
mRocketParams.y = y;
mWM.updateViewLayout(mRocketView, mRocketParams);
// 2. 发射 TODO:
// 100,99,98,....0
// for (int i = y; i >= 0; i--) {
// mRocketParams.y = i;
// mWM.updateViewLayout(mRocketView, mRocketParams);
//
// try {
// Thread.sleep(100);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// }
ValueAnimator animator = ValueAnimator.ofInt(y, 0);
animator.setDuration(1000);
// 设置动画更新的监听
animator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animator) {
// 发生改变时的回调
int animatedValue = (Integer) animator
.getAnimatedValue();
// 还可以该透明控件透明度
// mRocketParams.alpha
mRocketParams.y = animatedValue;
mWM.updateViewLayout(mRocketView, mRocketParams);
}
});
animator.start();
// 冒烟
// 开启透明的activity
Intent intent = new Intent(mContext, SmokeActivity.class);
// activity启动activity是没有问题的
// 其他组件启动activity必须标记flags
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);
// 标记设置为不在里面
mCurrentIn = false;
}
// 松开时,隐藏提示框
hideTip();
break;
default:
break;
}
return true;
}
}
private static final String TAG = "RocketToast";
private Context mContext;
private WindowManager mWM;
private WindowManager.LayoutParams mRocketParams = new WindowManager.LayoutParams();
private ImageView mRocketView;
private float downX;
private float downY;
private WindowManager.LayoutParams mTipParams = new WindowManager.LayoutParams();
private ImageView mTipView;
private boolean mCurrentIn = false;// 用来标记当前火箭是否在提示框中
public RocketToast(Context context) {
this.mContext = context;
mWM = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
// ###火箭相关的初始化####
// LayoutParams
final WindowManager.LayoutParams params = mRocketParams;
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
params.width = WindowManager.LayoutParams.WRAP_CONTENT;
params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
// | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
params.format = PixelFormat.TRANSLUCENT;
params.type = WindowManager.LayoutParams.TYPE_PRIORITY_PHONE;
params.gravity = Gravity.LEFT | Gravity.TOP;
params.setTitle("rocket");
// 火箭的view:
mRocketView = new ImageView(context);
// // mRocketView.setImageResource(R.drawable.desktop_rocket_launch_1);
// mRocketView.setBackgroundResource(R.drawable.rocket);
// AnimationDrawable rocketAnimation = (AnimationDrawable) mRocketView
// .getBackground();
// rocketAnimation.start();
AnimationDrawable rocketAnimation = new AnimationDrawable();
rocketAnimation.setOneShot(false);
rocketAnimation.addFrame(
context.getResources().getDrawable(
R.drawable.desktop_rocket_launch_1), 80);
rocketAnimation.addFrame(
context.getResources().getDrawable(
R.drawable.desktop_rocket_launch_2), 80);
mRocketView.setImageDrawable(rocketAnimation);
rocketAnimation.start();
// 设置火箭的touch监听
mRocketView.setOnTouchListener(this);
// ###提示相关的初始化#####
mTipView = new ImageView(context);
// 显示的动画 :
AnimationDrawable tipAnimation = new AnimationDrawable();
tipAnimation.setOneShot(false);
tipAnimation.addFrame(
context.getResources()
.getDrawable(R.drawable.desktop_bg_tips_1), 80);
tipAnimation.addFrame(
context.getResources()
.getDrawable(R.drawable.desktop_bg_tips_2), 80);
mTipView.setImageDrawable(tipAnimation);
tipAnimation.start();
mTipParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
mTipParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
mTipParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
mTipParams.format = PixelFormat.TRANSLUCENT;
mTipParams.type = WindowManager.LayoutParams.TYPE_TOAST;
mTipParams.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL;
mTipParams.setTitle("tip");
}
public void show() {
hide();
mWM.addView(mRocketView, mRocketParams);
}
public void hide() {
if (mRocketView.getParent() != null) {
// 已经被添加到windowmanager中,才可以移除
mWM.removeView(mRocketView);
}
}
private void showTip() {
hideTip();
mWM.addView(mTipView, mTipParams);
}
private void hideTip() {
if (mTipView.getParent() != null) {
mWM.removeView(mTipView);
}
}
private boolean isInTip() {
// 1. 获得火箭左上角的点相对窗体的坐标
// 输出函数
int[] rocketLoc = new int[2];
mRocketView.getLocationOnScreen(rocketLoc);
// Log.d(TAG, "rocket : " + rocketLoc[0] + " " + rocketLoc[1]);
// 2. 获得提示框左上角的点相对窗体的坐标
int[] tipLoc = new int[2];
mTipView.getLocationOnScreen(tipLoc);
// Log.d(TAG, "tip : " + tipLoc[0] + " " + tipLoc[1]);
int height = mRocketView.getHeight();
int width = mRocketView.getWidth();
int tipWidth = mTipView.getWidth();
// 3. 比对 火箭和提示框左上角的x,y的位置,判断是否在其中
// a)判断y方向
boolean isYIn = rocketLoc[1] + height / 2f > tipLoc[1];
// b)判断x方向左侧
boolean isXLeftIn = rocketLoc[0] + width / 2f > tipLoc[0];
// c)判断x方向右侧
boolean isXRightIn = (rocketLoc[0] + width / 2f) < (tipLoc[0] + tipWidth);
return isYIn && isXLeftIn && isXRightIn;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
downX = event.getRawX();
downY = event.getRawY();
// 按下时,显示提示框
showTip();
break;
case MotionEvent.ACTION_MOVE:
float moveX = event.getRawX();
float moveY = event.getRawY();
float diffX = moveX - downX;
float diffY = moveY - downY;
// 移动火箭的位置
mRocketParams.x += diffX;
mRocketParams.y += diffY;
mWM.updateViewLayout(mRocketView, mRocketParams);
// 当移动时,如果小火箭进入了提示框,提示框背景发生改变--》提示可以发射
if (!mCurrentIn && isInTip()) {
// Log.d(TAG, "提示可以发射");
mTipView.setImageResource(R.drawable.desktop_bg_tips_3);
mCurrentIn = true;
} else if (mCurrentIn && !isInTip()) {
// 如果小火箭离开了提示框,提示框背景发生改变--》提示放入
Log.d(TAG, "提示放入可以发射");
AnimationDrawable tipAnimation = new AnimationDrawable();
tipAnimation.setOneShot(false);
tipAnimation.addFrame(
mContext.getResources().getDrawable(
R.drawable.desktop_bg_tips_1), 80);
tipAnimation.addFrame(
mContext.getResources().getDrawable(
R.drawable.desktop_bg_tips_2), 80);
mTipView.setImageDrawable(tipAnimation);
tipAnimation.start();
mCurrentIn = false;
}
downX = moveX;
downY = moveY;
break;
case MotionEvent.ACTION_UP:
// 如果火箭是在提示框中,松开时,要发射
if (mCurrentIn) {
// 要发射
// 1. 小火箭到屏幕中央
// 火箭的宽度和高度
int rocketWidth = mRocketView.getWidth();
int rocketHeight = mRocketView.getHeight();
// 屏幕宽度,高度
DisplayMetrics metrics = mContext.getResources()
.getDisplayMetrics();
int screenWidth = metrics.widthPixels;
int screenHeight = metrics.heightPixels;
// X : 屏幕宽度一半-火箭宽度的一半
// Y : 屏幕的高度-火箭的高度
int x = (int) (screenWidth / 2f - rocketWidth / 2f + 0.5f);// 四舍五入
int y = screenHeight - rocketHeight;
mRocketParams.x = x;
mRocketParams.y = y;
mWM.updateViewLayout(mRocketView, mRocketParams);
// 2. 发射 TODO:
// 100,99,98,....0
// for (int i = y; i >= 0; i--) {
// mRocketParams.y = i;
// mWM.updateViewLayout(mRocketView, mRocketParams);
//
// try {
// Thread.sleep(100);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// }
ValueAnimator animator = ValueAnimator.ofInt(y, 0);
animator.setDuration(1000);
// 设置动画更新的监听
animator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animator) {
// 发生改变时的回调
int animatedValue = (Integer) animator
.getAnimatedValue();
// 还可以该透明控件透明度
// mRocketParams.alpha
mRocketParams.y = animatedValue;
mWM.updateViewLayout(mRocketView, mRocketParams);
}
});
animator.start();
// 冒烟
// 开启透明的activity
Intent intent = new Intent(mContext, SmokeActivity.class);
// activity启动activity是没有问题的
// 其他组件启动activity必须标记flags
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);
// 标记设置为不在里面
mCurrentIn = false;
}
// 松开时,隐藏提示框
hideTip();
break;
default:
break;
}
return true;
}
}