Android中可自由移动悬浮窗口的实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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.*/