Android 在所有应用的上层弹出可拖动的View
来源:互联网 发布:个人域名可以转企业吗 编辑:程序博客网 时间:2024/05/16 06:08
最近facebook Messenger添加了一个新的特性chatHead,这个图标可以脱离所有的界面,显示在android手机的所有应用的最上面。研究了下。记录如下。
首先想到的是用一个透明的Activity来搞这个事情,想来facebook不会这么愚蠢,试了下果然猜对了:
adb shell dumpsys activity,没有发现相关activity。
其实facebook用的是service。
adb shell dumpsys activity services下发现果然找到了其service。
解释下实现原理。
很简单,就是将一个View添加到Window里。我们知道,一个Activity有一个Window实例,Dialog也有他们自己的专用实例,Service也可以有一个Window。比如说 InputMethodService可以用一个Window去接收Touch事件然后在任意一个Window的上面绘制一个键盘。DreamService用来创建屏保。
为了显示一个新的Window,需要加入如下权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
public class ChatHeadService extends Service {private WindowManager windowManager;private ImageView chatHead;@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}@Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.onCreate();windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);chatHead = new ImageView(this);chatHead.setImageResource(R.drawable.ic_launcher);WindowManager.LayoutParams params = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT,WindowManager.LayoutParams.WRAP_CONTENT,WindowManager.LayoutParams.TYPE_PHONE,WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,PixelFormat.TRANSLUCENT);params.gravity = Gravity.TOP | Gravity.LEFT;params.x = 0;params.y = 100;windowManager.addView(chatHead, params);setChatHeadTouchListener(params);}private void setChatHeadTouchListener(final WindowManager.LayoutParams params) {chatHead.setOnTouchListener(new View.OnTouchListener() {private int initialX;private int initialY;private float initialTouchX;private float initialTouchY;@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:initialX = params.x;initialY = params.y;initialTouchX = event.getRawX();initialTouchY = event.getRawY();return true;case MotionEvent.ACTION_UP:return true;case MotionEvent.ACTION_MOVE:params.x = initialX+ (int) (event.getRawX() - initialTouchX);params.y = initialY+ (int) (event.getRawY() - initialTouchY);windowManager.updateViewLayout(chatHead, params);return true;}return false;}});}@Overridepublic void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();if (chatHead != null) {windowManager.removeView(chatHead);}}}方法setChatHeadTouchListener可以使这个view可以在Window上随意拖动。
别忘了在想显示Window的时候开启服务。
startService(new Intent(this, ChatHeadService.class));这样你就能看到一个可爱的Window显示在所有的应用程序上面了。
代码地址:http://download.csdn.net/detail/liuhanhan512/7208705
有问题交流。
0 0
- Android 在所有应用的上层弹出可拖动的View
- Android 可在全屏幕自由拖动的view
- Android可在全屏幕自由拖动的view
- Android 悬浮在Activity内的可拖动View
- 可在全屏幕自由拖动的view
- 可在全屏幕自由拖动的view
- Android-可随意拖动的View
- Android 简单实现可全屏拖动,可点击的View
- 一个可拖动的View
- android 自定义View开发实战(六) 可拖动的GridView
- Android View的拖动
- 可拖动的弹出层提示效果
- 可拖动的弹出层提示效果
- 可拖动的弹出层提示效果
- 可拖动的div弹出层
- JS 弹出可拖动的浮动层
- ViewDragHelper详解- 可拖动的view
- ViewDragHelper详解- 可拖动的view
- hadoop2.2.0 自带jar 包和 MR程序所使用的第三方包冲突 解决
- poj 4586 Play the Dice(数论)
- 如何改变对话框的背景颜色
- 两个float相减时丢失精度的解决方法
- Eclispe自动部署到Tomact下的webapps目录下
- Android 在所有应用的上层弹出可拖动的View
- Android模拟神器_Genymotion
- 阿里面试总结
- C++指向类成员函数的指针
- 华硕 ZenFone 国产新机盘点
- 格子取数问题的动态规划和递归解法之比较
- MAC中设置android adb环境变量
- 复制文件夹及所有文件到另一个目录下
- rtsp流媒体服务器的搭建Windows/Linux