类似手机管家中火箭升空的效果

1、首先找四张图片并放在drawable-hdpi目录下

2、编写主activity,放两个按钮即可,一个用来开启火箭,一个用来关闭火箭。因为火箭可以看作是没有界面的activity,所以在服务里面写。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

  <Button 
      android:id="@+id/btn_start"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="开启火箭"
      android:onClick="startRocket"
      />

  <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_toRightOf="@+id/btn_start"
      android:onClick="stopRocket"
      android:text="关闭火箭" />

</RelativeLayout>
主activity

package com.xiaojia.rocke;
import com.xiaojia.rockeman.R;
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 startRocket(View view){
		startService(new Intent(this,RocketService.class));
	}
	public void stopRocket(View view){
		stopService(new Intent(this,RocketService.class));
	}
}

服务

package com.xiaojia.rocke;
import com.xiaojia.rockeman.R;
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.util.Log;
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;
import android.widget.Toast;
public class RocketService extends Service {
	private WindowManager mWManager;
	private View rocket;
	private WindowManager.LayoutParams params;
	private int screenHeight;
	private int screenWidth;
	private Handler mHandler=new Handler(){
		public void handleMessage(android.os.Message msg) {
			params.y=(Integer) msg.obj;
			//告知窗体更新吐司
			mWManager.updateViewLayout(rocket, params);
		};
	};
	@Override
	public void onCreate() {
		mWManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
		//获取屏幕分辨率
		screenHeight = mWManager.getDefaultDisplay().getHeight();
		screenWidth = mWManager.getDefaultDisplay().getWidth();
		showRocket();
		super.onCreate();
	}
	//自定义吐司  看源码
	private void showRocket() {
		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_TOAST;
       params.setTitle("Toast");
       //吐司位置
       params.gravity=Gravity.LEFT+Gravity.TOP;
       //将布局文件转换为view对象
       rocket = View.inflate(getApplicationContext(), R.layout.rocket,null);
       //开启动画
       ImageView iv_rocket=(ImageView) rocket.findViewById(R.id.iv_rocket);
       AnimationDrawable background = (AnimationDrawable) iv_rocket.getBackground();
       background.start();
       mWManager.addView(rocket, params);
       //设置触摸事件
       rocket.setOnTouchListener(new OnTouchListener() {
		private int startX;
		private int startY;
		private int endX;
		private int endY;
		@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://移动
				//记录移动后的坐标
				endX = (int) event.getRawX();
				endY = (int) event.getRawY();
				//计算移动的坐标
				int moveX=endX-startX;
				int moveY=endY-startY;
				//更新控件的坐标
				params.x=params.x+moveX;
				params.y=params.y+moveY;
				//容错检查
				if(params.x<0){
					params.x=0;
				}
				if(params.x>screenWidth){
					params.x=screenWidth;
				}
				if(params.y<0){
					params.y=0;
				}
				if(params.y>screenHeight-22){
					params.y=screenHeight-22;
				}
				//告知窗体更新吐司
				mWManager.updateViewLayout(rocket, params);
				//更新开始的位置
				startX=(int) event.getRawX();
				startY=(int) event.getRawY();
				break;
			case MotionEvent.ACTION_UP://抬起手
				//如果火箭在指定位置,才能发送火箭
				if(params.x>screenWidth/3.0 && params.x<screenWidth/3.0*2.0  && params.y>screenHeight/5.0*4.0){
					sendRocket();
					//火箭烟雾效果
					Intent intent=new Intent(getApplicationContext(),BackgroundActivity.class);
					//要在服务中开启activity,必须在意图中开启新栈给activity
					intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
					startActivity(intent);
				}
				break;
			}
			return true;  //返回true
		}
	});
	}
	protected void sendRocket() {
		//发送火箭的过程,是y轴逐渐变小
		new Thread(new Runnable() {
			@Override
			public void run() {
				while(params.y>0){
					int height=params.y-30;
					Log.i("RocketService",height+"");
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					Message msg = mHandler.obtainMessage();
					msg.obj=height;
					mHandler.sendMessage(msg);
				}
			}
		}).start();
	}
	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}
	@Override
	public void onDestroy() {
		//先判断是否不为空
		if(mWManager!=null && rocket!=null){
			mWManager.removeView(rocket);
		}
		super.onDestroy();
	}
}
3、背景可以是两张不同的火箭图片拼凑而成,所以可以弄个背景图片,而背景可以是个动画图片

<?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" >
    
	<ImageView 
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:id="@+id/iv_rocket"
	    android:background="@drawable/rocket_bg"
	    />
    
</LinearLayout>

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <!-- 第一张图片 -->
    <item android:drawable="@drawable/desktop_rocket_launch_1"
        android:duration="200"
        />

    <!-- 第二张图片 -->
    <item android:drawable="@drawable/desktop_rocket_launch_2"
        android:duration="300"
        />
</animation-list>
4、烟雾效果

package com.xiaojia.rocke;
import com.xiaojia.rockeman.R;
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.yanwu_bg);
		//找到控件
		ImageView iv_top=(ImageView) this.findViewById(R.id.iv_top);
		ImageView iv_bottom=(ImageView) findViewById(R.id.iv_bottom);
		//淡入淡出动画
		AlphaAnimation animation=new AlphaAnimation(0, 1);
		animation.setDuration(600);//持续600毫秒
		iv_top.startAnimation(animation);
		iv_bottom.startAnimation(animation);
		//1秒关闭该activity
		mHanlder.sendEmptyMessageDelayed(0, 1000);
	}
	private Handler mHanlder=new Handler(){
		public void handleMessage(android.os.Message msg) {
			finish();
		};
	};
}

<?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:layout_alignParentBottom="true"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/desktop_smoke_m"
    android:id="@+id/iv_bottom"
    />
<ImageView 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/desktop_smoke_t"
    android:id="@+id/iv_top"
    android:layout_above="@id/iv_bottom"
    />

</RelativeLayout>
5、效果展示


代码下载地址:
https://gitee.com/it_com/HuoJianRen.git

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值