2011-02-14 12 views
5

En mi dispositivo Android 2.2.2 la galería se ve realmente bien. Lo que me gustaría hacer en mi propia aplicación es presionar un botón y luego mostrar un menú que se ve así: enter image description here¿Cómo hacer un menú transparente y elegante como el "menú de compartir" en la galería de Android?

¿Se está utilizando algún tema/estilo estándar de Android? ¿Alguien sabe de un código de ejemplo para tener un menú como este?

Editar: Me di cuenta de que uno podría imitar este menú con un cuadro de diálogo. Para simplificar las cosas que no estoy usando un ListView en este ejemplo, sólo una única entrada de Vista de Texto para el diálogo:

<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 el diálogo cuando se presiona un botón:

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

Esto crea un cuadro de diálogo que se acerca al menú de la imagen. Todavía tengo dos problemas, sin embargo:

1) ¿Cómo puedo dibujar este pequeño triángulo en la parte inferior del cuadro de diálogo, como se hace en la imagen de arriba?

2) El botón que se supone que abre el cuadro de diálogo se coloca horizontalmente en el medio de la barra de botones inferior. Entonces, cuando lo presione, el cuadro de diálogo debería aparecer justo encima de ese botón. Lo que me gustaría hacer es esto:

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

El problema es, que WMLP.width es -2. Supongo que la razón es que el ancho del diseño se establece en "wrap_content" (que es -2) y el ancho real no se conoce en este momento. Entonces, ¿cómo puedo determinar el ancho del diálogo para poder colocarlo concéntricamente sobre otra vista?

Actualización: Finalmente se encontró una gran fuente para un diálogo como este: http://www.londatiga.net/it/how-to-create-quickaction-dialog-in-android/

Es exactamente lo que quería y lo estoy usando en mi aplicación.

+1

** Posible duplicado de [Patrón de IU de acciones rápidas de Android] (http://stackoverflow.com/questions/3059155/android-quick-actions-ui-pattern) y [Submenú de "Compartir Android"] (http://stackoverflow.com/questions/4943287/android-share-submenu)** –

+0

@vikas Es una pregunta diferente a la primera pregunta que encontraste. Sería un duplicado de la segunda pregunta pero hasta ahora no tiene una buena respuesta. –

Respuesta

1

Puede hacer esto agregando un PopupWindow en la ubicación actual, para dibujar este menú fresco necesitará la imagen de este fondo y la pequeña flecha para dibujar también.

También debe leer sobre el Drawable de nueve trayectorias para hacer esto.

PD: Ya tengo esto hecho, pero con otra imagen.

+1

¿Pero puedes poner la punta de la flecha en el punto específico que deseas? ¡Observe que en esa captura de pantalla, la flecha no está en el medio del cuadrado! –

+0

sí pensé en la ubicación del componente de anclaje. Haces 2 sorteos para hacer esto, primero el rectángulo y luego la flecha en la ubicación especificada. –

0

sobre el diálogo

3 Opciones:

  1. Sobre el dibujo del triángulo (en realidad, creo que es un cuadrado con esquinas redondeadas divididos por la diagonal). Creé el cuadrado grande detrás (el contenedor del diálogo) y otro que sería este triángulo (usando una imagen). Esto tendría algunos problemas con la transparencia porque el triángulo se superpondría parcialmente al cuadrado. así que tal vez el triángulo no sea transparente.

  2. Otra opción sería usar una vista personalizada. Nunca lo he intentado, pero creo que podrías especificar un conjunto de puntos y acariciarlos para crear el marco blanco. El interior podría ser un rectángulo pintado con transparencia (fácil). Hay algo para dibujar una sombra con su objeto de pintor (lo que usa para dibujar texto, líneas, rectángulos) pero creo que esto sería lo más complicado de lograr con una función de dibujo manual.

  3. ¡Utilice la fuente! (En otras palabras, Android está abierto ...ver cómo lo hicieron en el código fuente)

Sobre el ancho de la vista:

¿Cuándo se intenta obtener el valor? Si lo haces en el método onCreate, no debería funcionar. Hazlo cuando el usuario haga clic en el botón. Si ya lo estás haciendo esta vez, no puedo ayudarte. Deberia de funcionar. ¡Lo he hecho muchas veces antes!

Consejo gratuito: En lugar de view.getLeft (que devuelve la distancia a su elemento principal), usar view.getLocationOnScreen es una mejor opción.

0

Esto es probablemente, o al menos se puede lograr, utilizando las construcciones PathShape. Combinado con ShapeDrawable puede construir su propio control de "diálogo". Usando la misma ruta, puede definir las regiones de recorte de un dibujo Canvas. Finalmente, usando ColorDrawable puede llenar el lienzo con el color transparente.

Cuestiones relacionadas