2012-01-05 7 views
8

Io uso sotto il codice per convertire, ma a quanto pare può ottenere solo il contenuto sullo schermo di visualizzazione e non è possibile ottenere il contenuto non sullo schermo di visualizzazione.Come convertire tutto il contenuto in una scrollview in una bitmap?

C'è un modo per ottenere tutti i contenuti anche al di fuori di scorrimento?

Bitmap viewBitmap = Bitmap.createBitmap(mScrollView.getWidth(),mScrollView.getHeight(),Bitmap.Config.ARGB_8888); 
Canvas canvas = new Canvas(viewBitmap); 
mScrollView.draw(canvas); 

risposta

15

Siamo in grado di convertire tutti i contenuti di uno ScrollView in un'immagine bitmap utilizzando il codice indicato di seguito

private void takeScreenShot() 
{ 
    View u = ((Activity) mContext).findViewById(R.id.scroll); 

    HorizontalScrollView z = (HorizontalScrollView) ((Activity) mContext).findViewById(R.id.scroll); 
    int totalHeight = z.getChildAt(0).getHeight(); 
    int totalWidth = z.getChildAt(0).getWidth(); 

    Bitmap b = getBitmapFromView(u,totalHeight,totalWidth);    

    //Save bitmap 
    String extr = Environment.getExternalStorageDirectory()+"/Folder/"; 
    String fileName = "report.jpg"; 
    File myPath = new File(extr, fileName); 
    FileOutputStream fos = null; 
    try { 
     fos = new FileOutputStream(myPath); 
     b.compress(Bitmap.CompressFormat.JPEG, 100, fos); 
     fos.flush(); 
     fos.close(); 
     MediaStore.Images.Media.insertImage(mContext.getContentResolver(), b, "Screen", "screen"); 
    }catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

public Bitmap getBitmapFromView(View view, int totalHeight, int totalWidth) { 

    Bitmap returnedBitmap = Bitmap.createBitmap(totalWidth,totalHeight , Bitmap.Config.ARGB_8888); 
    Canvas canvas = new Canvas(returnedBitmap); 
    Drawable bgDrawable = view.getBackground(); 
    if (bgDrawable != null) 
     bgDrawable.draw(canvas); 
    else 
     canvas.drawColor(Color.WHITE); 
    view.draw(canvas); 
    return returnedBitmap; 
} 
+0

questo è il non funziona quando viste uso scrollTo che desiderano scorrere internamente il loro contenuto http://developer.android.com/reference/android/view/View.html#scrollTo% 28int,% 20int% 29 –

+0

funziona bene .. grazie –

0

Il problema qui è che l'unico contenuto di pixel effettivamente esistente è quello visibile sullo schermo. Android e altre piattaforme mobili sono molto attente all'uso della memoria e uno dei modi in cui una vista a scorrimento può mantenere le prestazioni è di non disegnare nulla che sia fuori schermo. Quindi non c'è nessuna bitmap "completa" da nessuna parte - la memoria che contiene il contenuto che si muove fuori dallo schermo viene riciclata.

1

È necessario ottenere la larghezza totale e l'altezza della ScrollView, o si è creato viewBitmap è troppo piccolo per contenere l'intero contenuto del ScrollView.

controllare questo link Android: Total height of ScrollView

5

La risposta Pops è veramente buono, ma in alcuni casi si potrebbe essere necessario creare una bitmap veramente grande che potrebbe innescare una OutOfMemoryException quando si crea la bitmap.

così ho fatto un po 'di ottimizzazione per essere delicatamente con la memoria :)

public static Bitmap getBitmapFromView(View view, int totalHeight, int totalWidth) { 

    int height = Math.min(MAX_HEIGHT, totalHeight); 
    float percent = height/(float)totalHeight; 

    Bitmap canvasBitmap = Bitmap.createBitmap((int)(totalWidth*percent),(int)(totalHeight*percent), Bitmap.Config.ARGB_8888); 
    Canvas canvas = new Canvas(canvasBitmap); 

    Drawable bgDrawable = view.getBackground(); 
    if (bgDrawable != null) 
     bgDrawable.draw(canvas); 
    else 
     canvas.drawColor(Color.WHITE); 

    canvas.save(); 
    canvas.scale(percent, percent); 
    view.draw(canvas); 
    canvas.restore(); 

    return canvasBitmap; 
} 
1

Questo funziona per me

per salvare il permesso di esecuzione di controllo bitmap prima

@OnClick(R.id.donload_arrow) 
    public void DownloadBitMap() 
    { 
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) 
    { 
     downloadData(); 
        Log.e("callPhone: ", "permission"); 
       } else { 
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0); 
        Toast.makeText(this, "need permission", Toast.LENGTH_SHORT).show(); 
       } 

      } 

Per ottenere bitmap

private void downloadData() { 

     ScrollView iv = (ScrollView) findViewById(R.id.scrollView); 
     Bitmap bitmap = Bitmap.createBitmap(
       iv.getChildAt(0).getWidth()*2, 
       iv.getChildAt(0).getHeight()*2, 
       Bitmap.Config.ARGB_8888); 
     Canvas c = new Canvas(bitmap); 
     c.scale(2.0f, 2.0f); 
     c.drawColor(getResources().getColor(R.color.colorPrimary)); 
     iv.getChildAt(0).draw(c); 
     // Do whatever you want with your bitmap 
     saveBitmap(bitmap); 

    } 

Per salvare l'immagine bitmap

public void saveBitmap(Bitmap bitmap) { 
     File folder = new File(Environment.getExternalStorageDirectory() + 
       File.separator + "SidduInvoices"); 
     boolean success = true; 
     if (!folder.exists()) { 
      success = folder.mkdirs(); 
     } 
     if (success) { 
      // Do something on success 
     } else { 
      // Do something else on failure 
     } 

     File imagePath = new File(Environment.getExternalStorageDirectory() + "/SidduInvoices/Siddus.png"); 

     if(imagePath.exists()) 
     { 
      imagePath=new File(Environment.getExternalStorageDirectory() + "/SidduInvoices/Siddus"+custamername.getText().toString()+".png"); 

     } 
     FileOutputStream fos; 
     try { 
      fos = new FileOutputStream(imagePath); 
      bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); 
      fos.flush(); 
      fos.close(); 
      progressBar.cancel(); 


      final File finalImagePath = imagePath; 
      new SweetAlertDialog(this, SweetAlertDialog.SUCCESS_TYPE) 
        .setTitleText("Saved") 
        .setContentText("Do you want to share this with whatsapp") 
        .setCancelText("No,cancel !") 
        .setConfirmText("Yes,share it!") 
        .showCancelButton(true) 
        .setConfirmClickListener(new SweetAlertDialog.OnSweetClickListener() { 
         @Override 
         public void onClick(SweetAlertDialog sweetAlertDialog) { 
          sweetAlertDialog.cancel(); 
          shareImage(finalImagePath); 
         } 
        }) 
        .setCancelClickListener(new SweetAlertDialog.OnSweetClickListener() { 
         @Override 
         public void onClick(SweetAlertDialog sDialog) { 
          sDialog.cancel(); 

         } 
        }) 
        .show(); 




     } catch (FileNotFoundException e) { 
      Log.e("GREC", e.getMessage(), e); 
     } catch (IOException e) { 
      Log.e("GREC", e.getMessage(), e); 
     } 



    } 
+0

funziona perfettamente! grazie .) –

Problemi correlati