2012-07-24 6 views
7

Quiero usar SlidingDrawer en mi aplicación. Pero tengo que ocultar el handle y tengo que mostrar 20% del contenido para ser visible cuando SlidingDrawer está cerrado. También quiero asignar todas las acciones deslizantes (tocar o arrastrar) del handle al content. Por favor, ayúdenme si alguien está teniendo alguna solución para esto.SlidingDrawer sin mango y acciones de deslizamiento al contenido

Consulte el siguiente fragmento de código que probé.

<View 
    android:id="@id/handle" 
    android:layout_width="0dip" 
    android:layout_height="fill_parent" /> 

<LinearLayout 
    android:id="@id/content" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/sliding_drawer" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/sliding_drawer" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/sliding_drawer" /> 
</LinearLayout> 

y aquí está mi actividad:

 import android.app.Activity; 
    import android.graphics.Color; 
    import android.os.Bundle; 
    import android.view.View; 
    import android.widget.SlidingDrawer; 
    import android.widget.SlidingDrawer.OnDrawerCloseListener; 
    import android.widget.SlidingDrawer.OnDrawerOpenListener; 

    public class SlidingDrawerActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     final SlidingDrawer drawer = (SlidingDrawer) findViewById(R.id.drawer); 
     drawer.setOnDrawerCloseListener(new OnDrawerCloseListener() { 

      public void onDrawerClosed() { 
       // TODO Auto-generated method stub 
       drawer.setBackgroundColor(Color.BLACK); 
      } 
     }); 

     drawer.setOnDrawerOpenListener(new OnDrawerOpenListener() { 

      public void onDrawerOpened() { 
       // TODO Auto-generated method stub 
       drawer.setBackgroundColor(Color.BLUE); 
      } 
     }); 

     View content = drawer.getContent(); 
     content.setClickable(true); 
     content.setTouchDelegate(drawer.getHandle().getTouchDelegate()); 
    } 
} 

Aquí estoy capaz de ocultar la handle estableciendo width=0dip, pero incapaz de saber cómo mostrar 20 % de contenido cuando SlidingDrawer está cerrado y configura las acciones para el Content del SlidingDrawer.

Intenté obtener el touchDelegate del asa y configurarlo en Content, pero no funciona. Ayúdenme a resolver este problema.

+0

¡Hola Raj, concepto fresco! :). ¿Puede publicar algún código de lo que ha escrito o en qué momento no lo logró? Todos están aquí más que felices de ayudarte. – Abhilasha

+1

Hola Abhilasha, he actualizado mi publicación. Por favor verifique eso y ayúdeme si tiene alguna solución. – Raj

+0

+1 por tu esfuerzo :) – Abhilasha

Respuesta

0

No creo que esto sea posible con el SlidingDrawer actual a menos que se trate de algo que pueda cortarse y separarse en ese 20%. Si mira la fuente de SlidingDrawer, específicamente open(), verá que llama a un método privado, openDrawer(). Esto es lo que hace:

private void openDrawer() { 
    moveHandle(EXPANDED_FULL_OPEN); 
    mContent.setVisibility(View.VISIBLE); 

    if (mExpanded) { 
     return; 
    } 

    mExpanded = true; 

    if (mOnDrawerOpenListener != null) { 
     mOnDrawerOpenListener.onDrawerOpened(); 
    } 
} 

Como se puede ver el contenido (el "cajón") no es visible hasta que el mango se pone en movimiento. No parece haber un gancho cuando el cajón se está moviendo, solo cuando comienza o termina, por lo que no sería capaz de actualizar dinámicamente lo que estaba en el asa o en el cajón.

Si se tratara de una imagen, podría cortarla en dos partes, 20% y 80%. Pero dado que está trabajando con 3 TextViews, no parece que sea una opción.

Dado que creo que una opción sería tomar la fuente de SlidingDrawer y crear su propia clase. De esta forma, usted tendría el control total sobre cómo se manejó el dibujo, pero aún podrá volver a utilizar todos los oyentes. Aquí hay un enlace a la fuente: https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/widget/SlidingDrawer.java

0

Voy a hacer algo como tú.

Como Slidedrawer está en desuso ahora, utilicé slidedraw personalizado llamado MultiDirectionSlidingDrawer. Aquí está el código que encuentro en Internet: MultiDirectionSlidingDrawer Source Code

Para mostrar la vista de contenido como un identificador, no voy a ocultar el manejador, sino el contenido. que se obtenga la altura de vista del contenido es de 0 dip

<it.sephiroth.demo.slider.widget.MultiDirectionSlidingDrawer 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/drawer" 
    custom:handle="@+id/handle" 
    custom:content="@+id/content" 
    custom:direction="topToBottom" 
    custom:animateOnClick="false" 
    custom:allowSingleTap="false" 

    > 
    <LinearLayout 
     android:id="@id/handle" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:gravity="center" 
     > 
     <!-- 
     paste your content here 
     --> 
    </LinearLayout> 
    <LinearLayout 
     android:id="@id/content" 
     android:layout_width="fill_parent" 
     android:layout_height="0dp" 
     android:orientation="vertical" 
     android:gravity="center" 
     > 

    </LinearLayout> 
</it.sephiroth.demo.slider.widget.MultiDirectionSlidingDrawer> 

Como mi inicio cajón de arriba, calculo de offset superior en onMeasure

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
{ 
    int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec); 
    int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec); 

    int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec); 
    int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec); 

     if (widthSpecMode == MeasureSpec.UNSPECIFIED || heightSpecMode == MeasureSpec.UNSPECIFIED) { throw new RuntimeException(
      "SlidingDrawer cannot have UNSPECIFIED dimensions"); } 

     final View handle = mHandle; 
     measureChild(handle, widthMeasureSpec, heightMeasureSpec); 

     //Custom top offset 
     int intHandleHeight = handle.getHeight(); 
     mTopOffset = intHandleHeight*80*-1/100; 

     if (mVertical) { 
      int height = heightSpecSize - handle.getMeasuredHeight() - mTopOffset; 
      mContent.measure(MeasureSpec.makeMeasureSpec(widthSpecSize, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)); 
     } else { 
      int width = widthSpecSize - handle.getMeasuredWidth() - mTopOffset; 
      mContent.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(heightSpecSize, MeasureSpec.EXACTLY)); 
     } 

     setMeasuredDimension(widthSpecSize, heightSpecSize); 
    } 
0

que estoy tratando de hacer algo muy similar. ¿Has tenido algo de suerte?

Para mostrar el 20% del contenido cuando SlidingDrawer está cerrado, recomiendo usar SemiClosedSlidingDrawer. Creo que aquí es donde lo encontré originalmente: http://pastebin.com/FtVyrcEb.

Además, me han añadido este archivo en mi attr.xml en res/valores/

<!-- SemiClosedSlidingDrawer --> 
<declare-styleable name="SemiClosedSlidingDrawer"> 
    <attr name="handle" format="integer" /> 
    <attr name="content" format="integer" /> 
    <attr name="topOffset" format="dimension" /> 
    <attr name="bottomOffset" format="dimension" /> 
    <attr name="allowSingleTap" format="boolean" /> 
    <attr name="animateOnClick" format="boolean" /> 
    <attr name="semiClosedOrientation" format="string" /> 
    <attr name="semiClosedContentSize" format="dimension" /> 
</declare-styleable> 
1

Para tener una slidingDrawer sin mango, el truco se acaba de establecer el ancho y la altura de la manija para 0DP. Saludos

Cuestiones relacionadas