【问题标题】:Outline Provider not working anymore大纲提供程序不再工作
【发布时间】:2014-11-21 12:40:53
【问题描述】:

我正在尝试为视图设置大纲(浮动操作按钮)。 关键是它曾经工作了一段时间,所以代码没有问题也没有错误,它完美地显示了阴影。然后它不再显示出不知从何而来的影子。 我想我已经检查了与此有关的所有内容,但找不到问题。

这是我一直在处理的代码:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        ImageButton fab = (ImageButton) findViewById(R.id.fab);

        ViewOutlineProvider outlineProvider = new ViewOutlineProvider() {
            @TargetApi(Build.VERSION_CODES.LOLLIPOP)
            @Override
            public void getOutline(View view, Outline outline) {
                int fabSize = view.getHeight();
                //int fabSize = getResources().getDimensionPixelSize(R.dimen.fab_big);
                outline.setOval(0, 0, fabSize, fabSize);
            }
        };
        fab.setOutlineProvider(outlineProvider);
}

我的 fab 是一个简单的 ImageButton,以波纹为背景,在 56*56dp 内有一个图像 src(加号)。

有什么建议吗?

编辑:几天后,我会说大纲提供程序仅适用于 Button 而不适用于 ImageButton ...几个小时后将进行进一步测试。

【问题讨论】:

标签: android outline-view floating-action-button


【解决方案1】:

在您的 getOutline 方法中,您应该将 clip 设置为 outline true:

public void getOutline(View view, Outline outline) {
    int fabSize = view.getHeight();
    outline.setOval(0, 0, fabSize, fabSize);
    view.setClipToOutline(true);
}

【讨论】:

    【解决方案2】:

    你可以在不设置边距的情况下尝试这样:

    setClipToOutline(true);
    setOutlineProvider(new ViewOutlineProvider() {
        @Override
        public void getOutline(View view, Outline outline) {
            outline.setRoundRect(0, 0, view.getWidth(), view.getHeight(), cornerSize);
        }
    });
    

    否则:

    setOutlineProvider(new ViewOutlineProvider() {
      @Override
      public void getOutline(View view, Outline outline) {
        Rect rect = new Rect();
        view.getGlobalVisibleRect(rect);
        ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
        int leftMargin = layoutParams.leftMargin;
        int topMargin = layoutParams.topMargin;
        rect.set(leftMargin, topMargin, rect.right - rect.left - leftMargin, rect.bottom - rect.top - topMargin);
        outline.setOval(rect);
        view.setClipToOutline(true);
      }
    });
    

    并将这个 View 添加到 ViewGroup 作为其父级。

    【讨论】:

      猜你喜欢
      • 2023-03-26
      • 2012-07-06
      • 1970-01-01
      • 2012-10-18
      • 1970-01-01
      • 1970-01-01
      • 2012-04-12
      • 1970-01-01
      • 2019-12-23
      相关资源
      最近更新 更多