如何实现可以在Android中的任何其他应用上显示的弹出式叠加层

时间:2013-04-13 16:24:49

标签: android user-interface

如何为可以在任何其他应用上显示的应用实施弹出式叠加层。

Facebook在其新的Facebook Messanger版本中实现了一个名为Chatheads的非常类似的功能。我真的很惊讶地看到这是可能的。在图像上,您会看到另一个应用程序上的聊天(右侧的狗)。

Facebook Messanger's Chathead over other app

5 个答案:

答案 0 :(得分:6)

完整的源代码在这里:http://www.piwai.info/chatheads-basics
注意:您需要<uses-permission android:name="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);
  }
}

答案 1 :(得分:4)

This是浮动“聊天”式叠加层的简单,简单且一般的示例。

它使用以下代码使事物浮动:

windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
chatHead = new ImageView(this);
chatHead.setImageResource(R.drawable.floating);
final 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);

可以找到完整的源代码here(在Apache许可下)。

答案 2 :(得分:2)

我知道发布答案的时间已经很晚了,我会将其发布给其他寻求答案的人

AndroidFloatingImage

答案 3 :(得分:2)

如果你想要像Messenger这样的行为,可以使用一个库:Bubbles

如果你喜欢自己实现它,请看其他人建议的Window Manager。您还可以查看Bubbles的源代码以获取灵感。

答案 4 :(得分:0)

每个活动,对话框和服务都附有一个窗口。 Facebook保持服务在后台和服务中运行,他们通过

获取窗口管理器对象

windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

在添加视图时创建布局参数

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

现在通过以下方法

将您的视图添加到窗口管理器
windowManager.addView(yourView, params);