2011-02-14 7 views
5

Sul mio dispositivo Android 2.2.2 la galleria è molto bella. Quello che mi piacerebbe fare nel mio app è premere un pulsante e poi mostrare un menu che assomiglia a questo: enter image description hereCome creare un menu di fantasia trasparente come il "menu di condivisione" nella galleria di Android?

È questo utilizzando qualsiasi Android temi/stili standard? Qualcuno sa di un codice di esempio per avere un menu come questo?

Modifica: Ho capito che si poteva imitare questo menu con una finestra di dialogo. Per semplificare le cose non sto usando un controllo ListView in questo esempio, solo una singola voce TextView per la finestra di dialogo:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:id="@+id/layout_root" 
       android:orientation="vertical" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       > 
    <TextView android:id="@+id/text" 
       android:layout_width="wrap_content" 
       android:layout_height="fill_parent" 
       android:textColor="#FFF" 
       android:padding="10dp" 
       /> 
</LinearLayout> 

Mostrando la finestra quando si preme un pulsante:

   Dialog dialog = new Dialog(MyActivity.this); 
       dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 

       dialog.setContentView(R.layout.custom_dialog); 

       TextView text = (TextView) dialog.findViewById(R.id.text); 
       text.setText("Test option 1"); 

       WindowManager.LayoutParams WMLP = dialog.getWindow().getAttributes(); 
       WMLP.gravity = (Gravity.BOTTOM | Gravity.LEFT); 
       WMLP.x = 0; 
       WMLP.y = 0; 
       dialog.getWindow().setAttributes(WMLP); 

       dialog.show(); 

Questo crea una finestra di dialogo che si avvicina al menu nella foto. Ho ancora due problemi, tuttavia:

1) Come posso disegnare questo piccolo triangolo nella parte inferiore della finestra di dialogo, come è stato fatto nella figura sopra?

2) Il pulsante che dovrebbe aprire la finestra di dialogo è posizionato orizzontalmente nel mezzo della barra dei pulsanti in basso. Quindi quando lo premo, la finestra di dialogo dovrebbe essere visualizzata proprio sopra quel pulsante. Quello che vorrei fare è questo:

WMLP.x = middleButton.getLeft() + (middleButton.getWidth()/2) - dialog.getWindow().getDecorView().getPaddingLeft() - (WMLP.width/2); 

Il problema è, che WMLP.width è -2. Immagino che il motivo sia che la larghezza del layout è impostata su "wrap_content" (che è -2) e la larghezza effettiva non è nota in questo momento. Quindi, come posso determinare la larghezza della finestra di dialogo in modo da poterla posizionare in modo concentrico su un'altra vista?

Aggiornamento: Ho finalmente trovato una grande fonte per una finestra come questa: http://www.londatiga.net/it/how-to-create-quickaction-dialog-in-android/

E 'esattamente quello che volevo e lo sto usando nella mia app ora.

+1

** Possibile duplicazione di [Modello UI Android Azioni rapide] (http://stackoverflow.com/questions/3059155/android-quick-actions-ui-pattern) e sottomenu [Condividi "Condividi"] (http://stackoverflow.com/questions/4943287/android-share-submenu)** –

+0

@vikas È una domanda diversa della prima domanda che hai trovato. Sarebbe un duplicato della seconda domanda ma non ha una buona risposta finora. –

risposta

1

È possibile eseguire questa operazione aggiungendo una finestra popup nella posizione corrente, per disegnare questo menu alla moda sarà necessario avere anche l'immagine di questo sfondo e la freccia di litle.

Inoltre, è necessario leggere il Drawable Nine-Path per ottenere questo risultato.

PS: l'ho già fatto, ma con un'altra immagine.

+1

Ma puoi mettere la punta della freccia nel punto specifico che vuoi? Si noti che in quello screenshot, la freccia non si trova nel mezzo del quadrato! –

+0

si pensava alla posizione del componente di ancoraggio. Fai 2 disegni per farlo, prima il rettangolo e poi la freccia nella posizione specificata. –

0

sulla finestra

3 opzioni:

  1. chi disegnare il triangolo (in realtà, penso che sia un quadrato con angoli arrotondati divisi dalla diagonale). Creerei il quadrato grande dietro (il contenitore della finestra di dialogo) e un altro che sarebbe questo triangolo (usando un'immagine). Ciò avrebbe alcuni problemi con la trasparenza perché il triangolo si sovrapponeva parzialmente al quadrato. quindi forse il triangolo non sarebbe trasparente.

  2. Un'altra opzione, sarebbe utilizzare una visualizzazione personalizzata. Non ho mai provato questo, ma penso che potresti specificare una serie di punti e accarezzarli creando la cornice bianca. L'interno potrebbe essere un rettangolo dipinto con trasparenza (facile). C'è qualcosa per disegnare un'ombra con il tuo oggetto pittore (ciò che usi per disegnare testo, linee, rettangoli) ma credo che questa sarebbe la cosa più complicata da ottenere usando una funzione di disegno manuale.

  3. Utilizzare la fonte! (In altre parole, Android è aperto ...vedere come l'hanno fatto nel codice sorgente)

circa la larghezza della vista:

Quando si tenta di ottenere il valore? Se lo fai nel metodo onCreate, non dovrebbe funzionare. Fallo quando l'utente fa clic sul pulsante. Se lo stai già facendo questa volta, non posso aiutarti. Dovrebbe funzionare. L'ho già fatto molte volte!

Suggerimento gratuito: Invece di view.getLeft (che restituisce la distanza al relativo genitore), utilizzando view.getLocationOnScreen è un'opzione migliore.

0

Questo è probabilmente, o almeno può essere, ottenuto utilizzando i costrutti PathShape. In combinazione con ShapeDrawable è possibile creare il proprio controllo "di dialogo". Utilizzando lo stesso percorso, è possibile definire le regioni di ritaglio di un disegno Canvas. Infine, usando ColorDrawable puoi riempire la tela con il colore trasparente.