API nào được sử dụng để thu hút các ứng dụng khác (như Chat Heads của Facebook)?


226

Làm thế nào để Facebook tạo Chat Heads trên Android? API để tạo các chế độ xem nổi trên đầu trang của tất cả các chế độ xem khác là gì?


6
Ứng dụng này cũng có "Thủ trưởng trò chuyện" play.google.com/store/apps/details?id=com.ninja.sms
Oli

11
Nếu bạn đang tìm kiếm một ví dụ, hãy xem github.com/marshallino16/FloatingNotification
marshallino16

5
Bạn có thể tìm thấy một bản demo và một thư viện đơn giản tại đây: github.com/ericbhatti/floaties Sử dụng thư viện này, bạn có thể tạo các cửa sổ nổi chỉ bằng 2 dòng.
Eric B.

Câu trả lời:


217

Đây là một:

Cho phép ứng dụng mở các cửa sổ bằng cách sử dụng loại TYPE_SYIUS_ALERT, được hiển thị trên đầu trang của tất cả các ứng dụng khác. Rất ít ứng dụng nên sử dụng quyền này; các cửa sổ này được dành cho tương tác cấp hệ thống với người dùng.

Giá trị không đổi: "ERIC.SYIUS_ALERT_WINDOW"

// EDIT: Mã đầy đủ ở đây :

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

Đừng quên bắt đầu dịch vụ bằng cách nào đó:

startService(new Intent(context, ChatHeadService.class));

.. Và thêm dịch vụ này vào Bản kê khai của bạn.


4
Có nhiều thứ kỳ lạ hơn, tôi nghĩ vậy. Điều gì về việc xử lý đầu vào bên ngoài "đầu" cũng như khả năng kéo? Tôi nghĩ rằng ít nhất bạn cũng cần FLAG_NOT_TOUCH_MODAL , cũng như một số logic thông minh để cập nhật các thuộc tính Window (nghĩa là di chuyển nó) trong khi bạn đang kéo nó.
Delyan

2
trong đó làm thế nào để loại bỏ đầu trò chuyện?
Nirav Mehta

6
Nghĩ rằng đáng để đề cập đến một SDK tôi đã phát triển để tạo UI nổi: www.tooleap.com
Arik

@NiravMehta Bạn có thể loại bỏ các đầu trò chuyện không?
KK_07k11A0585

Làm cách nào để loại bỏ lề của đầu trò chuyện. Bởi vì trong đoạn mã trên, vòng tròn có một khoảng trống từ đường viền. Trong Facebook, bong bóng không có khoảng trống đó
Trình gỡ lỗi

51

Theo quy định, các hoạt động của Android là toàn màn hình, các UI dành riêng về mặt khái niệm có tất cả các tương tác. Có một vài ngoại lệ cho điều này. Để bắt đầu, có các hộp thoại bật lên không lấp đầy màn hình. Một cái khác là bánh mì nướng Android, một cửa sổ bật lên không tương tác - bạn không thể chạm vào nó và nếu bạn thử nó sẽ đi đến bất cứ thứ gì bên dưới.

Bạn cũng có thể làm UI đặc biệt của riêng mình. Bạn có thể thêm các khung nhìn trực tiếp vào WindowManager, chỉ định một loại cờ. Người đứng đầu trò chuyện có thể sử dụng TYPE_PHONE . Có một vài loại tương tự, nhưng mục đích là như nhau: lớp phủ mục đích đặc biệt có thể xuất hiện trên đầu của bất kỳ thứ gì khác mà không có ứng dụng mẹ rõ ràng có mặt.

Điều đó chỉ đưa bạn đến nay, mặc dù, vì các vấn đề với tương tác. Lúc đầu, lớp phủ của bạn sẽ hấp thụ tất cả các tương tác, do đó, không chỉ người đứng đầu nhận được các sự kiện, mà bạn còn chặn sự tương tác với mọi thứ bên dưới.

Bạn định cấu hình hành vi này bằng cách sử dụng LayoutParams . FLAG_NOT_TOUCH_MODALcó nghĩa là các sự kiện bên ngoài khu vực hiển thị của bạn đi đến các UI bên dưới. Bây giờ bạn sẽ thấy nó hoạt động, nhưng những điều tồi tệ khác vẫn xảy ra, như các nút quay lại / menu không được chuyển hướng đến các ứng dụng, cộng với không có bàn phím. Để giải quyết mà bạn cần FLAG_NOT_FOCUSABLE.

Bạn cũng nhận được một hiệu ứng phụ từ bit không thể lấy nét, đây không phải là tương tác tốt với lớp phủ của bạn nữa, ví dụ như nhấn nút. Mặc dù vậy, bạn có thể nhận được một số sự kiện chạm cơ bản, điều mà bạn luôn có thể thực hiện toán học và điều đó có lẽ là đủ cho Chat Heads. Chỉ cần lưu ý rằng nó để bạn tự mình trong nhiều lĩnh vực, như hoạt hình UI.

Một tổng quan tốt về chi tiết, bao gồm cho phép tiêu thụ tương tác có chọn lọc, có thể được tìm thấy trong luồng StackOverflow này . Cụ thể, một trong những liên kết trả lời cuối cùng sẽ đưa bạn đến đây , đó là một dự án ví dụ hay. Lưu ý rằng ICS đã thay đổi cách thức hoạt động một chút, nhưng các chủ đề giải thích điều đó.

Đây là tất cả các công cụ API công khai, nhưng nó không thực sự giống như một thứ chính thống mà người ta phải làm như một vấn đề tất nhiên. Tài liệu này chứa đầy các tài liệu tham khảo về các hành vi ứng dụng hệ thống đặc biệt và với lý do chính đáng; Nếu mọi người đã làm điều đó thì sao?


Tôi có thể chặn một số thay đổi định hướng cho các chế độ xem này không? Nếu hoạt động cơ bản chuyển hướng, quan điểm của tôi cũng thay đổi hướng của anh ấy.
MG

1
Không. Thay đổi định hướng là toàn thiết bị, không chỉ cho hoạt động.
Rob Pridham

7

Đầu Springy cho hành vi dựa trên mùa xuân của đầu trò chuyện ra khỏi hộp. Tất cả những gì bạn phải xác định là có thể rút ra được cho phần đầu trò chuyện và đoạn để mở khi đầu trò chuyện được nhấp. Các đầu trò chuyện sụp đổ khi thu nhỏ và theo ngón tay khi kéo.

Dự án bao gồm một ứng dụng demo thể hiện tất cả các chức năng được xây dựng. Để sử dụng nó, bạn cần thêm nó vào phụ thuộc lớp của bạn.

compile 'com.flipkart.springyheads:library:0.9.6'

Xin chào @KiranKumar, bạn đã tạo ra một thư viện rất rõ ràng .. Tôi chỉ thích nó .. Tôi đang cố gắng học các khía cạnh khác nhau từ thư viện này .. Tôi đã cố gắng chạy nó bên ngoài cửa sổ ứng dụng, bằng cách nào đó tôi hơi thành công trong việc thực hiện vậy đó .. Nhưng, vấn đề phát sinh khi tôi nhấp vào đầu trò chuyện bên ngoài cửa sổ của ứng dụng .. đoạn đó sẽ không thể mở và trả lại java.lang.OutOfMemoryError .. nếu có thể từ phía bạn hãy cho tôi một số cách để vượt qua điều này .. Nó sẽ được vinh dự một cách vui vẻ ..
Arraystack

@arraystack bây giờ bạn có thể chạy nó trong một dịch vụ. Kiểm tra danh sách nếu các chi nhánh trong repo GitHub
Kiran Kumar

@KiranKumar Cảm ơn bạn, Vấn đề với lib mới là sự cho phép của ứng dụng Draw over trong Phiên bản Marshmallow
Arraystack
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.