2015-10-04 28 views
5

IL PROBLEMACardView ombra non fusi volta convertito in bitmap

Sono tenta di salvare un gruppo di viste (che ha un CardView come uno dei suoi childern) come file PNG. Per raggiungere questo obiettivo,

  1. ho gonfiare il gruppo di viste e popolare le opinioni con le informazioni richieste
  2. carico un'immagine per la visualizzazione di un'immagine tramite Glide
  3. Aggiungi un ViewTreeObserver.OnGlobalLayoutListener alla ViewTreeObserver della vista dell'immagine e passare il intera vista (genitore) che verrà condivisa con un metodo che converte la vista in una bitmap quando il limite inferiore della vista immagine è maggiore di zero (l'attributo altezza vista immagine è impostato su wrap_content, quindi il suo fondo sarà zero fino a quando l'immagine è caricato).

In questo modo, sono in grado di convertire la vista di una bitmap, però, con un avvertimento: spettacolo s' il CardView non sia reso sulla bitmap.

tentativi falliti

Finora ho provato:

  1. Passaggio da layerType attributo da "software" di "hardware".
  2. Impostazione on e off cardUseCompatPadding attributo di CardView.
  3. Provato a impostare l'immagine disegnabile senza usare Glide.
  4. Provato senza caricare un'immagine estraibile.

CODICE

Qui ci sono frammenti di codice che potrebbero aiutare voi ragazzi identificare il problema:

Il metodo utilizzato per convertire in vista di una bitmap

public static Bitmap getBitmapFromView(View view) { 
    //Define a bitmap with the same size as the view 
    Bitmap b = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888); 
    //Bind a canvas to it 
    Canvas canvas = new Canvas(b); 
    //Get the view's background 
    Drawable bgDrawable = view.getBackground(); 
    if (bgDrawable != null) 
     //has background drawable, then draw it on the canvas 
     bgDrawable.draw(canvas); 
    else 
     //does not have background drawable, then draw white background on the canvas 
     canvas.drawColor(Color.WHITE); 
    // draw the view on the canvas 
    view.draw(canvas); 
    //return the bitmap 
    return b; 
} 

di layout XML file della visualizzazione che viene gonfiata e passata allo getBitmapFromView() precedente.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:paddingBottom="16dp"> 

    <com.devspark.robototextview.widget.RobotoTextView 
     android:id="@+id/title" 
     style="@style/text_subhead" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="top" 
     android:layout_marginBottom="@dimen/lessons_horizontal_margin_narrow" 
     android:layout_marginLeft="@dimen/lessons_horizontal_margin_narrow" 
     android:layout_marginRight="@dimen/lessons_horizontal_margin_narrow" 
     android:layout_marginTop="@dimen/lessons_horizontal_margin_narrow" 
     android:gravity="left" 
     app:typeface="roboto_medium" /> 

    <com.devspark.robototextview.widget.RobotoTextView 
     android:id="@+id/text" 
     style="@style/text_subhead" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="@dimen/lessons_horizontal_margin_narrow" 
     android:layout_marginRight="@dimen/lessons_horizontal_margin_narrow" 
     android:gravity="left" 
     android:textColor="@color/text" 
     app:typeface="roboto_regular" /> 

    <android.support.v7.widget.CardView 
     android:id="@+id/image_container" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_margin="@dimen/lessons_horizontal_margin_narrow" 
     app:cardCornerRadius="@dimen/lessons_image_card_corner_radius" 
     app:cardElevation="3dp" 
     app:cardPreventCornerOverlap="false" 
     app:cardUseCompatPadding="true"> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:orientation="vertical"> 

      <com.makeramen.roundedimageview.RoundedImageView 
       android:id="@+id/image" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:contentDescription="@null" 
       app:riv_corner_radius_top_left="@dimen/lessons_image_card_corner_radius" 
       app:riv_corner_radius_top_right="@dimen/lessons_image_card_corner_radius" /> 

      <com.devspark.robototextview.widget.RobotoTextView 
       android:id="@+id/caption" 
       style="@style/text_caption" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_margin="@dimen/lessons_image_card_caption_margin" 
       android:gravity="left" 
       app:typeface="roboto_condensed_regular" /> 

     </LinearLayout> 

    </android.support.v7.widget.CardView> 

    <!-- Some other views that aren't particularly interesting --> 

</LinearLayout> 
+0

Non sono sicuro se rilevante, ma forse potresti provare a impostare un piccolo 'android: padding', e' android: clipToPadding = "false" 'per il cardview? – headuck

+0

Assicurati che non sia correlato al padding della vista genitore o della vista della scheda. L'ombra viene visualizzata sullo schermo senza alcun problema e viene fornito spazio sufficiente per garantire che. Grazie comunque. – fahmy

+0

Affronto lo stesso problema, anche se sono più interessato a ottenere gli angoli arrotondati disegnati sulla mia tela.Non vengono disegnati né angoli arrotondati, né ombre. Uso anche view.draw (tela) – arberg

risposta

0

basta cambiare CardView per visualizzare e impostare

android: background = "@ Android: drawable/dialog_holo_light_frame"

ofcause è necessario affrontare l'imbottitura da soli