Android中可自由移动悬浮窗口的实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

大家对悬浮窗概念不会陌生,相信每台电脑桌面的右上角都会有这么一个东西,它总是出现在所有页面的顶端(Top Show)。但在Android 平台中如何实现这样的效果呢?先来看一看效果图。

看见在Google搜索框上面的那个Icon图片了嘛。下面我就来详细介绍一下在Android平台下悬浮窗口的实现,并让它能够随手指的触摸而移动。

一、实现原理及移动思路

调用WindowManager,并设置youtParams的相关属性,通过WindowManager的addView方法创建View,这样产生出

来的View根据youtParams属性不同,效果也就不同了。比如创建系统顶级窗口,实现悬浮窗口效果!然后通过覆写悬浮View

中onTouchEvent方法来改变youtParams中x和y的值来实现自由移动悬浮窗口。

二、示例代码

先来看一看悬浮View的代码,这里用一个ImageView作为演示

[java]view plaincopyprint?

1.public class MyFloatView extends ImageView {

2.private float mTouchStartX;

3.private float mTouchStartY;

4.private float x;

5.private float y;

6.

7.private WindowManager wm=(WindowManager)getContext().getApplicationContext().getSystemService("window");

8.//此wmParams变量为获取的全局变量,用以保存悬浮窗口的属性

9.private youtParams wmParams = ((MyApplication)getContext().getApplicationContext()).getMywmParams();

10.

11.public MyFloatView(Context context) {

12.super(context);

13.// TODO Auto-generated constructor stub

14.}

16.@Override

17.public boolean onTouchEvent(MotionEvent event) {

18.//获取相对屏幕的坐标,即以屏幕左上角为原点

19.x = event.getRawX();

20.y = event.getRawY()-25; //25是系统状态栏的高度

21.Log.i("currP", "currX"+x+"====currY"+y);

22.switch (event.getAction()) {

23.case MotionEvent.ACTION_DOWN: //捕获手指触摸按下动作

24.//获取相对View的坐标,即以此View左上角为原点

25.mTouchStartX = event.getX();

26.mTouchStartY = event.getY();

27.Log.i("startP", "startX"+mTouchStartX+"====startY"+mTouchStartY);

28.break;

29.

30.case MotionEvent.ACTION_MOVE: //捕获手指触摸移动动作

31.updateViewPosition();

32.break;

33.

34.case MotionEvent.ACTION_UP: //捕获手指触摸离开动作

35.updateViewPosition();

36.mTouchStartX=mTouchStartY=0;

37.break;

38.}

39.return true;

40.}

41.

42.private void updateViewPosition(){

43.//更新浮动窗口位置参数

44.wmParams.x=(int)( x-mTouchStartX);

45.wmParams.y=(int) (y-mTouchStartY);

46.wm.updateViewLayout(this, wmParams); //刷新显示

47.}

48.

49.}

上面的wmParams变量(即youtParams)的存储采用了extends Application的方式来创建全局变量,示例代码如下:[java]view plaincopyprint?

1.public class MyApplication extends Application {

2.

3./**

4.* 创建全局变量

5.* 全局变量一般都比较倾向于创建一个单独的数据类文件,并使用static静态变量

7.* 这里使用了在Application中添加数据的方法实现全局变量

8.* 注意在AndroidManifest.xml中的Application节点添加android:name=".MyApplication"属性

9.*

10.*/

11.private youtParams wmParams=new youtParams();

12.

13.public youtParams getMywmParams(){

14.return wmParams;

15.}

16.}

再来看一看Activity中的代码:

[java]view plaincopyprint?

1.public class MyFloatViewActivity extends Activity {

2./** Called when the activity is first created. */

3.

4.private WindowManager wm=null;

5.private youtParams wmParams=null;

6.

7.private MyFloatView myFV=null;

8.

9.@Override

10.public void onCreate(Bundle savedInstanceState) {

11.super.onCreate(savedInstanceState);

12.setContentView(yout.main);

13.//创建悬浮窗口

14.createView();

15.

16.}

17.

18.private void createView(){

19.myFV=new MyFloatView(getApplicationContext());

20.myFV.setImageResource(R.drawable.icon); //这里简单的用自带的Icom来做演示

21.//获取WindowManager

22.wm=(WindowManager)getApplicationContext().getSystemService("window");

23.//设置LayoutParams(全局变量)相关参数

24.wmParams = ((MyApplication)getApplication()).getMywmParams();

25.

26./**

27.*以下都是youtParams的相关属性

28.* 具体用途可参考SDK文档

29.*/

相关文档
最新文档