2013-06-19 18 views
8

Breve domanda:È possibile fare uno screenshot di una vista senza mostrare la vista?

Supponiamo di avere un qualche tipo di file di layout e lo gonfio (o utilizzare i normali CTOR nel codice).

Invece di mostrare la vista gonfiata, desidero prendere uno "screenshot" (una bitmap) di come apparirebbe sotto alcune limitazioni (di una larghezza data di altezza &, anche maggiore dello schermo).

Non desidero aggiungere la vista a nessun punto dello schermo, ma solo tenerla per questo scopo e magari aggiungerla in un secondo momento.

Una cosa del genere potrebbe essere utile per facili manipolazioni su come posizionare le cose. Ad esempio, potrei usare un layout per inserire un'immagine al suo interno in modo da avere una cornice attorno ad essa.

È possibile? Se é cosi, come?

+0

E 'questo per Test App? Se sì, puoi controllare com.android.systemui.screenshot.ScreenshotTest –

+0

cosa intendi con "App di prova"? voglio saperlo per qualsiasi tipo di app. –

+0

Attualmente non posso testarlo, ma il metodo 'draw'-view delle viste dovrebbe essere in grado di disegnare su una tela, anche se non è stato aggiunto a nessun layout. Tuttavia, è necessario portarlo attraverso tutte le fasi del layout del suo ciclo di vita. http://developer.android.com/reference/android/view/View.html#draw%28android.graphics.Canvas%29 – Jave

risposta

7

OK, ho trovato un possibile modo per farlo, sulla base di this link:

public static Bitmap drawToBitmap(Context context,final int layoutResId, 
            final int width,final int height) 
{ 
    final Bitmap bmp = Bitmap.createBitmap(width,height,Bitmap.Config.ARGB_8888); 
    final Canvas canvas = new Canvas(bmp); 
    final LayoutInflater inflater = 
     (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    final View layout = inflater.inflate(layoutResId,null); 
    layout.setDrawingCacheEnabled(true); 
    layout.measure(
     MeasureSpec.makeMeasureSpec(canvas.getWidth(),MeasureSpec.EXACTLY), 
     MeasureSpec.makeMeasureSpec(canvas.getHeight(),MeasureSpec.EXACTLY)); 
    layout.layout(0,0,layout.getMeasuredWidth(),layout.getMeasuredHeight()); 
    canvas.drawBitmap(layout.getDrawingCache(),0,0,new Paint()); 
    return bmp; 
} 

Esempio di utilizzo:

public class MainActivity extends ActionBarActivity 
{ 
    @Override 
    protected void onCreate(final Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     final ImageView iv = (ImageView)findViewById(R.id.image); 
     final DisplayMetrics metrics = getResources().getDisplayMetrics(); 
     final Bitmap b = drawToBitmap(this,R.layout.test, metrics.widthPixels, 
            metrics.heightPixels); 
     iv.setImageBitmap(b); 
    } 

} 
+0

NON FARE CLIC SUL SUGGERIMENTO IN QUESTA RISPOSTA !!! È adware !! – Sevren

+0

@ Nerves82 È stato modificato dall'ultima volta. Non metterei mai una cosa così problematica qui. Inoltre, VirusTotal dice che è ok, sulla base di 67 Gli antivirus: https://www.virustotal.com/en/url/c3279c186440c89052ae0dbd9ac2c1ed5e0663904eed15eae5c49cae348b2f37/analysis/1460416779/ https://www.virustotal.com/en/url/51b003e759a05a34c58ebcb3078de02e73ee779dbffb54ab19ef0711fdd81af5/analysis/ 1460416787/ –

+0

@ Nerves82 In ogni caso, il collegamento aggiornato per mostrare il contenuto precedente, utilizzando Wayback –