好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

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

6页
  • 卖家[上传人]:pu****.1
  • 文档编号:559349754
  • 上传时间:2023-11-27
  • 文档格式:DOCX
  • 文档大小:52.43KB
  • / 6 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 大家对悬浮窗概念不会陌生,相信每台电脑桌面的右上角都会有这么一个东西,它总是出现在所有页面的顶端(Top Show)但在Android平台中如何实现这样的效果呢?先来看一看效果图看见在Google搜索框上面的那个Icon图片了嘛下面我就来详细介绍一下在Android平台下悬浮窗口的实现,并让它能够随手指的触摸而移动一、实现原理及移动思路调用WindowManager,并设置WindowManager.LayoutParams的相关属性,通过WindowManager的addView方法创建View,这样产生出来的View根据WindowManager.LayoutParams属性不同,效果也就不同了比如创建系统顶级窗口,实现悬浮窗口效果!然后通过覆写悬浮View中onTouchEvent方法来改变windowMananager.LayoutParams中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 WindowManager.LayoutParams wmParams = ((MyApplication)getContext().getApplicationContext()).getMywmParams(); 10.11. public MyFloatView(Context context) { 12. super(context); 13. // TODO Auto-generated constructor stub 14. } 15.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. } 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); //刷新显示 }}上面的wmParams变量(即WindowManager.LayoutParams)的存储采用了extends Application的方式来创建全局变量,示例代码如下:[java] view plaincopyprint?1. public class MyApplication extends Application { 2.3. /** 4. * 创建全局变量 5. * 全局变量一般都比较倾向于创建一个单独的数据类文件,并使用static静态变量 6. * 7. * 这里使用了在Application中添加数据的方法实现全局变量 8. * 注意在AndroidManifest.xml中的Application节点添加android:name=".MyApplication"属性 9. * 10. */ 11. private WindowManager.LayoutParams wmParams=new WindowManager.LayoutParams(); 12.13. public WindowManager.LayoutParams getMywmParams(){ 14. return wmParams; 15. } 16. } 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; }}再来看一看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 WindowManager.LayoutParams wmParams=null; 6.7. private MyFloatView myFV=null; 8.9. @Override 10. public void onCreate(Bundle savedInstanceState) { 11. super.onCreate(savedInstanceState。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.