Android桌面小火箭
发布时间
阅读量:
阅读量
介绍
- 该Activity仅包含两个Button组件:一个是启动Service按钮(StartService),另一个是停止Service按钮(StopService)。
- 通过在Service类中获取Window控件实例,并将其ImageView属性赋值给该Window对象。
- 对于Touch事件的响应机制进行详细设计与实现。
- 动态效果参数设置与优化方案的具体说明及其实现细节。
开启显示火箭的Service
public class RocketService extends Service {
@Nullable
WindowManager mWindowManager ;
View mRocketView;
private int mScreenWidth;
private int mScreenHeight;
private WindowManager.LayoutParams params;
/** * handler拿到高度后更新窗体和View
*/
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
params.y = (int) msg.obj;
mWindowManager.updateViewLayout(mRocketView,params );
}
};
private final WindowManager.LayoutParams mParams = new WindowManager.LayoutParams();
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
showRocket();
super.onCreate();
}
/** * 获取窗体信息,初始化LayoutParams
*/
private void showRocket() {
mWindowManager = (WindowManager)getSystemService(WINDOW_SERVICE);
mScreenWidth = mWindowManager.getDefaultDisplay().getWidth();
mScreenHeight = mWindowManager.getDefaultDisplay().getHeight();
params = mParams;
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
params.width = WindowManager.LayoutParams.WRAP_CONTENT;
params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON|WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
params.format = PixelFormat.TRANSPARENT;
params.type = WindowManager.LayoutParams.TYPE_PHONE;
params.setTitle("Toast");
params.gravity = Gravity.LEFT+Gravity.TOP;//默认小火箭在左上角
//定义火箭加载到窗体
mRocketView= View.inflate(this,R.layout.rocket_view,null);
ImageView rocketImage = (ImageView)mRocketView.findViewById(R.id.iv_rocket);
//动画是两张图片互相切换实现的
AnimationDrawable background= (AnimationDrawable) rocketImage.getBackground();
background.start();
//将View添加到窗体
mWindowManager.addView(mRocketView,params);
mRocketView.setOnTouchListener(new View.OnTouchListener() {
private int startX;
private int startY;
@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:
Log.i("touch event move","move");
int moveX = (int)event.getRawX();
int moveY =(int)event.getRawY();
int disX = moveX-startX;//得到距离
int disY = moveY-startY;
params.x = params.x+disX;
params.y = params.y+disY;
/* if(params.x<0){
params.x=0;
}
if(params.y<0){
params.y=0;
}*/
mWindowManager.updateViewLayout(mRocketView,params);
startX = (int)event.getRawX();
startY = (int)event.getRawY();
break;
case MotionEvent.ACTION_UP:
//手指在某一块区域释放时小火箭升空
if(params.x>100&¶ms.x<200&¶ms.y>350){
sendRocket();
Intent intent = new Intent(getApplicationContext(),BackGround.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//因为是Service启动Activity,需要将Activity放入栈中
startActivity(intent);
}
break;
}
return true;
}
});
}
/** * 开启一个线程对耗时操作进行处理
* 通过消息机制将Y轴的高度发给Handler
*/
private void sendRocket() {
new Thread(){
@Override
public void run() {
super.run();
for(int i=0;i<11;i++){
int height = 350-i*35;
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
Message message = Message.obtain();
message.obj = height;
handler.sendMessage(message);
}
}
}.start();
}
@Override
public void onDestroy() {
if(mWindowManager!=null&&mRocketView!=null){
mWindowManager.removeView(mRocketView);
}
super.onDestroy();
}
}
代码解释
小火箭ImageView的background设置
<?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="200"/>
</animation-list>
代码解释
其实就是一个动画List不断切换两张图片
烟雾所在Activity设置成透明
<activity android:name=".BackGround" android:theme="@android:style/Theme.Translucent.NoTitleBar"></activity>
代码解释
全部评论 (0)
还没有任何评论哟~
