最近看了一篇博文帮助挺大,我想好多学习android 的人都看过,转过来做个本备份。
package net.xsmile.fv;
import android.app.Application;
import android.view.WindowManager;
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;
}
}
package net.xsmile.fv;
import android.content.Context;
import android.util.Log;
import android.view.MotionEvent;
import android.view.WindowManager;
import android.widget.ImageView;
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);
}
}
package net.xsmile.fv;
import android.app.Activity;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.view.Gravity;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
public class MyFloatViewActivity extends Activity {
/** Called when the activity is first created. */
private WindowManager wm=null;
private WindowManager.LayoutParams wmParams=null;
private MyFloatView myFV=null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//创建悬浮窗口
createView();
}
private void createView(){
myFV=new MyFloatView(getApplicationContext());
myFV.setImageResource(R.drawable.icon);
//获取WindowManager
wm=(WindowManager)getApplicationContext().getSystemService("window");
//设置LayoutParams(全局变量)相关参数
wmParams = ((MyApplication)getApplication()).getMywmParams();
/**
*以下都是WindowManager.LayoutParams的相关属性
* 具体用途可参考SDK文档
*/
wmParams.type=LayoutParams.TYPE_PHONE; //设置window type
wmParams.format=PixelFormat.RGBA_8888; //设置图片格式,效果为背景透明
//设置Window flag
wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL
| LayoutParams.FLAG_NOT_FOCUSABLE;
/*
* 下面的flags属性的效果形同“锁定”。
* 悬浮窗不可触摸,不接受任何事件,同时不影响后面的事件响应。
wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL
| LayoutParams.FLAG_NOT_FOCUSABLE
| LayoutParams.FLAG_NOT_TOUCHABLE;
*/
wmParams.gravity=Gravity.LEFT|Gravity.TOP; //调整悬浮窗口至左上角
//以屏幕左上角为原点,设置x、y初始值
wmParams.x=0;
wmParams.y=0;
//设置悬浮窗口长宽数据
wmParams.width=40;
wmParams.height=40;
//显示myFloatView图像
wm.addView(myFV, wmParams);
}
@Override
public void onDestroy(){
super.onDestroy();
//在程序退出(Activity销毁)时销毁悬浮窗口
wm.removeView(myFV);
}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.xsmile.fv"
android:versionCode="1"
android:versionName="1.0">
<application android:name=".MyApplication" android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MyFloatViewActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
</manifest>
转自:
http://www.xsmile.net/?p=452
分享到:
相关推荐
android可拖动悬浮窗口 事件传递等 android可拖动悬浮窗口 事件传递等
android全局悬浮窗口可拖动android全局悬浮窗口可拖动android全局悬浮窗口可拖动android全局悬浮窗口可拖动
当今android最牛的悬浮窗口 内存监控 可用内存 已用内存 悬浮更新 随意拖动 不下载就后悔的
android 添加随意拖动的桌面悬浮窗口
一个java源码实现的Android悬浮框特效,用来模仿有些音乐播放器中的悬浮歌词功能,使用Android Activity并可拖动悬浮框,@author 丸子。触摸点相对于屏幕左上角坐标,这个悬浮歌词框支持更新界面,源代码内支持定义...
看 FloatsWindowView,MainActivity两个类就行了。 android桌面悬浮框,可以拖动,仿iphone的 那个touch助手
在桌面添加可拖动/点击的悬浮窗口,很不错的哦 .
悬浮小球,小球置顶,可点击,可移动,可拖拽。鼠标左键点击可拖拽,鼠标右键点击打开百度网页,鼠标中键(点击滚轮)点击可关闭小球。
* 可拖拽的悬浮控件按钮 * 自动吸附左右边框 * 直接xml布局里引用即可。 * 要设置setOnClickListener点击事件,即可实现拖拽和点击功能。 * 尺寸大小,样式及背景图片遵循ImageView即可。 原文有介绍有动态介绍图...
突然对悬浮窗体感兴趣,查资料做了个小Demo,效果是点击按钮后,关闭当前Activity,显示悬浮窗口,窗口可以拖动,双击后消失。效果图如下: 它的使用原理很简单,就是借用了WindowManager这个管理类来实现的。 1....
程序效果 : 在android手机的桌面屏幕上显示一个可拖动的悬浮窗口
本文例子实现了点击显示悬浮窗口,同时窗口可播放视频,拖动位置,点击关闭及返回 APP 页面,通过例子来讲述悬浮窗口实现原理及细节处理,效果图如下所示: 悬浮窗口.gif 原理 WindowManager 对 View 视图进行添加...
一个实用的Android 内存监测悬浮窗,可用于监视某个应用或显示监视信息,本源码中的悬浮窗是用于内存监视器的窗口来用,显示监测到的一些信息,功能说明: 1.用户可任意拖动悬浮窗,自定义位置,并可任意调整窗口...
突然对悬浮窗体感兴趣,查资料做了个小Demo,效果是点击按钮后,关闭当前Activity,显示悬浮窗口,窗口可以拖动,双击后消失。效果图如下: 它的使用原理很简单,就是借用了WindowManager这个管理类来实现的。 1....
纯RN仿微信悬浮窗口 运行这个项目 npm install react-native run-ios或react-native run-android 用法 步骤1 npm install react-native-root-siblings 第2步 将SuspensionWindow浮动块拖动到自己的浮动块上 第三...
1、在手机桌面创建一个窗口,类似于360的悬浮窗口,点击这个窗口可以响应(至于窗口拖动我们可以后面再扩展)。 2、自己开发的应用去启动一个非本应用B,在B应用的某个界面增加一个引导窗口。 3、在应用的页面上...