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'