- package net.xsmile.fv;
- import android.app.Application;
- import android.view.WindowManager;
- public class MyApplication extends Application {
- /**
- * 创建全局变量
- * 全局变量一般都比较倾向于创建一个单独的数据类文件,并使用static静态变量
- *
- * 这里使用了在Application中添加数据的方法实现全局变量
- * 注意在AndroidManifest.xml中的Application节点添加android:name=".MyApplication"属性
- *
- */
- private WindowManager.LayoutParams wmParams=new WindowManager.LayoutParams();
- public WindowManager.LayoutParams getMywmParams(){
- return wmParams;
- }
- }
- package net.xsmile.fv;
- import android.content.Context;
- import android.util.Log;
- import android.view.MotionEvent;
- import android.view.WindowManager;
- import android.widget.ImageView;
- public class MyFloatView extends ImageView {
- private float mTouchStartX;
- private float mTouchStartY;
- private float x;
- private float y;
- private WindowManager wm=(WindowManager)getContext().getApplicationContext().getSystemService("window");
- //此wmParams为获取的全局变量,用以保存悬浮窗口的属性
- private WindowManager.LayoutParams wmParams = ((MyApplication)getContext().getApplicationContext()).getMywmParams();
- public MyFloatView(Context context) {
- super(context);
- // TODO Auto-generated constructor stub
- }
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- //获取相对屏幕的坐标,即以屏幕左上角为原点
- x = event.getRawX();
- y = event.getRawY()-25; //25是系统状态栏的高度
- Log.i("currP", "currX"+x+"====currY"+y);
- switch (event.getAction()) {
- case MotionEvent.ACTION_DOWN:
- //获取相对View的坐标,即以此View左上角为原点
- mTouchStartX = event.getX();
- mTouchStartY = event.getY();
- Log.i("startP", "startX"+mTouchStartX+"====startY"+mTouchStartY);
- break;
- case MotionEvent.ACTION_MOVE:
- updateViewPosition();
- break;
- case MotionEvent.ACTION_UP:
- updateViewPosition();
- mTouchStartX=mTouchStartY=0;
- break;
- }
- return true;
- }
- private void updateViewPosition(){
- //更新浮动窗口位置参数
- wmParams.x=(int)( x-mTouchStartX);
- wmParams.y=(int) (y-mTouchStartY);
- wm.updateViewLayout(this, wmParams);
- }
- }
- package net.xsmile.fv;
- import android.app.Activity;
- import android.graphics.PixelFormat;
- import android.os.Bundle;
- import android.view.Gravity;
- import android.view.WindowManager;
- import android.view.WindowManager.LayoutParams;
- public class MyFloatViewActivity extends Activity {
- /** Called when the activity is first created. */
- private WindowManager wm=null;
- private WindowManager.LayoutParams wmParams=null;
- private MyFloatView myFV=null;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- //创建悬浮窗口
- createView();
- }
- private void createView(){
- myFV=new MyFloatView(getApplicationContext());
- myFV.setImageResource(R.drawable.icon);
- //获取WindowManager
- wm=(WindowManager)getApplicationContext().getSystemService("window");
- //设置LayoutParams(全局变量)相关参数
- wmParams = ((MyApplication)getApplication()).getMywmParams();
- /**
- *以下都是WindowManager.LayoutParams的相关属性
- * 具体用途可参考SDK文档
- */
- wmParams.type=LayoutParams.TYPE_PHONE; //设置window type
- wmParams.format=PixelFormat.RGBA_8888; //设置图片格式,效果为背景透明
- //设置Window flag
- wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL
- | LayoutParams.FLAG_NOT_FOCUSABLE;
- /*
- * 下面的flags属性的效果形同“锁定”。
- * 悬浮窗不可触摸,不接受任何事件,同时不影响后面的事件响应。
- wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL
- | LayoutParams.FLAG_NOT_FOCUSABLE
- | LayoutParams.FLAG_NOT_TOUCHABLE;
- */
- wmParams.gravity=Gravity.LEFT|Gravity.TOP; //调整悬浮窗口至左上角
- //以屏幕左上角为原点,设置x、y初始值
- wmParams.x=0;
- wmParams.y=0;
- //设置悬浮窗口长宽数据
- wmParams.width=40;
- wmParams.height=40;
- //显示myFloatView图像
- wm.addView(myFV, wmParams);
- }
- @Override
- public void onDestroy(){
- super.onDestroy();
- //在程序退出(Activity销毁)时销毁悬浮窗口
- wm.removeView(myFV);
- }
- }
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="net.xsmile.fv"
- android:versionCode="1"
- android:versionName="1.0">
- <application android:name=".MyApplication" android:icon="@drawable/icon" android:label="@string/app_name">
- <activity android:name=".MyFloatViewActivity"
- android:label="@string/app_name">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
- <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />