Android ShowCaseView渲染不正确

Android ShowCaseView渲染不正确,android,android-layout,android-activity,android-view,Android,Android Layout,Android Activity,Android View,我正在我的android应用程序中使用showCaseView legacy(它有手的动画)。但是,这个手势似乎并没有开始与视图“相对”。相反,它似乎是绝对的屏幕。以下是我正在使用的: final ShowcaseView sv; ShowcaseView.ConfigOptions co = new ShowcaseView.ConfigOptions(); co.hideOnClickOutside = false; co.block=true;

我正在我的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


问题出在哪里?

您最好的选择可能是使用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);

我也遇到了同样的问题,通过记录showcase在不同阶段的位置,我发现在调用show()后的一段时间(非常短)内,会奇怪地计算出正确的位置。 当我打电话的时候

showcaseView.show();
showcaseView.animateGesture(0, 0, 0, -400);
这不管用

简单的解决方案是延迟显示手势(在我的案例中,200毫秒就足够了——在许多设备上都进行了测试):


这将在我的oncreate()中返回0。您在onResume()期间尝试过吗?根据这一点,onCreate不是执行此操作的合适位置,您应该在生命周期的稍后阶段尝试。它是0,因为尚未绘制视图。圆是否正确显示为R.id.pen?您使用的配置选项是什么?我使用的是INSERT_to_DECOR。您也在其他设备或模拟器上尝试过吗?我从未使用过Genymotion我真的不能告诉你它是如何处理测量的。
showcaseView.show();
showcaseView.postDelayed(new Runnable() {
    @Override
    public void run() {
        showcaseView.animateGesture(0, 0, 0, -400);
    }
}, 200);