天天看點

Android實作懸浮視窗

Android懸浮視窗步驟

1建立FxService

package service;

import android.app.Service;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.LinearLayout;

import wellray.fxdemo.R;


public class FxService extends Service{

    WindowManager mWindowManager;
    WindowManager.LayoutParams wmParams;
    LinearLayout mFloatLayout;
    Button mFloatView;
    boolean flag=true;

    private static final String TAG = "FloatWindowTest";
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(TAG, "onCreate"  );
        createFloatView();

    }

    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        if(flag){
            flag=false;
            mWindowManager.addView(mFloatLayout, wmParams);
        }
    }

    private void createFloatView() {
        //擷取LayoutParams對象
        wmParams = new WindowManager.LayoutParams();

        //擷取的是LocalWindowManager對象
        mWindowManager = (WindowManager)getApplication().getSystemService(getApplication().WINDOW_SERVICE); ;

        //擷取的是CompatModeWrapper對象
        //mWindowManager = (WindowManager) getApplication().getSystemService(Context.WINDOW_SERVICE);
        Log.i(TAG, "mWindowManager3--->" + mWindowManager);
        wmParams.type = WindowManager.LayoutParams.TYPE_PHONE;
        wmParams.format = PixelFormat.RGBA_8888;;
        wmParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
        wmParams.gravity = Gravity.LEFT | Gravity.TOP;
        wmParams.x = ;
        wmParams.y = ;
        wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
        wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT;

        LayoutInflater inflater  =LayoutInflater.from(getApplication());

        mFloatLayout = (LinearLayout) inflater.inflate(R.layout.fx_layout, null);
        mFloatView = (Button)mFloatLayout.findViewById(R.id.button_f);

        //綁定觸摸移動監聽
        mFloatView.setOnTouchListener(new View.OnTouchListener()
        {

            @Override
            public boolean onTouch(View v, MotionEvent event)
            {

                wmParams.x = (int)event.getRawX() - mFloatLayout.getWidth()/;
                //25為狀态欄高度
                wmParams.y = (int)event.getRawY() - mFloatLayout.getHeight()/ - ;
                mWindowManager.updateViewLayout(mFloatLayout, wmParams);
                return false;
            }
        });

        //綁定點選監聽
        mFloatView.setOnClickListener(new View.OnClickListener()
        {

            @Override
            public void onClick(View v)
            {
               /* Intent intent = new Intent( getActivity(), ResultActivity.class);
                startActivity(intent);*/
               /* if(mFloatLayout!=null){
                    mWindowManager.removeView(mFloatLayout);
                    flag=true;
                }*/
                stopSelf();
            }
        });
    }
    @Override
    public void onDestroy()
    {
        super.onDestroy();
        if(mFloatLayout != null)
        {
            //移除懸浮視窗
            mWindowManager.removeView(mFloatLayout);
            flag=true;
        }
    }
}
           

懸浮視窗布局檔案R.id.fx_layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:id="@+id/button_f"
        android:text="@string/app_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>
           

2 配置檔案中加入權限和配置FxService

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

3啟動FxService

Intent intent = new Intent(getActivity(), FxService.class);
        getActivity().startService(intent);
           

demo下載下傳:http://download.csdn.net/detail/qq_17525769/9695640