8

Per l'anteprima L precedente c'erano alcuni esempi come mostrato di seguito da aggiungere al codice per utilizzare un FAB (Floating Action Button).Come utilizzare setOutlineProvider invece di setOutline in Lollipop

Ma sfortunatamente non posso usare lo stesso codice per implementare un FAB a causa del fatto che il metodo setOutline non è più supportato, ma sembra essere stato sostituito da un metodo alternativo 'fab.setOutlineProvider (ViewOutlineProvider);'. Qualcuno potrebbe spiegare come utilizzare questo? ...

È probabilmente qualcosa di molto semplice che mi manca, ma qualsiasi aiuto sarebbe molto apprezzato.

// 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); 

risposta

27

Giusto per completare la risposta @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); 
+2

Dovresti anche controllare, in anticipo, la versione corrente del dispositivo, in quanto questo metodo è supportato solo dopo Android L. – russellhoff

9

Per customizing view shadows and outlines training:

È possibile creare ovale e rettangolare con angoli arrotondati contorni utilizzando i metodi nella classe Outline. Il provider di profili predefinito per le viste ottiene il profilo dallo sfondo della vista. Per impedire a una vista di proiettare un'ombra, impostare il proprio fornitore di contorni su null.

Così il vostro ViewOutlineProvider ha solo bisogno di chiamare setOval(0, 0, size, size) sul parametro 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); 
} 
+0

che cosa fa esattamente? Mostra l'ombra corretta della vista? –

+2

@androiddeveloper: è corretto. Di default l'ombra è lanciata usando i limiti della vista, che funziona perfettamente per le viste opache rettangolari che riempiono i loro limiti, ma ovviamente non tanto per (in questo caso) viste circolari. – ianhanniballake

+0

Capisco. Quindi cosa dovrebbe essere usato se ho una forma strana per una vista o una vista che cambia forma? –