您的位置:首页 > 其它

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

2018-01-29 14:37 218 查看
1、首先找四张图片并放在drawable-hdpi目录下

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

<RelativeLayout
4000
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: