package com.itheima52.rocket;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.graphics.drawable.AnimationDrawable;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.WindowManager;
import android.widget.ImageView; /*
* 主界面开启一个服务
startService(new Intent(this, RocketService.class));
finish();
stopService(new Intent(this, RocketService.class));
finish();
*/
public class RocketService extends Service { private WindowManager.LayoutParams params;
private int winWidth;
private int winHeight;
private WindowManager mWM;
private View view; private int startX;
private int startY; @Override
public IBinder onBind(Intent intent) {
return null;
} @Override
public void onCreate() {
super.onCreate(); mWM = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);//WindowManager可以在手机屏幕上显示,而不用依赖于某个activity布局文件。 // 获取屏幕宽高
winWidth = mWM.getDefaultDisplay().getWidth();
winHeight = mWM.getDefaultDisplay().getHeight(); params = new WindowManager.LayoutParams();
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
params.width = WindowManager.LayoutParams.WRAP_CONTENT;
params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
params.format = PixelFormat.TRANSLUCENT;
params.type = WindowManager.LayoutParams.TYPE_PHONE;// 电话窗口。它用于电话交互(特别是呼入)。它置于所有应用程序之上,状态栏之下。
params.gravity = Gravity.LEFT + Gravity.TOP;// 将重心位置设置为左上方,
// 也就是(0,0)从左上方开始,而不是默认的重心位置
params.setTitle("Toast"); view = View.inflate(this, R.layout.rocket, null);// 初始化火箭布局 // 初始化火箭帧动画
ImageView ivRocket = (ImageView) view.findViewById(R.id.iv_rocket);
/*iv_rocket.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >
<ImageView
android:id="@+id/iv_rocket"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/desktop_rocket_launch_1" /> 火箭图片
</LinearLayout>*/ //火箭冒火帧动画,火苗一直闪烁,
ivRocket.setBackgroundResource(R.drawable.anim_rocket);
/*
anim_rocket.xml
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" >
2张图片切换,200毫秒,
<item
android:drawable="@drawable/desktop_rocket_launch_1"
android:duration="200"/>
<item
android:drawable="@drawable/desktop_rocket_launch_2"
android:duration="200"/>
</animation-list>
*/
AnimationDrawable anim = (AnimationDrawable) ivRocket.getBackground();
anim.start(); mWM.addView(view, params); view.setOnTouchListener(new OnTouchListener() { @Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// 初始化起点坐标
startX = (int) event.getRawX();
startY = (int) event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
int endX = (int) event.getRawX();
int endY = (int) event.getRawY(); // 计算移动偏移量
int dx = endX - startX;
int dy = endY - startY; // 更新浮窗位置,WindowManager里面只能用params来移动
params.x += dx;
params.y += dy; // 防止坐标偏离屏幕
if (params.x < 0) {
params.x = 0;
}
if (params.y < 0) {
params.y = 0;
} // 防止坐标偏离屏幕
if (params.x > winWidth - view.getWidth()) {
params.x = winWidth - view.getWidth();
}
if (params.y > winHeight - view.getHeight()) {
params.y = winHeight - view.getHeight();
}
// System.out.println("x:" + params.x + ";y:" + params.y);
mWM.updateViewLayout(view, params); // 重新初始化起点坐标
startX = (int) event.getRawX();
startY = (int) event.getRawY();
break;
case MotionEvent.ACTION_UP:
if (params.x > 100 && params.x < 250 && params.y > winHeight - 120) {
System.out.println("发射火箭!!!");
sendRocket(); // 启动烟雾效果,启动一个Activity,盖住下面的Activity,使得下面的不能点击。
Intent intent = new Intent(RocketService.this,BackgroundActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);// 通过Service启动Activity,Service不用栈,因此要先启动一个栈来存放activity
startActivity(intent);
}
break; default:
break;
}
return true;
}
});
} private Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
// 更新火箭位置
int y = msg.arg1;
params.y = y;
mWM.updateViewLayout(view, params);
};
}; /**
* 发射火箭
*/
protected void sendRocket() {
// 设置火箭居中发射
params.x = winWidth / 2 - view.getWidth() / 2;
mWM.updateViewLayout(view, params); new Thread() {
@Override
public void run() {
int pos = 380;// 移动总距离
for (int i = 0; i <= 10; i++) {//移动10次,就移动到顶部了。
// 等待一段时间再更新位置,用于控制火箭速度
try {
Thread.sleep(50);//主线程睡眠会让主线程很卡,因此要用子线城。
} catch (InterruptedException e) {
e.printStackTrace();
}
int y = pos - 38 * i;
Message msg = Message.obtain();//不能在子线城更新界面
msg.arg1 = y;
mHandler.sendMessage(msg);
}
}
}.start();
} @Override
public void onDestroy() {
super.onDestroy();
if (mWM != null && view != null) {
mWM.removeView(view);
view = null;
}
}
}
package com.itheima52.rocket;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.animation.AlphaAnimation;
import android.widget.ImageView;
/**
* 烟雾背景
*/
public class BackgroundActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_bg);
/*
activity_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:id="@+id/iv_bottom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:src="@drawable/desktop_smoke_m" /> 底下的大烟图片
<ImageView
android:id="@+id/iv_top"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/iv_bottom"
android:layout_alignParentLeft="true"
android:src="@drawable/desktop_smoke_t" /> 中间的细长的烟
</RelativeLayout>*/
ImageView ivTop = (ImageView) findViewById(R.id.iv_top);
ImageView ivBottom = (ImageView) findViewById(R.id.iv_bottom); // 渐变动画
AlphaAnimation anim = new AlphaAnimation(0, 1);
anim.setDuration(1000);
anim.setFillAfter(true);// 动画结束后保持状态 // 运行动画
ivTop.startAnimation(anim);
ivBottom.startAnimation(anim); new Handler().postDelayed(new Runnable() {//Handler可以发message也可以发Runnable
@Override
public void run() {
finish();
}
}, 1000);// 延时1秒后结束activity,不能直接调用finish,因为动画要执行1秒钟。
}
}

activity的启动模式:
1.Standard:启动A,然后A启动B,B再启动A。
2.SingleTask:首先启动A,A启动B,B启动C,C启动A的时候把B,C干掉,也就是栈里面只能有一个A.
3.SingleTop:启动A,A启动B,B启动C,C再启动C时不会创建新的C而是用原来的C,因为顶上只能有一个C.
4.SingleInstance:只有一个A,不如许别的进来.

android138 360 小火箭的更多相关文章

  1. android桌面小火箭升空动画

    public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceS ...

  2. Android简易实战教程--第十话《模仿腾讯手机助手小火箭发射详解》

    之前对系统自带的土司的源码做了简要分析,见博客:点击打开链接 这一篇给一个小案例,自定义土司,模拟腾讯卫士的小火箭发射.如果想要迅速看懂代码,建议先去看一下上篇介绍点击打开链接 首先,定义一个服务,在 ...

  3. Activity和Window的View的移动的一些思考与体会,腾讯悬浮小火箭的实现策略

    Activity和Window的View的移动的一些思考与体会,腾讯悬浮小火箭的实现策略 事实上写这个也是因为自己实际在项目中用到了才会去研究已经写文章,对于View的移动,其实说实话,已经有很多文章 ...

  4. Android仿腾讯手机管家实现桌面悬浮窗小火箭发射的动画效果

    功能分析: 1.小火箭游离在activity之外,不依附于任何activity,不管activity是否开启,不影响小火箭的代码逻辑,所以小火箭的代码逻辑是要写在服务中: 2.小火箭挂载在手机窗体之上 ...

  5. 用jquery实现小火箭到页面顶部的效果

    恩,不知道之前在哪看过一个页面效果就是如果页面被滑动了就出现一个小火箭,点击这个小火箭就可以慢慢回到页面顶部,闲的没事,自己搞了一下 需要引入jquery 代码和布局都很简单 <!DOCTYPE ...

  6. 第50天:scrollTo小火箭返回顶部

    scrollTo(x,y)//可把内容滚动到指定的坐标scrollTo(xpos,ypos)//x,y值必需 1.固定导航栏 <!DOCTYPE html> <html lang=& ...

  7. Androd自己定义控件(三)飞翔的小火箭

    在前面的自己定义控件概述中已经跟大家分享了Android开发其中自己定义控件的种类. 今天跟大家分享一个非主流的组合控件. 我们在开发其中,难免须要在不同的场合中反复使用一些控件的组合.而Java的最 ...

  8. 自制window下core animation引擎 - demo第二弹 - 仿QQ电脑管家加速小火箭

    一年前想写一个像cocoa那样,可以方便层动画开发的引擎,写着写着又逆向它的QuartzCore.framework,也就是CoreAnimation的底层,已经大半年没有搞windows这个引擎.大 ...

  9. HTML——动画效果回到顶层(小火箭)

    一.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...

随机推荐

  1. MFC ListControl用法

    http://blog.csdn.net/lovton/article/details/6527208 1.建立一个对象m_LogList 步骤:在对话listcontrol控件右键点击添加变量-&g ...

  2. virtualbox虚拟机中mysql远程连接登陆报2003错误的解决方法

    最近在virtualbox中安装了Ubuntu 14,配置了一个mysql server,设置的桥接网络模式.在其他电脑连接的时候,总是报2003错误.开始以为是localhost没有置换为%,运行u ...

  3. CSS常用十大技巧

    技巧1  去掉网页超链接的下划线 去掉网页超链接的下划线,在<head>与</head>之间相应的位置输入以下代码. <style type="text/css ...

  4. 网页抓取:PHP实现网页爬虫方式小结

    来源:http://www.ido321.com/1158.html 抓取某一个网页中的内容,需要对DOM树进行解析,找到指定节点后,再抓取我们需要的内容,过程有点繁琐.LZ总结了几种常用的.易于实现 ...

  5. Core Java 学习笔记——1.术语/环境配置/Eclipse汉化字体快捷键/API文档

    今天起开始学习Java,学习用书为Core Java.之前有过C的经验.准备把自己学习这一本书时的各种想法,不易理解的,重要的都记录下来.希望以后回顾起来能温故知新吧.也希望自己能够坚持把自己学习这本 ...

  6. bzoj 3620 似乎在梦中见过的样子(KMP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3620 [题意] 给定一个字符串,统计有多少形如A+B+A的子串,要求A>=K,B ...

  7. vi--文本编辑常用快捷键之复制-粘贴-替换-删除

    这几天刚开始接触vi编辑器,慢慢开始熟悉vi,但是还是感觉诸多不便,比如说复制粘贴删除操作不能用鼠标总是感觉不自在,而且我一般习惯用方向键移动光标,更增加了操作的复杂度,今天在网上搜索了一下,vim编 ...

  8. window.parent 判断是否是被嵌入iframe里面

    项目中有个这样逻辑:B页面嵌套A页面 如图下: 但是B页面有可能独立出来.所以判断B页面是否被嵌入进去则使用 window.parent==window 如果是true B页面是独立的,false B ...

  9. SRM 508 DIV1 500pt(DP)

    题目简述 给定一个大小为 n的序列(n<=10)R,要求你计算序列A0, A1, ..., AN-1的数量,要求A序列满足A0 + A1 + ... + AN-1 = A0 | A1 | ... ...

  10. ES 基础

    You Know, for Search 安装es时 , jdk最低版本需要 jdk7 默认端口 : 9200 启动后浏览器访问 : localhost:9200 角色关系对照 elasticsear ...