之前对系统自带的土司的源码做了简要分析,见博客:点击打开链接
这一篇给一个小案例,自定义土司,模拟腾讯卫士的小火箭发射。如果想要迅速看懂代码,建议先去看一下上篇介绍点击打开链接
首先,定义一个服务,在这个服务里面,完成土司的创建(小火箭布局创建),烟的效果属于动画播放,而且要依托一个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: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: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,Animation.relative_TO_SELF,0.5f,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_NOT_touchABLE */ | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; params.format = PixelFormat.TRANSLUCENT; params.type = WindowManager.LayoutParams.TYPE_SYstem_ALERT;// 土司天生不响应事件,改变类型。TYPE_SYstem_ALERT系统d窗 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); } /** * 通过点击按钮打开小火箭 * @param v */ public voID openRocket(VIEw v){ //RocketService service = new RocketService(); Intent service = new Intent(this,RocketService.class); startService(service);//启动小火箭服务 finish();//关闭当前界面。因为要显示火箭发射,不能在这个activity里面演示 } }
最后清单文件配置上两个活动和一个服务,还有一个d出窗体的权限
<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实战教程第十篇仿腾讯手机助手小火箭发射效果所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)