哪些API用于绘制其他应用程序(如Facebook的聊天头)?

问题描述 投票:227回答:3

Facebook如何在Android上创建聊天头?什么是在所有其他视图之上创建浮动视图的API?

android facebook android-windowmanager
3个回答
217
投票

This一:

允许应用程序使用以下类型打开窗口TYPE_SYSTEM_ALERT,显示在所有其他应用程序的顶部。很少有应用程序应使用此许可权。这些窗户是专为与用户进行系统级交互。

恒定值:“ android.permission.SYSTEM_ALERT_WINDOW”

//编辑:完整代码here

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));

..将此服务添加到清单中。


51
投票

通常,Android活动是全屏的,概念上专用的用户界面,可以进行所有交互。有一些例外。首先,有一些弹出对话框不会填满屏幕。另一个是Android Toast,它是一个非交互式弹出窗口-您无法触摸它,如果尝试,它将转到下面的所有内容。

您也可以做自己的特殊用户界面。您可以通过指定类型标记将视图直接添加到WindowManager。聊天头可能使用TYPE_PHONE。有一些类似的类型,但是目的是相同的:特殊用途的覆盖层可以出现在其他任何对象的顶部,而显然没有父应用程序出现。

但是,由于交互问题,这只能使您走到现在。首先,您的叠加层将吸收所有互动,因此头部不仅会获取事件,而且还会阻止与下方所有事物的互动。

您使用LayoutParams配置此行为。 FLAG_NOT_TOUCH_MODAL表示显示区域之外的事件将进入基础UI。现在,您会发现它可以工作,但是仍然存在其他不良情况,例如后退/菜单按钮未定向到应用程序,而且没有键盘。要解决您需要的FLAG_NOT_FOCUSABLE

您也从不可聚焦的位得到了副作用,这与覆盖层不再是很好的交互,例如按下按钮。不过,您可以获得一些基本的触摸事件,您可以随时对其进行数学运算,这对于聊天头来说可能就足够了。请注意,它会在很多领域(如UI动画)让您自己动手。

可以在this StackOverflow thread中找到详细的概述,包括允许进行选择性的交互消耗。特别是,其中一个答案链接最终将带您进入here,这是一个很好的示例项目。请注意,ICS稍微改变了它的工作方式,但是线程对此做了解释。

这都是公共API的东西,但是,理所当然,这似乎并不是应该要做的主流事情。该文档中充斥着对特殊系统应用程序行为的引用,并且有充分的理由;如果每个人都做了呢?


7
投票

Springy heads开箱即用地提供了基于弹簧的聊天头行为。您需要定义的只是聊天头的可绘制对象,以及单击聊天头后即可打开的片段。最小化时,聊天头会折叠,拖动时会跟随手指。

该项目包括一个演示应用程序,演示了所有内置功能。要使用它,需要将其添加到gradle依赖项中。

compile 'com.flipkart.springyheads:library:0.9.6'
© www.soinside.com 2019 - 2024. All rights reserved.