android悬浮窗口

preview
需积分: 0 1 下载量 125 浏览量 更新于2013-09-29 2 收藏 116KB DOC 举报
### Android悬浮窗口与Frame动画实现详解 #### 一、悬浮窗口概述 悬浮窗口是指可以在其他应用程序之上显示的小型用户界面元素。在Android开发中,悬浮窗口通常用于提供额外的功能或者增强用户体验,例如通知、快捷菜单等。对于Android情侣短信软件来说,悬浮窗口可以作为一个额外的界面来展示动画效果或者其他信息。 为了实现悬浮窗口功能,开发者需要了解`WindowManager`类的使用方法。`WindowManager`是Android系统中用于管理窗口的核心组件之一,它提供了向屏幕添加、更新或删除视图的方法。 #### 二、实现悬浮窗口的关键步骤 ##### 1. 添加必要的权限 在`AndroidManifest.xml`文件中添加悬浮窗口权限: ```xml <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> ``` 这个权限允许应用在其他应用之上显示悬浮窗口。 ##### 2. 创建悬浮窗口 创建悬浮窗口主要涉及以下几个步骤: - 使用`WindowManager`类。 - 通过`addView()`方法添加视图。 - 设置悬浮窗口的参数,如位置、大小等。 具体步骤如下: ```java // 获取WindowManager服务 WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE); // 创建布局参数 WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, PixelFormat.TRANSLUCENT); // 设置初始位置 layoutParams.gravity = Gravity.TOP | Gravity.LEFT; layoutParams.x = 0; layoutParams.y = 0; // 创建视图 View view = LayoutInflater.from(this).inflate(R.layout.float_layout, null); // 添加视图到WindowManager windowManager.addView(view, layoutParams); ``` ##### 3. 更新悬浮窗口 如果需要动态调整悬浮窗口的位置或尺寸,可以通过调用`updateViewLayout()`方法实现: ```java windowManager.updateViewLayout(view, layoutParams); ``` 其中`layoutParams`包含了新的位置和尺寸信息。 ##### 4. 移除悬浮窗口 当不再需要悬浮窗口时,可以使用`removeView()`方法将其移除: ```java windowManager.removeView(view); ``` #### 三、Frame动画实现 在Android中,Frame动画是一种简单的动画形式,它通过顺序显示一系列图像来模拟运动效果。对于情侣短信软件中的悬浮窗口,可以使用Frame动画来增加视觉吸引力。 ##### 1. 创建动画资源 在`res/anim`目录下创建动画资源文件,例如`ali_animation.xml`: ```xml <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="@drawable/al1" android:duration="100"/> <item android:drawable="@drawable/al2" android:duration="100"/> ... </animation-list> ``` ##### 2. 在代码中播放动画 加载并播放动画需要使用`AnimationDrawable`类: ```java // 加载帧动画资源 Drawable drawable = view.getBackground(); if (drawable instanceof AnimationDrawable) { AnimationDrawable frameAnimation = (AnimationDrawable) drawable; frameAnimation.start(); // 开始播放动画 } ``` 为了使动画自动播放,可以将`frameAnimation.start()`放在`OnPreDrawListener`的回调方法中,这样每当视图重新绘制时都会触发动画的播放。 #### 四、完整示例代码 下面是一个简化版的悬浮窗口和Frame动画实现的代码示例: ```java public class MyFloatView extends View { private AnimationDrawable frameAnimation; private WindowManager windowManager; private WindowManager.LayoutParams layoutParams; public MyFloatView(Context context, AttributeSet attrs) { super(context, attrs); init(context); } private void init(Context context) { // 初始化WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); // 创建布局参数 layoutParams = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, PixelFormat.TRANSLUCENT); // 设置初始位置 layoutParams.gravity = Gravity.TOP | Gravity.LEFT; layoutParams.x = 0; layoutParams.y = 0; // 创建视图 LayoutInflater inflater = LayoutInflater.from(context); View view = inflater.inflate(R.layout.float_layout, null); // 添加视图到WindowManager windowManager.addView(view, layoutParams); // 设置背景为帧动画 setBackgroundResource(R.anim.ali_animation); frameAnimation = (AnimationDrawable) getBackground(); } @Override protected void onAttachedToWindow() { super.onAttachedToView(); if (frameAnimation != null) { frameAnimation.start(); } } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); if (frameAnimation != null) { frameAnimation.stop(); } } // 其他处理逻辑,如触摸事件等 } ``` 以上代码展示了如何在Android应用中实现悬浮窗口以及Frame动画的基本过程。通过这些技术点的学习,可以更好地理解Android悬浮窗口的相关知识,并在实际项目中灵活运用。