功能分析: 
1、小火箭游离在activity之外,不依附于任何activity,不管activity是否开启,不影响小火箭的代码逻辑,所以小火箭的代码逻辑是要写在服务中; 
2、小火箭挂载在手机窗体之上; 
3、小火箭喷射火焰,两种图片轮流展示的动画集; 
4、小火箭可以拖拽到任意位置; 
5、小火箭拖拽到指定区域才可以触发发射效果; 
6、小火箭喷射尾气动画效果;

功能实现:

定义小火箭的服务,实现自定义Toast的创建,自定义Toast加载相应的布局文件,然后把自定义Toast挂载到手机窗体之上;

public class RocketService extends Service {// 手机窗体布局的管理者private WindowManager mWindowManager;// 手机窗体的布局private WindowManager.LayoutParams mParams;// 展示小火箭的自定义布局private View mToastRocketView;// 展示小火箭的ImageViewprivate ImageView mRocketImage;// 手机窗体的宽度private int mWindowWidth;// 手机窗体的高度private int mWindowHeight;// 消息传递机制private Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {mParams.y = (Integer) msg.obj;mWindowManager.updateViewLayout(mToastRocketView, mParams);}};@Overridepublic void onCreate() {mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);// 获取手机屏幕的宽高值mWindowWidth = mWindowManager.getDefaultDisplay().getWidth();mWindowHeight = mWindowManager.getDefaultDisplay().getHeight();mParams = new WindowManager.LayoutParams();// 服务启动,打开自定义Toast的控件
        showRocketView();// 拖拽小火箭到任意位置
        dragRocket();super.onCreate();}/*** 拖拽小火箭到任意位置*/private void dragRocket() {mToastRocketView.setOnTouchListener(new View.OnTouchListener() {private int startX;private int startY;@Overridepublic 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 moveX = (int) event.getRawX();int moveY = (int) event.getRawY();// 两个方向上所移动的距离值int disX = moveX - startX;int disY = moveY - startY;mParams.x = mParams.x + disX;mParams.y = mParams.y + disY;if (mParams.x < 0) {mParams.x = 0;}if (mParams.y < 0) {mParams.y = 0;}if (mParams.x > mWindowManager.getDefaultDisplay().getWidth() - v.getWidth()) {mParams.x = mWindowManager.getDefaultDisplay().getWidth() - v.getWidth();}if (mParams.y > mWindowManager.getDefaultDisplay().getHeight() - 21 - v.getHeight()) {mParams.y = mWindowManager.getDefaultDisplay().getHeight() - 21 - v.getHeight();}// 更新小火箭的坐标位置X和Y值
                        mWindowManager.updateViewLayout(mToastRocketView, mParams);startX = (int) event.getRawX();startY = (int) event.getRawY();break;case MotionEvent.ACTION_UP:// 小火箭拖拽到手机屏幕下方的中间时,触发小火箭发射if (mParams.x > mWindowWidth / 2 - 150 && mParams.x < mWindowWidth / 2 - mToastRocketView.getWidth() / 2 + 50&& mParams.y > mWindowHeight - mToastRocketView.getHeight() - 25) {// 小火箭发射升空
                            launchRocket();Intent intent = new Intent(RocketService.this, SmokeBackActivity.class);// 服务中开启activity,需要设置任务栈
                            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent);}break;}return false;}});}/*** 小火箭发射升空*/private void launchRocket() {new Thread(new Runnable() {@Overridepublic void run() {int disY = mWindowHeight / 5;for (int i = 0; i < 6; i++) {int height = mWindowHeight - i * disY;try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}// 子线程不能改变主线程中的UI的变化,因此,由消息机制告知主线程进行改变,并携带相应的值Message msg = Message.obtain();msg.obj = height;mHandler.sendMessage(msg);}}}).start();}/*** 显示小火箭的自定义View*/private void showRocketView() {// 自定义ToastmParams.height = WindowManager.LayoutParams.WRAP_CONTENT;mParams.width = WindowManager.LayoutParams.WRAP_CONTENT;// 修改完左上角对齐mParams.gravity = Gravity.LEFT + Gravity.TOP;mParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;mParams.format = PixelFormat.TRANSLUCENT;mParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;// 加载ToastRocketView显示效果的布局文件mToastRocketView = View.inflate(this, R.layout.toast_rocket_view, null);// 窗体布局中加入自定义的展示小火箭的View
        mWindowManager.addView(mToastRocketView, mParams);mRocketImage = (ImageView) mToastRocketView.findViewById(R.id.rocket_image);// 获取动画,并开启动画AnimationDrawable animDraw = (AnimationDrawable) mRocketImage.getBackground();animDraw.start();}@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onDestroy() {if (mWindowManager != null && mToastRocketView != null) {mWindowManager.removeView(mToastRocketView);}super.onDestroy();}
}

mWindowManager是所有桌面悬浮窗的管理器,这里用于添加我们自定义的小火箭的Toast,然后获取小火箭火焰喷射的动画集,并开启动画效果。上述代码中为mToastRocketView添加了触摸事件,用于监听小火箭的拖拽事件,在监听拖拽事件的同时,若小火箭被拖动到指定区域,则触发小火箭的发射效果;

小火箭所在的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><!--背景为小火箭火焰喷射的动画集--><ImageViewandroid:id="@+id/rocket_image"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/rocket_anim_list"/></LinearLayout>

小火箭火焰喷射的动画集:

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"><!--小火箭火焰喷射的动画集--><item android:drawable="@drawable/rocket_launch_1" android:duration="200" /><item android:drawable="@drawable/rocket_launch_2" android:duration="200" /></animation-list>

小火箭发射时的尾气喷射动画效果,这里为了获得好的效果,需要在AndroidManifest.xml中配置活动的主题为透明、无标题和全屏;

public class SmokeBackActivity extends Activity {// 尾气喷射上部图片所在的ImageViewprivate ImageView mSmokeTopImageView;// 尾气喷射下部图片所在的ImageViewprivate ImageView mSmokeBottomImageView;private Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {// 尾气喷射动画结束后关闭活动
            finish();}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_smoke_back);// 初始化布局文件
        initView();}/*** 初始化布局文件*/private void initView() {mSmokeTopImageView = (ImageView) findViewById(R.id.smoke_top);mSmokeBottomImageView = (ImageView) findViewById(R.id.smoke_bottom);// 尾气喷射设置动画效果并开启AlphaAnimation alphaAnimation = new AlphaAnimation(0, 1);alphaAnimation.setDuration(500);ScaleAnimation scaleAnimation = new ScaleAnimation(1.0f, 1.0f, 0.0f, 1.0f, Animation.RELATIVE_TO_SELF,0.5f, Animation.RELATIVE_TO_SELF, 1f);scaleAnimation.setDuration(500);// 动画集中添加缩放和透明动画AnimationSet animationSet = new AnimationSet(true);animationSet.addAnimation(alphaAnimation);animationSet.addAnimation(scaleAnimation);mSmokeTopImageView.startAnimation(animationSet);mSmokeBottomImageView.startAnimation(alphaAnimation);// 1秒之后关闭当期活动mHandler.sendEmptyMessageDelayed(0, 1000);}
}

所对应的布局文件如下:

<?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"><ImageViewandroid:id="@+id/smoke_bottom"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@drawable/smoke_m"android:layout_alignParentBottom="true"/><ImageViewandroid:id="@+id/smoke_top"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_above="@id/smoke_bottom"android:background="@drawable/smoke_t" /></RelativeLayout>

AndroidManifest.xml中添加相应的权限:

<!--全局弹出对话框需要添加权限-->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

效果如下所示:

主活动中只是设置俩按钮,一个开启服务,一个关闭服务,这里不再赘述,欢迎大家去GitHub上下载代码;有什么问题也可以评论交流一下;

代码地址:GitHub地址

转: https://blog.csdn.net/u010347226/article/details/77677908

转载于:https://www.cnblogs.com/blosaa/p/9523564.html

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

  1. 【Android进阶】如何写一个很屌的动画(3)---高仿腾讯手机管家火箭动画

    系列中其他文章: [Android进阶]如何写一个很屌的动画(1)-先实现一个简易的自定义动画框架 [Android进阶]如何写一个很屌的动画(2)-动画的好帮手们 [Android进阶]如何写一个很 ...

  2. 仿腾讯手机管家快捷中心功能的实现方案

    背景 想必用过Android腾讯手机管家或者做过相关研发的童鞋都会发现腾讯做了一个类似于iOS系统下的Panel功能,如下图一. 即从屏幕的底部或者侧部用手势划出快捷中心控制面板,如下图二. 有别于以 ...

  3. 仿腾讯手机管家火箭发射

    好久没有写过博客了,前段时间一个项目中用到了浮点(漂浮在窗体上),于是突发灵感发现可以实现类似于腾讯手机管家火箭升空效果  实现步骤:1:新建一个类 名为RocketView(用来显示浮点,当手指拖动 ...

  4. 仿腾讯手机管家火箭发射案例

    概述 和腾讯管家类似,360手机卫士上也有类似的功能:拖动小球到屏幕底部,然后小球变成火箭,松手后火箭发射.虽然两者的UI效果各有千秋,但原理基本上是相同的.因为时间的关系,我只实现了部分的UI效果, ...

  5. android仿腾讯安全管家首页抽屉效果

    [color=red]转载请说明出处[/color] 最近在做公司新产品的设计,看到腾讯安全管家首页的抽屉效果设计的挺不错,一方面可以讲经常使用的功能模块直接显示给用户,另一方面将用户不常用的功能模块 ...

  6. android 360 悬浮窗口,Android实现类似360,QQ管家那样的悬浮窗

    一.前言: 我手机从来不装这些东西,不过,有次看到同事的android手机上,有个QQ管家在桌面上浮着,同事拖动管家时,管家就变成一只鸟,桌面下方还有个弹弓,桌面顶部有只乌鸦,把管家也就是鸟拖动到弹弓 ...

  7. Android实现类似360,QQ管家那样的悬浮窗

    一.前言:  我手机从来不装这些东西,不过,有次看到同事的android手机上,有个QQ管家在桌面上浮着,同事拖动管家时,管家就变成一只鸟,桌面下方还有个弹弓,桌面顶部有只乌鸦,把管家也就是鸟拖动到弹 ...

  8. Android桌面悬浮窗仿QQ手机管家加速效果

    主要还是用到了WindowManager对桌面悬浮进行管理. 需要一个火箭的悬浮窗 一个发射台悬浮窗  ,判断火箭是否放到了发射台,如果放上了,则使用AsyTask 慢慢将火箭的图片往上移.结束后., ...

  9. Android桌面悬浮窗效果实现,仿360手机卫士悬浮窗效果

    转载自:http://blog.csdn.net/guolin_blog/article/details/8689140 大家好,今天给大家带来一个仿360手机卫士悬浮窗效果的教程,在开始之前请允许我 ...

最新文章

  1. mysql错误:this authentication plugin is not supported
  2. Wodpress模板
  3. 无线网络,把我整惨了。求助各位了。
  4. 微型计算机三级项目,微机原理三级项目.doc
  5. sensenet的编译调试
  6. 【datawhale-gitmodel】以波士顿房价数据进行数据分析和数据可视化
  7. Hexo博文置顶(自定义排序)
  8. element时间组件在苹果回显无效果
  9. 南京信息工程大学计算机与科学专业,南京信息工程大学王牌专业有哪些及专业排名...
  10. 文件或目录损坏且无法读取 删除不了 错误0x80070091:目录不是空的 解决方案
  11. 计算机组装图纸手画,原神玩家为造家园能有多拼?工科大佬直接画出图纸,成品效果惊人...
  12. 【python】pythonPTA编程练习2
  13. 领英工具领英精灵批量加人有哪些方法
  14. pqmagic 8.0中文版—硬盘分区魔术师
  15. C#使用iTextSharp合并pdf,添加页码
  16. WEB阶段7:综合练习-联系人管理系统-增删改查查询分页
  17. 华为堪称最大黑洞!清华大学/北京大学的学生,毕业后都去哪了?
  18. 开发版速达-提供在线帐套配置功能
  19. java 中的finally你知多少_「JAVA」详述Java异常体系,处理异常时配上finally效果更佳...
  20. C语言内部函数与外部函数

热门文章

  1. Android Q Beta 正式发布 | 精于形,安于内
  2. 小蚁服务器维修期限,小蚁监控云服务器
  3. 0202了,你会用手机操控电脑吗?
  4. django项目 网易云音乐
  5. PMP-PMBOK-培训(7)Initiating a Project and Preparing the Project Plan
  6. python读取svg_使用Python / PIL读取SVG文件
  7. 普博也有120万房补!40万安家费+50万科启,硕士也可入教职!浙江该高校大量招人...
  8. SpringBoot---Eureka
  9. simulink/stateflow 纯电动+4档变速箱动力性经济性仿真模型 包含vcu控制及换档控制模型,可实现最高车速 最大爬坡度 加速时间
  10. No ulink device found肿么办