Facebook如何在Android上创建聊天头?在所有其他视图之上创建浮动视图的API是什么?
这一个:
允许应用程序使用该类型打开窗口 TYPE_SYSTEM_ALERT,显示在所有其他应用程序的顶部。 很少应用程序应该使用此权限;这些窗口 用于与用户的系统级交互。 固定值:"android.permission.SYSTEM_ALERT_WINDOW"
/ /编辑: 完整代码如下:
public class ChatHeadService extends Service {
private WindowManager windowManager;
private ImageView chatHead;
@Override public IBinder onBind(Intent intent) {
// Not used
return null;
}
@Override public void onCreate() {
super.onCreate();
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
chatHead = new ImageView(this);
chatHead.setImageResource(R.drawable.android_head);
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);
}
@Override
public void onDestroy() {
super.onDestroy();
if (chatHead != null) windowManager.removeView(chatHead);
}
}
不要忘记以某种方式启动服务:
startService(new Intent(context, ChatHeadService.class));
. .并将此服务添加到您的清单中。
一般来说,Android活动是全屏的,概念上专用的ui,承担所有的交互。但也有一些例外。首先,有些弹出对话框并不会满屏。另一个是Android吐司,这是一个非交互式的弹出窗口——你不能触摸它,如果你尝试它会去到下面的任何东西。
你也可以做你自己的特殊ui。您可以直接向WindowManager添加视图,并指定类型标志。聊天头可能使用TYPE_PHONE。有一些类似的类型,但目的是相同的:特殊用途的覆盖,可以出现在其他任何东西的顶部,而不明显存在父应用程序。
不过,由于交互问题,这只能让你走到这里。首先,你的覆盖层将吸收所有的交互,所以不仅头部得到事件,但你阻碍了所有下面的交互。
您可以使用LayoutParams配置此行为。FLAG_NOT_TOUCH_MODAL意味着在显示区域之外的事件将被转移到底层ui。你现在会发现它是有效的,但其他不好的事情仍然会发生,比如后退/菜单按钮不能指向应用程序,加上没有键盘。要解决这个问题,你需要FLAG_NOT_FOCUSABLE。
你也会从不可聚焦的位得到一个副作用,这与你的覆盖层没有很好的交互,例如按钮按下。你可以获得一些基本的触摸事件,你总是可以进行数学运算,这对于Chat Heads来说可能已经足够了。但要注意的是,它会让你在很多方面自顾自,比如UI动画。
可以在这个StackOverflow线程中找到详细的概述,包括允许选择性交互消费。特别是其中一个答案链接最终会把你带到这里,这是一个很好的示例项目。注意,ICS稍微改变了它的工作方式,但是线程解释了这一点。
这都是公共API的东西,但它看起来并不是一个主流的东西,人们应该理所当然地去做。文档中充斥着对特殊系统应用行为的引用,这是有充分理由的;如果每个人都这么做呢?
Springy heads提供了基于spring的聊天头的行为。您所需要定义的只是聊天头的可绘制对象,以及单击聊天头后打开的片段。聊天头崩溃时,最小化和随着手指拖动。
该项目包括一个演示应用程序,演示所有内置功能。要使用它,你需要将它添加到你的gradle依赖项中。
compile 'com.flipkart.springyheads:library:0.9.6'
推荐文章
- 使用什么api来绘制其他应用程序(如Facebook的Chat Heads)?
- getDefaultSharedPreferences和getSharedPreferences的区别
- 如何模拟按钮点击使用代码?
- Android Webview给出net::ERR_CACHE_MISS消息
- Parcelable遇到IOException写入序列化对象getactivity()
- 如何在Android中动态更改菜单项文本
- 如何将Base64字符串转换为位图图像,以显示在一个ImageView?
- 新版本的Android模拟器问题-模拟器进程已终止
- 没有与请求版本匹配的NDK版本
- 如何将一个颜色整数转换为十六进制字符串在Android?
- 格式浮动到小数点后n位
- 移除一个onclick监听器
- 如何圆形图像与滑翔图书馆?
- 测试者从哪里下载谷歌Play Android应用?
- Android Studio在创建新项目时卡住了Gradle下载