TOast显示小火箭

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;
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值