【问题标题】:How do I create a help overlay like you see in a few Android apps and ICS?如何创建像您在一些 Android 应用程序和 ICS 中看到的帮助叠加层?
【发布时间】:2012-04-30 07:26:27
【问题描述】:

我想要创建帮助覆盖,就像您在首次加载 ICS 时看到的那样,或者在 ES File Explorer 或 Apex Launcher 等应用程序中看到的那样(还有更多,但我现在想不起来)。这只是一种相对布局,一个视图位于另一个视图之上吗?我还没有找到任何示例代码来做这样的事情。有人知道这是怎么做到的或有什么想法吗?

【问题讨论】:

    标签: android


    【解决方案1】:

    你可以很快地做到这一点。例如,您添加了一个 LinearLayout,您可以在其中放置一张带有 alpha 的图片,该图片对应于您的帮助信息以及您想要像叠加层一样绘制什么。在您的活动的 xml 中,您将此布局放在具有“消失”可见性的活动布局之后的 RelativeLayout 中。当您要绘制帮助信息时,只需将此可见性设置为可见即可。

    我希望,我很清楚,如果您有任何问题,我很乐意回答他们。

    【讨论】:

    • 感谢您的意见。这就是我想象它正在完成的方式。我必须对下面的答案表示赞赏,因为这就是我要构建它的方式。它似乎更易于管理,我不必更改我的主要活动布局。
    【解决方案2】:

    假设您通常会调用setContentView(R.layout.main),但在第一次运行时,您希望拥有此叠加层。

    第 1 步:在 Java 代码中创建一个 FrameLayout 并将其传递给 setContentView()

    步骤#2:使用LayoutInflaterR.layout.main 膨胀为FrameLayout

    第 3 步:使用 LayoutInflater 将叠加层膨胀到 FrameLayout

    第 4 步:当用户点击按钮(或其他)以关闭覆盖时,调用 removeView() 以从 FrameLayout 中删除覆盖。

    由于覆盖是FrameLayout 的后一个子代,它会浮在R.layout.main 的内容之上。

    【讨论】:

    • @ssuperz28:是的,好吧,除了手绘箭头和气泡。你要靠你自己。 :-)
    • 我不知道你是否能做到你想要的,但这里有另一种选择。 @ 987654321@ 如果您维护CommonsWare 给出的解决方案,我唯一要设置箭头的就是使用带有箭头(和透明度)的图像定义带有resourceImage 或backgroundImage 指令的FrameLayout。
    • 有没有办法做到这一点,但相对于 FrameLayout 下面的孩子的位置?
    • @CommonsWare - 先生,不管它是什么设备,这都可以工作吗?
    • @user3364963:动态调整事物的位置。我的回答有些简化。我假设他们确定要突出显示的元素的位置并调整“教练标记”的坐标。 “教练标记”层的自定义 ViewGroup 可以处理这个问题,并且有一些库(例如,ShowcaseView)提供该模式的固定实现。
    【解决方案3】:

    请参阅我的另一个答案,如何以编程方式在当前活动之上显示覆盖布局。 Activity 的 layout.xml 不需要知道关于覆盖皮肤的任何信息。您可以将覆盖半透明,仅覆盖屏幕的一部分,一个或多个文本视图和按钮...... How to overlay a button programmically?

    • 创建 res/layout/paused.xml RelativeLayout 模板或使用任何顶层布局
    • 创建一个显示叠加皮肤的函数
    • 关键是获取 layout.xml 的句柄,使用 LayoutInflater 类解析 xml 以查看对象,将叠加视图添加到当前布局结构中
    • 我的示例使用计时器通过从视图结构中完全删除覆盖对象来销毁它。这可能也是你想要摆脱它而不留痕迹的东西。

    我的目标是主要活动不知道任何覆盖皮肤,覆盖来来去去,许多不同的覆盖,仍然能够使用overlay1.xml文本文件作为模板,并且内容应该以编程方式更新。我做了 CommonsWare 告诉我们的事情,我的帖子显示了实际的程序代码以开始使用。

    免责声明:OP“感谢您的意见。这就是我想象的完成方式。我必须感谢下面的答案”评论并不意味着我的答案,而是 CommonsWare 的答案。 Stackoverflow 已更改帖子排序。

    【讨论】:

      【解决方案4】:

      “Coach mark”在 UX talk 中是“Help overlay” :-)

      coach_mark.xml 是您的教练标记布局

      coach_mark_master_viewcoach_mark.xml

      中最顶层视图(根)的 id
      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 给出的这个出色的解决方案),以便人们可以轻松地复制和粘贴以快速查看工作示例。

      这里是 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 : 由于 match_parent 和 Window.FEATURE_NO_TITLE,上面的例子应该是全屏的
      • 那肯定有其他问题,因为我看到的方式不同
      • 我知道这至少有几个月的历史了,但这个全屏问题有没有得到解决?
      • 对于那些不知道如何设置对话框主题的人,只需像这样实例化对话框:new Dialog(getContext(), R.style.WalkthroughTheme);
      猜你喜欢
      • 1970-01-01
      • 2016-10-17
      • 1970-01-01
      • 1970-01-01
      • 2020-03-26
      • 1970-01-01
      • 2015-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多