展示查看文本重力

ara*_*ray 15 android textview showcaseview

有没有办法在Showcase视图中设置Title和Message的位置?我看到库使用函数来找到最佳位置,但我想覆盖它.

Sad*_*egh 8

我只是深入研究了ShowcaseView源代码,似乎没有办法设置文本位置.所以我在库中添加了自己的修改.以下是我所做的更改:

在课堂上ShowcaseView添加了以下字段:

private boolean hasManualPostion = false;
private int xPosition, yPosition, width;
Run Code Online (Sandbox Code Playgroud)

然后在Builder类中的内部类中ShowcaseView添加以下方法:

        public Builder hasManualPosition(boolean hasManualPosition) {
        showcaseView.hasManualPostion = hasManualPosition;
        return this;
    }

    public Builder xPostion(int xPostion) {
        showcaseView.xPosition = xPostion;
        return this;
    }

    public Builder yPostion(int yPostion) {
        showcaseView.yPosition = yPostion;
        return this;
    }
Run Code Online (Sandbox Code Playgroud)

之后,将此方法添加到TextDrawer类中:

public void setTestPostionManually(int xPosition, int yPosition) {
    mBestTextPosition[0] = xPosition;
    mBestTextPosition[1] = yPosition;
}
Run Code Online (Sandbox Code Playgroud)

并在最后改变onPreDraw方法,ShowcaseView看起来像这样:

    @Override
public boolean onPreDraw() {
    boolean recalculatedCling = showcaseAreaCalculator.calculateShowcaseRect(showcaseX, showcaseY, showcaseDrawer);
    boolean recalculateText = recalculatedCling || hasAlteredText;
    if (recalculateText) {
        textDrawer.calculateTextPosition(getMeasuredWidth(), getMeasuredHeight(), this, shouldCentreText);
        if (hasManualPostion) {
            textDrawer.setTestPostionManually(xPosition, yPosition);
        }
    }
    hasAlteredText = false;
    return true;
}
Run Code Online (Sandbox Code Playgroud)

现在你应该ShowcaseView像这样创建:

sv = new ShowcaseView.Builder(this, true)
                .setTarget(target)
                .setContentTitle(R.string.showcase_main_title)
                .setContentText(R.string.showcase_main_message)
                .setStyle(R.style.CustomShowcaseTheme2)
                .setShowcaseEventListener(this)
                .hasManualPosition(true)
                .xPostion(0)
                .yPostion(240)
                .build();
Run Code Online (Sandbox Code Playgroud)

请享用!

  • 你不能将它传递给onPreDraw ...你如何在没有测试的情况下编写类似的内容并将其交给提问者 (2认同)