【问题标题】:ShowCaseView Incorrectly renderingShowCaseView 渲染不正确
【发布时间】:2023-11-27 10:48:02
【问题描述】:

我在我的 android 应用程序中使用 showCaseView legacy(具有手部动画)。但是,手势似乎并没有开始“相对”于视图。相反,它似乎是绝对的屏幕。这是我正在使用的以下内容:

 final ShowcaseView sv;
      ShowcaseView.ConfigOptions co = new ShowcaseView.ConfigOptions();
      co.hideOnClickOutside = false;
    co.block=true;
      sv = ShowcaseView.insertShowcaseView(R.id.pen, this," R.string.showcase_title"," R.string.showcase_message", co);
      View v=(View)findViewById(R.id.pen);
     sv.animateGesture(0, 0, 0, -500, false);

这是我的模拟器的顶部,动画从这里开始: 这会在屏幕的左上角显示一只手。 (我的猜测是视图的位置被返回 0。

有什么问题?

【问题讨论】:

    标签: android android-layout android-activity android-view


    【解决方案1】:

    您最好的选择可能是使用 DisplayMetrics 来放置手,这就是我所做的,并且似乎效果很好。

    DisplayMetrics displaymetrics = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); 
    int height = displaymetrics.heightPixels;
            int width = displaymetrics.widthPixels;
    
            float offsetEndY = height / 2 + 50;
            float offsetEndX = -width;
            float offsetStartY = height / 2 + 50;
            float offsetStartX = -width / 2;
    
            if (sv == null) {
    
                sv = ShowcaseView.insertShowcaseView(width, 0, activity, "Menu", "Swipe to access more options", mOptions)
                        .setTextColors(Color.BLUE, Color.BLACK);
                sv.animateGesture(offsetStartX, offsetStartY, offsetEndX, offsetEndY);
    

    【讨论】:

    • 这在我的 oncreate() 中返回 0
    • 您在 onResume() 期间尝试过吗?根据这个developer.android.com/guide/components/activities.html onCreate 不是执行此操作的正确位置,您应该在生命周期的后期尝试。为 0,因为视图尚未绘制。
    • R.id.pen 的圆圈是否正确显示?你使用什么配置选项?我正在使用 INSERT_TO_DECOR。您还尝试过其他设备或模拟器吗?我从来没有使用过 Genymotion,所以我无法真正告诉你它是如何处理测量的。
    【解决方案2】:

    我遇到了同样的问题,我在不同阶段记录展示位置,我发现在调用 show() 后的某个(非常短的)时间奇怪地计算了正确的位置。 当我打电话时

    showcaseView.show();
    showcaseView.animateGesture(0, 0, 0, -400);
    

    这不起作用。

    简单的解决方案是延迟显示手势(在我的情况下 200 毫秒就足够了 - 在许多设备上进行了测试):

    showcaseView.show();
    showcaseView.postDelayed(new Runnable() {
        @Override
        public void run() {
            showcaseView.animateGesture(0, 0, 0, -400);
        }
    }, 200);
    

    【讨论】:

      最近更新 更多