2016-04-19 24 views
8

ho un AppCompatButton definito in un file XML di layout, e mi hanno fissato un tema per così:Styling un AppCompatButton in v21 avere nessuna ombra e angolo raggio pari a zero

android:theme="@style/CustomAccentOverlay"

E ho impostato:

android:stateListAnimator="@null"

per rimuovere l'ombra. Ho due problemi con questo.

L'altezza del pulsante viene detratta dall'altezza dell'ombra, anche se l'ombra non viene visualizzata. Dovrei rimuovere l'ombra in qualche altro modo, o come posso risolvere questo?

Il pulsante ha gli angoli arrotondati e desidero che gli angoli siano nitidi. Non riesco a impostare uno sfondo sul pulsante, perché voglio mantenere l'effetto di ripple standard e questo va via se si imposta uno sfondo (almeno non so come mantenerlo se imposto uno sfondo). Ho provato a fissare

<item name="android:bottomLeftRadius">0dp</item>

e tutti gli altri angoli al tema CustomAccentOverlay ed anche il suo stile corrispondente, ma non funziona. Come posso impostare il raggio dell'angolo a zero sul mio pulsante?

Grazie
Søren

+0

Puoi pubblicare un'immagine del pulsante che si desidera visualizzare? –

risposta

5

utilizzare il seguente codice per il pulsante.

<android.support.v7.widget.AppCompatButton 
android:layout_width="200dp" 
android:layout_height="200dp" 
android:text="Button" 
android:stateListAnimator="@null" 
android:elevation="0dp" 
android:background="@android:color/darker_gray" 
android:foreground="?attr/selectableItemBackground" 
/> 

Spiegherò gli attributi.

  1. android: elevation = "0dp" e android: stateListAnimator = "@ null". Nessuna ombra per il pulsante.

  2. android: sfondo. Imposta il colore desiderato come sfondo. Rimuove gli angoli arrotondati.

  3. android: foreground = "? Attr/selectableItemBackground". Dà l'effetto a catena quando si preme il pulsante.

Update 1:

Sembra che Android: l'attributo di primo piano per View lavora da API 23. Per le API di seguito, creare un drawable con ripple nella cartella drawable-V21 e impostarla come sfondo per il pulsante,

<ripple 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:ignore="NewApi" 
    android:color="@color/ripple_color"> 

    <item android:drawable="@color/normal_state_button_background_color"/> 

</ripple> 

Per le versioni pre Lollipop, creare un drawable con selettore nella cartella drawable con lo stesso nome.

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@drawable/pressed_color" 
      android:state_pressed="true" /> 
    <item android:drawable="@drawable/focused_color" 
      android:state_focused="true" /> 
    <item android:drawable="@drawable/normal_color" /> 
</selector> 
+0

ripple non mostra –

+0

puoi provarlo nel dispositivo Marshmallow. – Bob

+0

Ho provato il lecca-lecca! –

2

Prima domanda: come rimuovere l'ombra di un tasto?

ecco la risposta: Basta aggiungere questo attributo al pulsante

android:stateListAnimator="@null" 

Seconda domanda: Come fare un angolo del tasto tagliente senza perdere l'effetto a catena standard. Ecco la risposta: Ma prima devi creare due file drawble con lo stesso nome ma uno per sotto api 21 e uno per api> 21 perché l'ondulazione è disponibile solo api> 21. Ora sto mostrando come creare that.Read il seguente testo con attenzione

Fare clic destro sulla cartella drawble e scegliere nuovo e "file di risorse drawble" e premi il prossimo quindi denominare il drawble ciò che ti piace e premere click ok.Then di nuovo a destra sulla drawble cartella e scegli il nuovo e "File delle risorse selezionabili" e premi Avanti e dai il nome al drawble esattamente quello che hai chiamato la precedente cartella drawble ma questa volta in basso puoi vedere una sezione chiamata "qualificatori disponibili". Vai su questa sezione e proprio al in basso puoi vedere "Versione", cliccaci e poi puoi vedere un'icona a forma di freccia sulla destra, fare clic su di essa, quindi su "Platform api level" aggiungi 21 e quindi premi OK. Ora, se espandi la cartella Drawble, puoi vedere due file del file drawble creato. Una volta per API che è inferiore a 21 e una volta per parte superiore del file drawble 21.Open che si è creato e assicurarsi che si apre che hanno "(V21)" alla last.Now cancellare tutto da lì e aggiungere il seguente codice

<?xml version="1.0" encoding="utf-8"?> 
<ripple android:color="?attr/colorControlHighlight" xmlns:android="http://schemas.android.com/apk/res/android"> 

<item> 
    <shape> 
     <corners android:radius="0dp"/> 
     <solid android:color="#D6D7D7"/> 
    </shape> 
</item> 

</ripple> 

e aggiungere questo attributo al pulsante

android:background="@drawable/youdrawblefilethatyouhavecreated" 

e ora se si esegue l'applicazione si può vedere che non c'è ombra e il pulsante ha angolo acuto, e se si fa clic sul Rippl e si presenta.

Infine, il pulsante simile a questo

<android.support.v7.widget.AppCompatButton 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="New Button 1" 
    android:background="@drawable/yourcreatddrawblefile" 
    android:stateListAnimator="@null"/> 

Spero che questo aiuto!

3

Sembra davvero che tu voglia utilizzare una TextView cliccabile piuttosto che un pulsante. TextView di default non ha ombra e ha angoli acuti e puoi allegare un click listener ad esso. Ricorda, Button è solo un fantastico TextView con molti componenti aggiuntivi visivi e sembra che tu voglia rimuoverlo parecchio.

Se si desidera mantenere il ripple sulla TextView e definire il proprio sfondo, impostare android:foreground="?attr/selectableItemBackground"

EDIT: Anche se l'altra risposta è stata segnata accettato, sarei ancora sostenere che il PO dovrebbe usare un TextView con un click listener e applicando gli effetti di ripple a quello dell'uso di un pulsante. Le visualizzazioni di testo selezionabili in questo modo sono esattamente come l'app Google I/O implementa tutti i pulsanti piatti che soddisfano le specifiche di Material Design.

+0

in primo piano attributo non funzionerebbe sotto API 23. – Bob

+0

Hai ragione, creare il ripple personalizzato disegnabile con il fallback pre-lecca-lecca (come hai detto sopra) è quello che faccio. Raccomando comunque una TextView su un pulsante a questo punto, ma il modo in cui gestisci il ripple è corretto. – ekchang

0

Usa questo codice

<android.support.v7.widget.AppCompatButton 
    android:layout_width="match_parent" 
    android:layout_height="50dp" 
    android:background="@color/colorAccent" 
    android:text="@string/button" />