Android悬浮窗实现 使用WindowManager

最近项目要做一个悬浮窗的广告栏,闲来无事,就做了一个demo,不足之处,敬请吐槽!

其实功能非常简单,就是在系统上弹出一个跑马灯的textView,循环播放,就跟电视上一样,时不时在屏幕顶端弹一个广告,播放某某消息。这里我用到了WindowManager跟textView的跑马灯效果,废话不多说,直接上代码:

首先是WindowManager管理类:

package com.demo.windowmanagerdemo.util;

import android.content.Context;
import android.graphics.PixelFormat;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;

import com.demo.lijian.windowmanagerdemo.R;


public class WindowUtils {
    private static final String LOG_TAG = "WindowUtils";
    private static View mView = null;
    private static WindowManager mWindowManager = null;
    private static Context mContext = null;

    public static Boolean isShown = false;

    /**
     * 显示弹出框
     *
     * @param context
     */
    public static void showPopupWindow(final Context context) {
        if (isShown) {
            return;
        }
        isShown = true;

        // 获取应用的Context
        mContext = context.getApplicationContext();
        // 获取WindowManager
        mWindowManager = (WindowManager) mContext
                .getSystemService(Context.WINDOW_SERVICE);

        mView = setUpView(context);

        final WindowManager.LayoutParams params = new WindowManager.LayoutParams();

        // 类型
        params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;

        // WindowManager.LayoutParams.TYPE_SYSTEM_ALERT

        // 设置flag

        int flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
        // | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
        // 如果设置了WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,弹出的View收不到Back键的事件
        params.flags = flags;
        // 不设置这个弹出框的透明遮罩显示为黑色
        params.format = PixelFormat.TRANSLUCENT;
        // FLAG_NOT_TOUCH_MODAL不阻塞事件传递到后面的窗口
        // 设置 FLAG_NOT_FOCUSABLE 悬浮窗口较小时,后面的应用图标由不可长按变为可长按
        // 不设置这个flag的话,home页的划屏会有问题

        params.width = LayoutParams.MATCH_PARENT;
        params.height = LayoutParams.WRAP_CONTENT;

        params.gravity = Gravity.TOP;

        mWindowManager.addView(mView, params);

    }

    private static View setUpView(Context context) {
        View view;
        view = LayoutInflater.from(context).inflate(R.layout.window_view, null);
        return view;
    }

    /**
     * 隐藏弹出框
     */
    public static void hidePopupWindow() {
        if (isShown && null != mView) {
            mWindowManager.removeView(mView);
            isShown = false;
        }

    }

下面是显示的textView,因为TextView要处于被选中状态才能有效果,所以需要重写一下TextView:

package com.demo.windowmanagerdemo.util;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.TextView;


public class ForeverMarqueeTextView extends TextView {
    public ForeverMarqueeTextView(Context context) {
        super(context);
    }

    public ForeverMarqueeTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ForeverMarqueeTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public boolean isFocused() {

        return true;
    }
}

然后将重写后的textView的focusable设成true,ellipsize属性设置为”marquee”,行数属性即singleLine设置为true就可以了,下面是具体的xml代码:

<com.demo.lijian.windowmanagerdemo.util.ForeverMarqueeTextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="left|center"
    android:ellipsize="marquee"
    android:focusable="true"
    android:gravity="left|center"
    android:singleLine="true"
    android:marqueeRepeatLimit="marquee_forever"
    android:minHeight="40dp"
    android:scrollHorizontally="true"
    android:textColor="@color/colorAccent"
    android:textScaleX="1.0"
    android:textSize="13sp" />

下面的就非常简单了,直接在需要的地方调用WindowUtils的方法显示及隐藏就可以了,当然别忘了开权限:

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

当然手机也得给应用开通悬浮窗的权限才行,魅族直接在:手机管家-应用管理-自己的应用-悬浮窗打开,就可以了(我的是魅族的测试机),别的就等待大家自己去探索了,欧了,看看效果:Android悬浮窗实现 使用WindowManager_第1张图片

你可能感兴趣的:(Android开发经验)