Як створити допоміжний наклад, як ви бачите в кількох додатках для Android та ICS?


93

Я хочу створити довідкові накладки, як ті, які ви бачите, коли ICS завантажується вперше, або в таких програмах, як ES File Explorer або Apex Launcher (їх більше, але зараз я не можу їх думати). Це лише відносний макет з одним видом, що сидить поверх іншого? Я не зміг знайти жодного зразкового коду для подібних дій. Хтось знає, як це робиться, чи є якісь ідеї?

Провідник файлів ES Провідник файлів ES

Відповіді:


84

Припустимо, ви звичайно зателефонували б setContentView(R.layout.main), але під час першого запуску ви хочете мати цю накладку.

Крок №1: Створіть FrameLayoutкод Java та передайте його setContentView().

Крок №2: Використовуйте LayoutInflaterдля надуття R.layout.mainв FrameLayout.

Крок №3: Використовуйте, LayoutInflaterщоб надути накладку в FrameLayout.

Крок №4: Коли користувач натискає кнопку (або будь-яку іншу), щоб відхилити накладення, зателефонуйте, removeView()щоб видалити накладку з FrameLayout.

Оскільки накладене зображення є пізнішим дочірнім елементом FrameLayout, воно буде плавати над вмістом R.layout.main.


6
@ ssuperz28: Так, ну, крім мальованих наконечників стріл та міхура. Ви самі для цього. :-)
CommonsWare

Не знаю, чи вдалося вам зробити те, що хотіли, але ось інша альтернатива. stackoverflow.com/questions/8841240/… Якщо ви керуєте рішенням, запропонованим CommonsWare, єдине, що виникає у мене для встановлення стрілок, - це визначення FrameLayout інструкцій з resourceImage або backgroundImage вже із зображенням зі стрілками (та прозорість).
Едісон Сантос,

1
Чи є спосіб зробити це, але зробити це відносно позиції дітей, які знаходяться нижче від FrameLayout?
4gus71n

@CommonsWare - сер, це спрацювало б незалежно від того, який пристрій це може бути?
Rat-a-tat-a-tat Ratatouille

2
@ user3364963: Динамічно регулюйте положення речей. Моя відповідь була дещо спрощеною. Я припускаю, що вони визначають положення виділених елементів і коригують координати "знаків тренера". Користувач ViewGroupдля шару "тренерських знаків" може впоратися з цим, і є бібліотеки (наприклад, ShowcaseView), які пропонують консервовані реалізації цього шаблону.
CommonsWare

80

"Оцінка тренера" ​​- це "Довідка накладання" в розмові про UX :-)

coach_mark.xml - це ваш макет коуча

coach_mark_master_view - ідентифікатор самого верхнього виду (root) у 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();
}

Додавання зразка coach_mark.xml (до цього відмінного рішення, наданого Одідом Брейнером), тому його легко копіювати та вставляти в ppl, щоб швидко переглянути робочий приклад.

Зразок coach_mark.xml тут, змініть -> drawable / coach_marks на ваше зображення:

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>

І необов'язково використовувати цю тему для видалення прокладки:

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

Привіт, як можна розтягнути цей діалог, щоб він відповідав екрану? З документації, A dialog is a small window that prompts [...]. A dialog does not fill the screen and is normally used for modal events [...].. Якщо я використовую цей код, я моє головне подання стискається на невеликій частині екрана. Якщо я встановив android:layout_width="640dp" android:layout_height="480dp"(тобто фактичні значення екрана, на якому я тестую), він працює правильно. (звичайно, це не можливе рішення)
окламот

@ocramot: наведений вище приклад повинен бути на весь екран через match_parent та Window.FEATURE_NO_TITLE
Breiner

Тоді має бути якась інша проблема, бо я бачу це по-іншому
окрамот

1
Я знаю, що цьому щонайменше кілька місяців, але чи з’ясовувалось це питання на весь екран?
cbhedd

3
Тим, хто не знає, як встановити тему діалогу, просто new Dialog(getContext(), R.style.WalkthroughTheme);
започаткуйте

4

Це можна зробити досить швидко. Ви, наприклад, додаєте LinearLayout, де ви розміщуєте зображення з альфа-альфами, які відповідають вашій довідковій інформації та що ви хочете намалювати як накладку. У xml своєї діяльності ви розміщуєте цей макет у RelativeLayout після макета вашої діяльності з видимістю Gone. Коли ви хочете намалювати довідкову інформацію, вам просто потрібно встановити видимість на видиму.

Я сподіваюся, я зрозумів, якщо у вас виникнуть запитання, я прошу відповісти на них.


Дякуємо за ваш внесок Ось як я уявив, як це робиться. Я повинен віддати належне нижченаведеній відповіді, хоча саме таким чином я буду її будувати. Це здається більш керованим, і мені не потрібно змінювати макет своєї основної діяльності.
ssuperz28

1

Дивіться ще одну відповідь про те, як програмно відображати макет накладки поверх поточної активності. Layout.xml діяльності не повинен нічого знати про шкіру, що накладається. Ви можете розмістити напівпрозорий накладку, охопити лише частину екрана, одне або кілька перегляду тексту та кнопки на ньому ... Як програмно накладати кнопку?

  • створіть шаблон res / layout / paused.xml RelativeLayout або використовуйте будь-який макет рівня
  • створити функцію для відображення накладеної шкіри
  • Ключ - отримати ручку до layout.xml, використовувати клас LayoutInflater для розбору xml для перегляду об’єкта, додавання перегляду накладання в поточну структуру макета
  • Мій приклад використовує таймер, щоб знищити накладений об'єкт, повністю видаливши його зі структури подання. Це, мабуть, те, що ви хочете, а також позбутися від нього безслідно.

Моєю метою було те, що основні дії не знають жодної накладної обкладинки, накладання приходять і зникають, багато різних накладок, все ще можуть використовувати текстові файли overlay1.xml як шаблон, а вміст повинен програмно оновлюватися. Я дуже багато того, що CommonsWare сказав нам, що моя публікація показує фактичний код програми для початку.

відмова від відповідальності: ОП "Дякую за ваш внесок. Ось як я уявив, що це робиться. Я повинен дати кредит відповіді нижче", коментар не означає мою відповідь, але відповідь CommonsWare. Stackoverflow змінив замовлення після публікації.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.