Android桌面悬浮窗

经常,我们看到在桌面上可移动的悬浮窗,这种场景还是很多的, 像流量统计,桌面歌词等,安全软件的清理小部件

这种小部件主要是通过 WindowManager ; WindowManager.LayoutParams 这两个类来实现

调用 WindowManager 的addView(view, params)方法来添加一个悬浮窗.updateViewLayout(view,params)来更新悬浮窗参数.removeView(view)用于移除悬浮窗

WindowManager.LayoutParams 主要是用来提供参数的

其中的参数有type: 悬浮窗的类型,通常设置为2002, 即在所有程序之上.状态栏之下

flags :用于确定悬浮窗的行为

gravity : 用于确定悬浮窗的对其方式

x: 悬浮窗的横向坐标

y: 悬浮窗的纵向坐标

width: 悬浮窗的宽度

height : 悬浮窗的高度

创建悬浮窗需要添加权限:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

 

悬浮窗布局

 

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/small_window_layout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/bg" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="拖拽移动.."
        android:textSize="20sp" />

</LinearLayout>

 

新建一个类继承Application,Application就是应用的入口点,写在这里,就是程序一运行,就会出来

同时,需要在清单文件的Application结点上配置名称

package com.example.windowmanagerdemo;

import android.annotation.SuppressLint;
import android.app.Application;
import android.content.Context;
import android.graphics.PixelFormat;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;

public class MAppliction extends Application {
    WindowManager mWM;

    WindowManager.LayoutParams mParams;

    @Override
    public void onCreate() {
        super.onCreate();
        mWM = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
        mParams = new WindowManager.LayoutParams();
        final View mwm = LayoutInflater.from(this).inflate(R.layout.mwm, null);

        mwm.setOnTouchListener(new OnTouchListener() {
            float lastX, lastY;

            @SuppressLint("NewApi")
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    lastX = event.getX();
                    lastY = event.getY();
                    break;
                case MotionEvent.ACTION_MOVE:
                    float moveX = event.getX();
                    float moveY = event.getY();
                    mParams.x += (int) (moveX - lastX);
                    mParams.y += (int) (moveY - lastY);
                    mWM.updateViewLayout(mwm, mParams);
                    break;
                default:
                    break;
                }
                return true;
            }
        });

        mParams.type = LayoutParams.TYPE_PHONE;
        mParams.format = PixelFormat.RGBA_8888;
        mParams.width = 50;
        mParams.height = 30;
        mWM.addView(mwm, mParams);
    }
}

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。