如何在Lollipop中使用setOutlineProvider而不是setOutline

Smi*_*ler 11 android android-appcompat android-layout material-design android-5.0-lollipop

对于早期的L Preview,有一些示例如下所示添加到您的代码中以使用FAB(浮动操作按钮).

但不幸的是,我不能使用相同的代码来实现FAB,因为不再支持setOutline方法,但它似乎已被替代方法'fab.setOutlineProvider(ViewOutlineProvider);'所取代.任何人都可以解释如何使用它?...

这可能是我想念的非常简单,但任何帮助都会非常感激.

// Outline
int size = getResources().getDimensionPixelSize(R.dimen.fab_size);
Outline outline = new Outline();
outline.setOval(0, 0, size, size);

Button fab = (Button) findViewById(R.id.fab);
fab.setOutline(outline);
fab.setClipToOutline(true);
Run Code Online (Sandbox Code Playgroud)

Gab*_*tti 29

只是为了完成@ianhanniballake答案:

Button fab = (Button) findViewById(R.id.fab);
//Outline outline = new Outline();
//outline.setOval(0, 0, size, size);
//fab.setOutline(outline);  
ViewOutlineProvider viewOutlineProvider = new ViewOutlineProvider() {
        @Override
        public void getOutline(View view, Outline outline) {
            // Or read size directly from the view's width/height
            int size = getResources().getDimensionPixelSize(R.dimen.fab_size);
            outline.setOval(0, 0, size, size);
        }
    };
fab.setOutlineProvider(viewOutlineProvider);
Run Code Online (Sandbox Code Playgroud)

  • 您还应事先检查设备的当前版本,因为此方法仅在android L.之后支持. (4认同)

ian*_*ake 11

每个自定义视图阴影和概述训练:

您可以使用Outline类中的方法创建带圆角的椭圆和矩形轮廓.视图的默认大纲提供程序从视图的背景中获取大纲.要防止视图投射阴影,请将其大纲提供程序设置为null.

所以,你ViewOutlineProvider只需要调用setOval(0, 0, size, size)outline参数getOutline():

public void getOutline (View view, Outline outline) {
    // Or read size directly from the view's width/height
    int size = getResources().getDimensionPixelSize(R.dimen.fab_size);
    outline.setOval(0, 0, size, size);
}
Run Code Online (Sandbox Code Playgroud)

  • @androiddeveloper - 您可以使用[setConvexPath()]设置任意路径(https://developer.android.com/reference/android/graphics/Outline.html#setConvexPath(android.graphics.Path)).如果您的视图动态更改形状并且您希望更新大纲,则可以随时调用[invalidateOutline](https://developer.android.com/reference/android/view/View.html#invalidateOutline()). (3认同)
  • @androiddeveloper - 这是正确的.默认情况下,阴影使用视图的边界进行投射,这对于填充整个边界的不透明矩形视图非常有用,但显然不是(在这种情况下)圆形视图. (2认同)