我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android实战教程第十篇仿腾讯手机助手小火箭发射效果

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android实战教程第十篇仿腾讯手机助手小火箭发射效果

之前对系统自带的土司的源码做了简要分析,见博客:点击打开链接

这一篇给一个小案例,自定义土司,模拟腾讯卫士的小火箭发射。如果想要迅速看懂代码,建议先去看一下上篇介绍点击打开链接

首先,定义一个服务,在这个服务里面,完成土司的创建(小火箭布局创建),烟的效果属于动画播放,而且要依托一个activity。(这个activity要定义为透明状态)

定义烟的activity的布局文件


<?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/smoke_m" 
  android:layout_width="fill_parent" 
  android:layout_height="wrap_content" 
  android:layout_alignParentBottom="true" 
  android:class="lazy" data-src="@drawable/desktop_smoke_m" /> 
 <ImageView 
  android:layout_above="@id/smoke_m" 
  android:id="@+id/smoke_t" 
  android:layout_width="wrap_content" 
  android:layout_height="wrap_content" 
  android:class="lazy" data-src="@drawable/desktop_smoke_t"/> 
</RelativeLayout> 

在对应的Smokeactivity里面加入“烟”的动画


package com.itydl.rockets; 
import android.app.Activity; 
import android.os.Bundle; 
import android.os.SystemClock; 
import android.view.animation.AlphaAnimation; 
import android.view.animation.Animation; 
import android.view.animation.AnimationSet; 
import android.view.animation.ScaleAnimation; 
import android.widget.ImageView; 
public class SmokeActivity extends Activity { 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
  // TODO Auto-generated method stub 
  super.onCreate(savedInstanceState); 
  setContentView(R.layout.smoke); 
  //底部烟图片 
  ImageView iv_m = (ImageView) findViewById(R.id.smoke_m); 
  //烟柱子 
  ImageView iv_t = (ImageView) findViewById(R.id.smoke_t); 
  //渐变动画 
  AlphaAnimation aa = new AlphaAnimation(0.0f,1.0f); 
  aa.setDuration(1000); 
  //比例动画                 设置锚点。x轴一半,y轴图片最低端y值最大处 
  ScaleAnimation sa = new ScaleAnimation(1.0f, 1.0f, 0.0f, 1.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 1f); 
  sa.setDuration(1000); 
  //动画集添加动画 
    iv_m.startAnimation(aa);//给下面这张图片实现渐变动画 
    AnimationSet as = new AnimationSet(true); 
  as.addAnimation(aa); 
  as.addAnimation(sa); 
  //给上边图片(烟柱子)设置渐变动画和比例动画 
  iv_t.startAnimation(as); 
  //1秒后关闭Activity,正好动画播完,关闭这个activity。这里也是那样,主线程动画的同时,子线程也在执行耗时操作 
  new Thread(){ 
   public void run() { 
    //1秒后关闭当前Activity 
    SystemClock.sleep(1000); 
    runOnUiThread(new Runnable() {//activity类中的方法 
     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      finish();//关闭自己也属于更新界面操作,因此要在主线程执行。 
     } 
    }); 
   }; 
  }.start(); 
 } 
} 

定义Service,用于自定义土司布局,加入火箭图片的动画、参数初始化、触摸事件等


package com.itydl.rockets; 
import android.app.Service; 
import android.content.Intent; 
import android.graphics.PixelFormat; 
import android.graphics.drawable.AnimationDrawable; 
import android.os.Handler; 
import android.os.IBinder; 
import android.os.SystemClock; 
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; 
public class RocketService extends Service { 
 private WindowManager.LayoutParams params; 
 private View view; 
 private WindowManager wm; 
 @Override 
 public IBinder onBind(Intent intent) { 
  // TODO Auto-generated method stub 
  return null; 
 } 
 @Override 
 public void onCreate() { 
  wm = (WindowManager) getSystemService(WINDOW_SERVICE); 
  //初始化params(土司参数) 
  initToastParams(); 
  showRocket();//打开小火箭   
  super.onCreate(); 
 } 
  
 private void initToastParams() { 
  // TODO Auto-generated method stub 
  // XXX This should be changed to use a Dialog, with a Theme.Toast 
  // defined that sets up the layout params appropriately. 
  params = new WindowManager.LayoutParams(); 
  params.height = WindowManager.LayoutParams.WRAP_CONTENT; 
  params.width = WindowManager.LayoutParams.WRAP_CONTENT; 
  //对齐方式左上角 
  params.gravity = Gravity.LEFT | Gravity.TOP; 
  params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 
   
  | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; 
  params.format = PixelFormat.TRANSLUCENT; 
  params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;// 土司天生不响应事件,改变类型。TYPE_SYSTEM_ALERT系统弹窗 
  params.setTitle("Toast"); 
 } 
 private void closeRocket(){ 
  if (view != null) { 
   wm.removeView(view);//移除小火箭 
  } 
 } 
 private Handler handler = new Handler(){ 
  public void handleMessage(android.os.Message msg) { 
   wm.updateViewLayout(view, params);//更新小火箭在屏幕中的位置,刷新位置。属于更新ui。在主线程执行(更新土司的位置) 
  }; 
 }; 
 private void showRocket(){ 
  //小火箭的布局 
  view = View.inflate(getApplicationContext(), R.layout.rocket, null); 
  ImageView iv_rocket = (ImageView) view.findViewById(R.id.iv_rocket); 
  //获取小火箭的动画背景 
  AnimationDrawable ad = (AnimationDrawable) iv_rocket.getBackground(); 
  //开始小火箭动画(小火箭动画,两张图片切换) 
  ad.start(); 
  //给小火箭加触摸事件(给自定义土司加触摸事件),按住拖动小火箭到屏幕正下方,松开发射火箭 
  view.setOnTouchListener(new OnTouchListener() { 
   private float startX; 
   private float startY; 
   @Override 
   public boolean onTouch(View v, MotionEvent event) { 
    System.out.println(event.getX() + ":" + event.getRawX()); 
    // 拖动土司 
    switch (event.getAction()) { 
    case MotionEvent.ACTION_DOWN:// 按下 
     startX = event.getRawX(); 
     startY = event.getRawY(); 
     break; 
    case MotionEvent.ACTION_MOVE:// 按下移动,拖动 
     //新的 x y坐标 
     float moveX = event.getRawX();//移动后的x坐标 
     float moveY = event.getRawY();//移动后的y坐标 
     //dx x方向的位置变化值 dy y方向的位置变化值 
     float dx = moveX - startX; 
     float dy = moveY - startY; 
     //改变土司的坐标 
     params.x += dx; 
     params.y += dy; 
     //重新获取新的x y坐标 
     startX = moveX; 
     startY = moveY; 
     //更新土司的位置 
     wm.updateViewLayout(view, params); 
     break; 
    case MotionEvent.ACTION_UP:// 松开,接下来要发射小火箭 
     //判断位置 发射 
     //x轴方向 离两边框超过100,y轴方向大于200 就可以发射火箭 
     if (params.x > 100 && params.x + view.getWidth()< wm.getDefaultDisplay().getWidth() - 100 && 
       params.y > 200){ 
      //发射火箭 
      //1,火箭往上跑 
      //火箭在中心线上发射(自定义土司左上角为基准) 
      params.x = (wm.getDefaultDisplay().getWidth() - view.getWidth()) / 2; 
      new Thread(){//发射火箭改变y轴属于耗时操作,更新火箭位置是更新UI操作 
       public void run() { 
        for (int j = 0; j < view.getHeight(); ) { 
         SystemClock.sleep(50);//休眠50毫秒 
         params.y -= j; 
         j += 5; 
         handler.obtainMessage().sendToTarget();//参数y的值改变一次,发消息通知更新一次ui,更新一次土司的位置 
        } 
        //,发射完毕,关闭小火箭 
        stopSelf();//关闭服务,关闭当前自己服务。这个方法用在关闭自己服务里。触发onDestroy方法,从而触发这个方法里面的关闭小火箭 
       }; 
      }.start(); 
      //2,烟的效果。因为更新火箭往上跑是在子线程执行的,因此在小火箭往上跑的同时,烟的效果也同时开始播放(子线程不影响主线程执行。两个线程可以同时进行) 
      //烟的效果,是一个动画,在activity完成,这个activity需要定义为透明 
      Intent intent = new Intent(RocketService.this,SmokeActivity.class); 
      //在服务中打开activity,需要设置任务栈: 
      intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//任务栈 
      startActivity(intent);//启动烟的Activity 
     } 
     //冒烟的Activity 
    default: 
     break; 
    } 
    return false;//默认返回值。 
   } 
  }); 
  wm.addView(view, params);//把小火箭加到窗体管理器 
 } 
 @Override 
 public void onDestroy() { 
  // TODO Auto-generated method stub 
  closeRocket();//关闭小火箭 
  super.onDestroy(); 
 } 
} 

对于主动人任务只是加入个按钮,打开这个服务就行了。


package com.itydl.rockets; 
import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
public class MainActivity extends Activity { 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  setContentView(R.layout.activity_main); 
 } 
  
 public void openRocket(View v){ 
  //RocketService service = new RocketService(); 
  Intent service = new Intent(this,RocketService.class); 
  startService(service);//启动小火箭服务 
  finish();//关闭当前界面。因为要显示火箭发射,不能在这个activity里面演示 
 } 
} 

最后清单文件配置上两个活动和一个服务,还有一个弹出窗体的权限


<activity 
   android:name="com.itheima62.rockets.MainActivity" 
   android:label="@string/app_name" > 
   <intent-filter> 
    <action android:name="android.intent.action.MAIN" /> 
    <category android:name="android.intent.category.LAUNCHER" /> 
   </intent-filter> 
  </activity> 
  <!-- 配置该活动的主题,为透明、无标题、全屏 --> 
  <activity android:name="com.itheima62.rockets.SmokeActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"></activity> 
  <service android:name="com.itheima62.rockets.RocketService"></service> 

代码如下:<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> 

好了主要代码和功能都介绍完了,看一下运行效果截图:

完整代码请查看文末的原文链接。

您可能感兴趣的文章:Android实现桌面悬浮小火箭效果Android实现QQ手机管家悬浮小火箭效果


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android实战教程第十篇仿腾讯手机助手小火箭发射效果

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android实战教程第十篇仿腾讯手机助手小火箭发射效果

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

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录