Android中用什么API来创建聊天头?

Dan*_*ite 225 android facebook android-windowmanager

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

Waz*_*_Be 217

一个:

允许应用程序使用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);
  }
}
Run Code Online (Sandbox Code Playgroud)

不要忘记以某种方式启动服务:

startService(new Intent(context, ChatHeadService.class));
Run Code Online (Sandbox Code Playgroud)

..并将此服务添加到您的清单中.

  • 认为值得一提的是我为创建浮动UI而开发的SDK:www.tooleap.com (6认同)
  • 我想,还有更奇怪的东西.如何处理"头部"以外的输入以及可拖动性?我认为你至少需要[FLAG_NOT_TOUCH_MODAL](http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_NOT_TOUCH_MODAL),以及一些更新Window属性的聪明逻辑(即你拖动它时移动它. (4认同)
  • 在那如何删除聊天头? (2认同)

Rob*_*ham 52

通常,Android活动是全屏,概念上专用的UI,可以进行所有交互.这有一些例外.首先,有一些弹出式对话框没有填满屏幕.另一个是Android toast,它是一个非交互式弹出窗口 - 你无法触摸它,如果你尝试它就会去下面的任何东西.

您也可以使用自己的特殊UI.您可以直接向视图添加视图WindowManager,指定类型标志.聊天头可能使用TYPE_PHONE.有一些类似的类型,但目的是相同的:特殊用途的叠加层可以出现在其他任何东西的顶部而不显示父应用程序.

但是,由于互动问题,这只能让你到目前为止.首先,您的叠加层会吸收所有互动,因此不仅会让头部获得事件,还会阻止与下方所有内容的互动.

您可以使用LayoutParams配置此行为.FLAG_NOT_TOUCH_MODAL表示显示区域外的事件转到底层UI.你现在会发现它有效,但其他不好的事情仍然会发生,例如后退/菜单按钮不会被定向到应用程序,也没有键盘.解决你需要的问题FLAG_NOT_FOCUSABLE.

您也会从不可聚焦的位置获得副作用,这与您的叠加层不再有很好的交互,例如按下按钮.你可以获得一些基本的触摸事件,你可以随时进行数学运算,这对于Chat Heads来说已经足够了.请注意,它会在很多方面让您自己离开,比如UI动画.

可以在此StackOverflow线程中找到详细信息,包括允许选择性交互消耗.特别是其中一个答案链接最终将带您到这里,这是一个很好的示例项目.请注意,ICS改变了它的工作原理,但线程解释了这一点.

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


Kir*_*mar 7

弹性的头部提供开箱即用的聊天头的弹簧行为.您只需要定义聊天头的drawable和点击聊天头后打开的片段.最小化时聊天头会折叠,拖动时会跟随手指.

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

compile 'com.flipkart.springyheads:library:0.9.6'
Run Code Online (Sandbox Code Playgroud)