Android桌面小火箭

来源:互联网 发布:it技术博客 编辑:程序博客网 时间:2024/06/05 10:06

介绍

1.主Activity只有两个Button,一个开启服务一个关闭服务。
2.在服务中获取窗体对象,并将View图片加载到窗体上。
3.Touch事件的响应
4.动画设置


开启显示火箭的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&&params.x<200&&params.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>

Github源码下载

0 0