Android 如何在棒棒糖中使用setOutlineProvider代替setOutline

Android 如何在棒棒糖中使用setOutlineProvider代替setOutline,android,android-layout,android-5.0-lollipop,material-design,android-appcompat,Android,Android Layout,Android 5.0 Lollipop,Material Design,Android Appcompat,对于早期的L预览,有如下所示的一些示例可以添加到代码中,以便使用FAB(浮动操作按钮) 但不幸的是,由于不再支持setOutline方法,我无法使用相同的代码实现FAB,但它似乎已被替代方法“FAB.setOutlineProvider(ViewOutlineProvider);”所取代。谁能解释一下怎么用这个吗 这可能是我错过的一些非常简单的事情,但任何帮助都将不胜感激 // Outline int size = getResources().getDimensionPixelSize(R.d

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

但不幸的是,由于不再支持setOutline方法,我无法使用相同的代码实现FAB,但它似乎已被替代方法“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);
Per:

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

因此,您的
ViewOutlineProvider
只需在
outline
参数上调用
setOval(0,0,size,size)
,以
getOutline()


只需完成@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);

每个视图都有一个Outline对象和一个ViewOutlineProvider(V.O.p)对象。 顾名思义,viewoutlineprovider间接向视图提供轮廓

视图所做的是将其outline对象传递给V.O.p,V.O.p会更新它

因此,在VOP的getOutline方法中将视图的Outline对象作为参数,只需更新它即可

ViewOutlineProvider viewOutlineProvider = new ViewOutlineProvider() {
    @Override
    public void getOutline(View view, Outline outline) {
        outline.setOval(0, 0, view.getWidth(), view.getHeight());
    }
};
fab.setOutlineProvider(viewOutlineProvider);

您还应该事先检查设备的当前版本,因为这种方法只有在android L之后才受支持。它到底做什么?显示视图的正确阴影?@androiddeveloper-没错。默认情况下,阴影是使用视图的边界投射的,这对于填充整个边界的不透明矩形视图非常有效,但对于(在本例中)圆形视图显然不是这样。那么,如果我的视图有一个奇怪的形状,或者视图改变了形状,应该使用什么呢?@androiddeveloper-您可以使用设置任意路径。如果视图动态更改形状,并且希望更新大纲,则可以随时调用。api 21之前的版本如何?
ViewOutlineProvider viewOutlineProvider = new ViewOutlineProvider() {
    @Override
    public void getOutline(View view, Outline outline) {
        outline.setOval(0, 0, view.getWidth(), view.getHeight());
    }
};
fab.setOutlineProvider(viewOutlineProvider);