Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use setOutlineProvider instead of setOutline in Lollipop

For the earlier L Preview there were some examples like shown below to add to your code in order to use an FAB (Floating Action Button).

But unfortunately I can't use that same code to implement an FAB due to the setOutline method not being supported anymore, but it appears to have been replaced by an alternative method 'fab.setOutlineProvider(ViewOutlineProvider);'. could anyone explain how to use this?...

It is probably something really simple that I am missing, but any help would be much appreciated.

// 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);
like image 839
Smiler Avatar asked Oct 20 '14 18:10

Smiler


3 Answers

Just to complete the @ianhanniballake answer:

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);
like image 69
Gabriele Mariotti Avatar answered Dec 01 '22 00:12

Gabriele Mariotti


Per customizing view shadows and outlines training:

You can create oval and rectangular outlines with rounded corners using the methods in the Outline class. The default outline provider for views obtains the outline from the view's background. To prevent a view from casting a shadow, set its outline provider to null.

So your ViewOutlineProvider just needs to call setOval(0, 0, size, size) on the outline parameter to 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);
}
like image 38
ianhanniballake Avatar answered Nov 30 '22 22:11

ianhanniballake


Every View has an Outline object and a ViewOutlineProvider(V.O.P) object. As the name suggest viewoutlineprovider provides the outline to the view indirectly.

What the view does is it passes its outline object to the V.O.P and the V.O.P updates it.

so you have the view's Outline object in the getOutline method of the VOP as a parameter,simply update it.

ViewOutlineProvider viewOutlineProvider = new ViewOutlineProvider() {
    @Override
    public void getOutline(View view, Outline outline) {
        outline.setOval(0, 0, view.getWidth(), view.getHeight());
    }
};
fab.setOutlineProvider(viewOutlineProvider);
like image 32
arjun Avatar answered Dec 01 '22 00:12

arjun