2012-07-24 14 views
7

Voglio usare SlidingDrawer nella mia applicazione. Ma devo nascondere 20% del contenuto per essere visibile quando SlidingDrawer è chiuso. Inoltre, desidero assegnare tutte le azioni (tocco o trascinamento) allo a content. Per favore aiutami se qualcuno sta avendo qualche soluzione per questo.SlidingDrawer senza maniglia e azioni scorrevoli al contenuto

Si prega di fare riferimento al seguente frammento di codice che ho provato.

<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> 

e qui è la mia attività:

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

Eccomi in grado di nascondere la handle impostando width=0dip, ma in grado di sapere come mostrare 20 % del contenuto quando SlidingDrawer viene chiuso e impostare le azioni su il Content di SlidingDrawer.

Ho tentato di ottenere il touchDelegate dell'impugnatura e di impostarlo su Content, ma non funziona. Per favore aiutami a risolvere questo problema.

+0

Ciao Raj, Fantastico concept! :). Puoi per favore postare del codice su ciò che hai scritto o a che punto non sei riuscito a raggiungerlo. Tutti sono qui più che felici di aiutarti. – Abhilasha

+1

Ciao Abhilasha, ho aggiornato il mio post. Si prega di controllare e aiutarmi se avete qualche soluzione. – Raj

+0

+1 per il tuo sforzo :) – Abhilasha

risposta

0

Non penso che questo sia possibile con lo SlidingDrawer corrente a meno che non si tratti di qualcosa che può essere tagliato e separato in quel 20%. Se guardi all'origine di SlidingDrawer, in particolare open() vedrai che chiama un metodo privato, openDrawer(). Ecco che cosa fa:

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

    if (mExpanded) { 
     return; 
    } 

    mExpanded = true; 

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

Come si può vedere il contenuto (il "cassetto") non è visibile fino a quando la maniglia inizia a muoversi. Non sembra che vi sia un gancio quando il cassetto si muove, solo quando inizia o finisce, quindi non si è in grado di aggiornare dinamicamente ciò che era nella maniglia o nel cassetto.

Se si tratta di un'immagine, è possibile dividerla in due parti, 20% e 80%. Ma dal momento che stai lavorando con 3 TextViews non sembra che sia un'opzione.

Dato che penso che un'opzione potrebbe prendere la fonte di SlidingDrawer e creare la propria classe. In questo modo avresti il ​​pieno controllo su come è stato gestito il disegno, ma puoi ancora riutilizzare tutti gli ascoltatori. Ecco un link alla fonte: https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/widget/SlidingDrawer.java

0

Ho intenzione di fare qualcosa come te.

Poiché Slidingrawer ora è deprecato, ho utilizzato slidedraw personalizzato denominato MultiDirectionSlidingDrawer. Ecco il codice che trovo su internet: MultiDirectionSlidingDrawer Source Code

Per mostrare la vista del contenuto come una maniglia, non ho intenzione di nascondere la maniglia ma il contenuto. ho impostato l'altezza di vista dei contenuti è 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> 

Come il mio inizio cassetto dall'alto, ho calcolato top offset nella 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

che sto cercando di fare qualcosa di molto simile. Hai avuto fortuna?

Per mostrare il 20% del contenuto quando SlidingDrawer è chiuso, è consigliabile utilizzare SemiClosedSlidingDrawer. Credo che sia qui che l'ho trovato originariamente: http://pastebin.com/FtVyrcEb.

Inoltre, ho aggiunto questo nel mio file attr.xml in res/valori/

<!-- 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

Per avere una slidingDrawer senza manico, il trucco è sufficiente impostare la larghezza e l'altezza della maniglia per 0DP. Cheers

Problemi correlati