OtherBackFloatWindow.java 5.91 KB
package com.sw.laryngoscope.floatwindow;

import android.app.Activity;
import android.content.Context;
import android.graphics.PixelFormat;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.widget.ImageView;
import android.widget.LinearLayout;

import com.sw.laryngoscope.R;
import com.sw.laryngoscope.utils.ShellUtils;
import com.sw.laryngoscope.utils.Support;

//进入分享界面后悬浮窗口类
public class OtherBackFloatWindow {

    private WindowManager mWindowManager;
    private LayoutParams wmParams;
    private LinearLayout mFloatWindow = null;

    private Activity mContext;
    private LinearLayout lay_back = null;
    private boolean mFloatAdded = false;
    private int scn_w = -1;
    private int scn_h = -1;
    private int float_win_w = -1;
    private int float_win_h = -1;

    private long last_touch_time = 0;
    private static final String TAG = "OtherBackFloatWindow";

    private FloatWindowManager mFloatWindowManager;

    private boolean isBackToSetting = true;

    public OtherBackFloatWindow(Context context) {
        mWindowManager = (WindowManager) ((Activity) context).getApplication().getSystemService(Context.WINDOW_SERVICE);
        mContext = (Activity) context;
    }

    public void startFloat(FloatWindowManager floatWindowManager) {
        mFloatWindowManager = floatWindowManager;
        DisplayMetrics dm = new DisplayMetrics();
        mWindowManager.getDefaultDisplay().getMetrics(dm);
        mFloatAdded = false;
        isBackToSetting = true;
        scn_w = dm.widthPixels;
        scn_h = dm.heightPixels;
        // float_win_w = scn_w / 3;
        // float_win_h = 1080 * float_win_w / 1920;
        float_win_w = 200;
        float_win_h = 50;


        mFloatWindow = CreateFloatWindow(R.layout.float_window_other_back, Gravity.LEFT | Gravity.TOP,
                50, 0, float_win_w, float_win_h);
        lay_back = (LinearLayout) mFloatWindow.findViewById(R.id.lay_back);


        AddView(mFloatWindow);

        setFloatViewListener();

        lay_back.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                stopFloat();
                //ShellUtils.execCommand("kill " + Support.findPid(mContext, "com.android.settings"));
                Support.backToSettingActivity(mContext,
                        "com.sw.laryngoscope",
                        "com.sw.laryngoscope.activity.HomeActivity", isBackToSetting);
            }
        });
    }

    private LinearLayout CreateFloatWindow(int id, int gravity, int x, int y, int w, int h) {
        LinearLayout mWindow = (LinearLayout) GetView(id);
        LayoutParams Params = new LayoutParams();
        Params.type = LayoutParams.TYPE_PHONE;
        Params.format = PixelFormat.RGBA_8888;
        Params.flags = LayoutParams.FLAG_NOT_FOCUSABLE | LayoutParams.FLAG_HARDWARE_ACCELERATED;
        Params.gravity = gravity;
        Params.x = x;
        Params.y = y;
        Params.width = w;
        Params.height = h;
        Params.windowAnimations = android.R.style.Animation_Translucent;
        setParams(Params);
        mWindow.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        return mWindow;
    }

    public View GetView(int id) {
        View vv;
        LayoutInflater inflater = LayoutInflater.from(mContext.getApplication());
        vv = (LinearLayout) inflater.inflate(id, null);
        vv.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
                View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)
        );
        return vv;
    }

    private void setParams(LayoutParams param) {
        wmParams = param;
    }

    private synchronized void AddView(View view) {
        if (view == mFloatWindow) {
            if (mFloatAdded) {
                return;
            }
            mWindowManager.addView(view, wmParams);
            mFloatAdded = true;
        }
    }

    private synchronized void RemoveView(View view) {
        if (view == mFloatWindow) {
            if (!mFloatAdded) {
                return;
            }
            mWindowManager.removeView(view);
            mFloatAdded = false;
        }
    }

    public void stopFloat() {
        if (mFloatWindow != null && mFloatAdded) {
            RemoveView(mFloatWindow);
            mFloatWindow = null;
        }
    }

    public void hideFloatWindow() {
        if (mFloatWindow != null) {
            mFloatWindow.setVisibility(View.GONE);
        }
    }

    public void showFloatWindow() {
        mFloatWindow.setVisibility(View.VISIBLE);
    }

    private void setFloatViewListener() {
        lay_back.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (!mFloatAdded) {
                    return false;
                }

                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    last_touch_time = event.getEventTime();
                } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
                    wmParams.x = (int) event.getRawX() - mFloatWindow.getMeasuredWidth() / 2;
                    wmParams.y = (int) event.getRawY() - mFloatWindow.getMeasuredHeight() / 2 - 25;
                    mWindowManager.updateViewLayout(mFloatWindow, wmParams);
                } else if (event.getAction() == MotionEvent.ACTION_UP) {
                    return (event.getEventTime() - last_touch_time > 220);
                }
                return false;
            }
        });

    }

}