Advertisement

Android桌面小火箭

阅读量:

介绍

  1. 该Activity仅包含两个Button组件:一个是启动Service按钮(StartService),另一个是停止Service按钮(StopService)。
  2. 通过在Service类中获取Window控件实例,并将其ImageView属性赋值给该Window对象。
  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)

还没有任何评论哟~