android悬浮窗口
需积分: 0 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悬浮窗口的相关知识,并在实际项目中灵活运用。
lovinghuangxiaofeng
- 粉丝: 0
- 资源: 11
最新资源
- 技术册投标文件的的查重
- 通信原理(第七版 樊昌信 曹丽娜)思维导图
- genad-hGridSample-test.hbm
- cvtocc-shanghai.hbm
- k8s安装ingress-nginx
- dnSpy-net-win32-222.zip
- mongoose-free-6.9
- 德普微一级代理 DP100N06MGL PDFN3.3*3.3 TRMOS N-MOSFET 60V, 8mΩ, 45A
- 【java毕业设计】SpringBoot+Vue幼儿园管理系统 源码+sql脚本+论文 完整版
- 德普微一级代理 DP021N03FGLI DFN5*6 DPMOS N-MOSFET 30V 180A 1.8mΩ