ฉันจะสร้างการซ้อนทับความช่วยเหลืออย่างที่คุณเห็นในแอป Android และ ICS บางตัวได้อย่างไร


93

ฉันต้องการสร้างการซ้อนทับความช่วยเหลือเช่นเดียวกับที่คุณเห็นเมื่อ ICS โหลดเป็นครั้งแรกหรือในแอปเช่น ES File Explorer หรือ Apex Launcher (มีมากกว่านี้ แต่ฉันคิดไม่ออกในตอนนี้) นี่เป็นเพียงเลย์เอาต์แบบสัมพัทธ์กับมุมมองหนึ่งที่ซ้อนทับกันหรือไม่? ฉันไม่พบโค้ดตัวอย่างสำหรับการทำสิ่งนั้น ใครทราบวิธีนี้หรือมีความคิดใด ๆ

ES File Explorer ES File Explorer

คำตอบ:


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 ที่มีรูปภาพพร้อมลูกศรอยู่แล้ว (และความโปร่งใส)
Edison Santos

1
มีวิธีการทำเช่นนี้ แต่ให้เทียบกับตำแหน่งของเด็กที่อยู่ด้านล่างจาก FrameLayout หรือไม่?
4gus71 น

@CommonsWare - ครับสิ่งนี้จะใช้งานได้ไม่ว่าจะเป็นอุปกรณ์ใดก็ตาม
Rat-a-tat-a-tat Ratatouille

2
@ user3364963: ปรับตำแหน่งของสิ่งต่างๆแบบไดนามิก คำตอบของฉันค่อนข้างง่าย ฉันคิดว่าพวกเขากำหนดตำแหน่งขององค์ประกอบที่จะเน้นและปรับพิกัดของ "เครื่องหมายโค้ช" แบบกำหนดเองViewGroupสำหรับเลเยอร์ "เครื่องหมายโค้ช" สามารถจัดการได้และมีไลบรารี (เช่นShowcaseView) ที่นำเสนอการใช้งานรูปแบบนั้น
CommonsWare

80

"Coach mark" คือ "Help overlay" ใน UX talk :-)

coach_mark.xmlคือรูปแบบเครื่องหมายโค้ชของคุณ

coach_mark_master_viewคือ id ของมุมมองสูงสุดอันดับต้น ๆ (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 (ลงในโซลูชันที่ยอดเยี่ยมนี้มอบให้โดย Oded Breiner) ดังนั้นจึงเป็นเรื่องง่ายสำหรับ 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>

สวัสดีคุณจะยืด Dialog นี้ให้เข้ากับหน้าจอได้อย่างไร? จากเอกสารประกอบ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

@ocramot: ตัวอย่างด้านบนควรเป็นแบบเต็มหน้าจอเนื่องจาก match_parent และ Window FEATURE_NO_TITLE
Oded Breiner

ถ้าอย่างนั้นมันต้องมีปัญหาอื่นแน่ ๆ เพราะฉันเห็นมันในทางที่แตกต่างออกไป
ocramot

1
ฉันรู้ว่านี่เป็นเวลาอย่างน้อยสองสามเดือน แต่คำถามแบบเต็มหน้าจอนั้นเคยคิดออกหรือไม่
cbhedd

3
สำหรับผู้ที่ไม่ทราบวิธีตั้งค่าธีมของกล่องโต้ตอบเพียงแค่สร้างอินสแตนซ์ของกล่องโต้ตอบดังนี้:new Dialog(getContext(), R.style.WalkthroughTheme);
w3bshark

4

คุณสามารถทำได้อย่างรวดเร็ว คุณเพิ่มตัวอย่าง LinearLayout ที่คุณใส่รูปภาพด้วยอัลฟ่าซึ่งตรงกับข้อมูลความช่วยเหลือของคุณและสิ่งที่คุณต้องการวาดเช่นภาพซ้อนทับ ใน xml ของกิจกรรมของคุณคุณวางเค้าโครงนี้ไว้ใน RelativeLayout หลังจากเค้าโครงของกิจกรรมของคุณด้วยการเปิดเผย Gone เมื่อคุณต้องการดึงข้อมูลความช่วยเหลือคุณเพียงแค่ตั้งค่าการเปิดเผยนี้ให้มองเห็นได้

ฉันหวังว่าฉันจะชัดเจนถ้าคุณมีคำถามใด ๆ ฉันจะช่วยตอบพวกเขา


ขอบคุณสำหรับข้อมูลของคุณ นี่คือสิ่งที่ฉันนึกภาพออก ฉันต้องให้เครดิตกับคำตอบด้านล่างแม้ว่านั่นคือวิธีที่ฉันจะสร้างมันขึ้นมา ดูเหมือนจะจัดการได้ง่ายกว่าและฉันไม่จำเป็นต้องปรับเปลี่ยนรูปแบบกิจกรรมหลักของฉัน
ssuperz28

1

ดูคำตอบอื่นของฉันว่าจะแสดงเลย์เอาต์ภาพซ้อนทับบนกิจกรรมปัจจุบันอย่างไรโดยทางโปรแกรม layout.xml ของกิจกรรมไม่จำเป็นต้องรู้อะไรเกี่ยวกับสกินโอเวอร์เลย์ คุณสามารถวางซ้อนทับแบบกึ่งโปร่งใสครอบคลุมเฉพาะบางส่วนของหน้าจอมุมมองข้อความและปุ่มอย่างน้อยหนึ่งปุ่ม ... จะวางซ้อนปุ่มโดยใช้โปรแกรมได้อย่างไร?

  • สร้างเทมเพลต res / layout / paused.xml RelativeLayout หรือใช้ระดับเลย์เอาต์ใด ๆ
  • สร้างฟังก์ชันเพื่อแสดงสกินซ้อนทับ
  • กุญแจสำคัญคือการจัดการกับ layout.xml ใช้คลาส LayoutInflater เพื่อแยกวิเคราะห์ xml เพื่อดูวัตถุเพิ่มมุมมองซ้อนทับให้กับโครงสร้างเค้าโครงปัจจุบัน
  • ตัวอย่างของฉันใช้ตัวจับเวลาเพื่อทำลายวัตถุซ้อนทับโดยการลบออกจากโครงสร้างมุมมองทั้งหมด นี่อาจเป็นสิ่งที่คุณต้องการเช่นกันเพื่อกำจัดมันอย่างไร้ร่องรอย

เป้าหมายของฉันคือกิจกรรมหลักไม่ทราบถึงสกินซ้อนทับใด ๆ ภาพซ้อนทับไปมาและมีภาพซ้อนทับที่แตกต่างกันมากมายยังคงสามารถใช้ไฟล์ข้อความ overlay1.xml เป็นเทมเพลตได้และเนื้อหาควรได้รับการอัปเดตโดยทางโปรแกรม ฉันทำในสิ่งที่ CommonsWare บอกเราว่าโพสต์ของฉันแสดงรหัสโปรแกรมจริงเพื่อเริ่มต้น

ข้อจำกัดความรับผิดชอบ: OPs "ขอบคุณสำหรับข้อมูลของคุณนี่คือสิ่งที่ฉันนึกภาพให้เสร็จฉันต้องให้เครดิตกับคำตอบด้านล่าง" ความคิดเห็นไม่ได้หมายถึงคำตอบของฉัน แต่เป็นคำตอบของ CommonsWare Stackoverflow เปลี่ยนลำดับการโพสต์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.