Làm cách nào để tạo lớp phủ trợ giúp như bạn thấy trong một số ứng dụng Android và ICS?


93

Tôi muốn tạo lớp phủ trợ giúp giống như lớp bạn thấy khi ICS tải lần đầu tiên hoặc trong các ứng dụng như ES File Explorer hoặc Apex Launcher (có nhiều hơn nữa, nhưng tôi không thể nghĩ ra ngay bây giờ). Đây có phải chỉ là một bố cục tương đối với một khung nhìn nằm trên đầu kia không? Tôi không thể tìm thấy bất kỳ mã mẫu nào để làm điều đó. Bất cứ ai biết làm thế nào điều này được thực hiện hoặc có bất kỳ ý tưởng?

ES File Explorer ES File Explorer

Câu trả lời:


84

Giả sử bạn thường gọi setContentView(R.layout.main), nhưng trong lần chạy đầu tiên, bạn muốn có lớp phủ này.

Bước # 1: Tạo FrameLayoutmã bằng Java và chuyển mã đó vào setContentView().

Bước # 2: Sử dụng LayoutInflaterđể thổi phồng R.layout.mainvào FrameLayout.

Bước # 3: Sử dụng LayoutInflaterđể thổi phồng lớp phủ vào FrameLayout.

Bước # 4: Khi người dùng nhấn vào nút (hoặc bất kỳ thứ gì) để loại bỏ lớp phủ, hãy gọi removeView()để xóa lớp phủ khỏi FrameLayout.

Vì lớp phủ là phần tử con sau này của FrameLayout, nó sẽ nổi lên trên nội dung của R.layout.main.


6
@ ssuperz28: Vâng, tốt, ngoại trừ các đầu mũi tên vẽ tay và bong bóng. Bạn là của riêng bạn cho những điều đó. :-)
CommonsWare

Tôi không biết liệu bạn có làm được những gì mình muốn hay không, nhưng đây là một giải pháp thay thế khác. stackoverflow.com/questions/8841240/… Nếu bạn hiểu giải pháp do CommonsWare đưa ra, điều duy nhất xảy ra với tôi để thiết lập các mũi tên, là xác định FrameLayout của các hướng dẫn với resourceImage hoặc backgroundImage đã có hình ảnh với các mũi tên (và minh bạch).
Edison Santos,

1
Có cách nào để làm điều này nhưng thực hiện nó liên quan đến vị trí của trẻ em, những người ở dưới FrameLayout?
4gus71n

@CommonsWare - thưa ông, điều này sẽ hoạt động bất kể nó có thể là thiết bị nào?
Rat-a-tat-a-tat Ratatouille,

2
@ user3364963: Tự động điều chỉnh vị trí của mọi thứ. Câu trả lời của tôi đã được đơn giản hóa một phần. Tôi giả định rằng họ xác định vị trí của các yếu tố được đánh dấu và điều chỉnh tọa độ của "điểm huấn luyện viên". Tùy chỉnh ViewGroupcho lớp "dấu huấn luyện viên" có thể xử lý điều đó và có các thư viện (ví dụ ShowcaseView:) cung cấp các triển khai đóng hộp của mẫu đó.
CommonsWare

80

"Coach mark" là "Help overlay" trong UX talk :-)

Coach_mark.xml là bố cục dấu huấn luyện viên của bạn

Coach_mark_master_view là id của lượt xem nhiều nhất (gốc) trong coach_mark.xml

public void onCoachMark(){

    final Dialog dialog = new Dialog(this);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
    dialog.setContentView(R.layout.coach_mark);
    dialog.setCanceledOnTouchOutside(true);
    //for dismissing anywhere you touch
    View masterView = dialog.findViewById(R.id.coach_mark_master_view);
    masterView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            dialog.dismiss();
        }
    });
    dialog.show();
}

Thêm mẫu coach_mark.xml (vào giải pháp tuyệt vời này do Oded Breiner đưa ra), do đó, ppl dễ dàng sao chép và dán để xem ví dụ làm việc một cách nhanh chóng.

Mẫu của coach_mark.xml tại đây, hãy thay đổi -> drawable / coach_marks thành hình ảnh của bạn:

Coach_mark.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:id="@+id/coach_mark_master_view">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
         <ImageView
             android:id="@+id/coach_marks_image"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:layout_centerInParent="true"
             android:layout_gravity="center_horizontal"
             android:src="@drawable/coach_marks" />
    </RelativeLayout>
</LinearLayout>

Và tùy chọn sử dụng chủ đề này để loại bỏ đệm:

<style name="WalkthroughTheme" parent="Theme.AppCompat">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:backgroundDimEnabled">false</item>
</style>

Xin chào, làm cách nào bạn có thể kéo Hộp thoại này để khớp với màn hình? Từ tài liệu A dialog is a small window that prompts [...]. A dialog does not fill the screen and is normally used for modal events [...].,. Nếu tôi sử dụng mã này, tôi sẽ thấy chế độ xem chính của mình được nén trong một phần nhỏ của màn hình. Nếu tôi đặt android:layout_width="640dp" android:layout_height="480dp"(nghĩa là giá trị thực của màn hình mà tôi đang thử nghiệm), nó hoạt động chính xác. (tất nhiên đây không phải là giải pháp khả thi)
ocramot

@ocramot: ví dụ trên sẽ ở chế độ toàn màn hình vì match_parent và Window.FEATURE_NO_TITLE
Oded Breiner

Sau đó, phải có một số vấn đề khác, bởi vì tôi nhìn thấy nó theo một cách khác
ocramot

1
Tôi biết điều này là ít nhất một vài tháng nhưng câu hỏi toàn màn hình đó đã bao giờ được tìm ra chưa?
cbhedd

3
Để những người không biết làm thế nào để thiết lập các chủ đề của hộp thoại, chỉ cần nhanh chóng hộp thoại như sau:new Dialog(getContext(), R.style.WalkthroughTheme);
w3bshark

4

Bạn có thể làm điều đó khá nhanh chóng. Bạn thêm, ví dụ LinearLayout nơi bạn đặt một bức tranh có alpha tương ứng với thông tin trợ giúp của bạn và những gì bạn muốn vẽ như một lớp phủ. Trong xml hoạt động của bạn, bạn đặt bố cục này trong một RelativeLayout sau bố cục hoạt động của bạn với chế độ hiển thị Cuốn hút. Khi bạn muốn vẽ thông tin trợ giúp, bạn chỉ cần đặt chế độ hiển thị này thành hiển thị.

Tôi hy vọng, tôi rõ ràng, nếu bạn có bất kỳ câu hỏi nào, tôi vui lòng trả lời họ.


Cảm ơn vì đầu vào của bạn. Đây là cách tôi hình dung nó được thực hiện. Tôi phải ghi công cho câu trả lời dưới đây vì đó là cách tôi sẽ xây dựng nó. Nó có vẻ dễ quản lý hơn và tôi không phải thay đổi bố cục hoạt động chính của mình.
ssuperz28

1

Xem câu trả lời khác của tôi về cách hiển thị theo chương trình một bố cục lớp phủ trên đầu hoạt động hiện tại. Layout.xml của Activity không cần biết bất cứ điều gì về lớp phủ. Bạn có thể đặt lớp phủ nửa trong suốt, chỉ che một phần màn hình, một hoặc nhiều chế độ xem văn bản và các nút trên đó ... Làm cách nào để phủ một nút theo chương trình?

  • tạo mẫu res / layout / paused.xml RelativeLayout hoặc sử dụng bất kỳ cấp độ bố cục nào
  • tạo một chức năng để hiển thị lớp phủ da
  • quan trọng là nhận được xử lý đến layout.xml, sử dụng lớp LayoutInflater để phân tích cú pháp xml để xem đối tượng, thêm chế độ xem lớp phủ vào cấu trúc bố cục hiện tại
  • Ví dụ của tôi sử dụng bộ đếm thời gian để phá hủy đối tượng lớp phủ bằng cách loại bỏ hoàn toàn nó khỏi cấu trúc chế độ xem. Đây có lẽ là điều bạn muốn để loại bỏ nó mà không để lại dấu vết.

Mục tiêu của tôi là các hoạt động chính không nhận biết được bất kỳ lớp phủ nào, các lớp phủ đến và đi, nhiều lớp phủ khác nhau, vẫn có thể sử dụng tệp văn bản overlay1.xml làm mẫu và nội dung phải được cập nhật theo chương trình. Tôi thực hiện khá nhiều những gì CommonsWare đã nói với chúng tôi bài đăng của tôi hiển thị mã chương trình thực tế để bắt đầu.

tuyên bố từ chối trách nhiệm: OPs "Cảm ơn bạn đã đóng góp ý kiến. Đây là cách tôi hình dung nó đang được thực hiện. Tôi phải ghi công cho câu trả lời bên dưới" nhận xét không có nghĩa là câu trả lời của tôi mà là câu trả lời của CommonsWare. Stackoverflow đã thay đổi các chuỗi bài đăng.

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.