2013-06-19 8 views
8

Kurze Frage:Ist es möglich, einen Screenshot einer Ansicht zu erstellen, ohne die Ansicht anzuzeigen?

Angenommen, ich habe irgendeine Art von Layout-Datei und ich blase es auf (oder benutze die normalen CTORs im Code).

Anstatt die aufgeblähte Ansicht zu zeigen, möchte ich einen "screenshot" (eine Bitmap) machen, wie es unter einigen Einschränkungen (der gegebenen Breite & Höhe, sogar größer als der Bildschirm) aussehen würde.

Ich möchte die Ansicht nicht irgendwo auf dem Bildschirm hinzufügen, sondern nur für diesen Zweck und vielleicht später hinzufügen.

Eine solche Sache könnte für einfache Manipulationen, wie Dinge platziert werden, nützlich sein. Zum Beispiel könnte ich ein Layout verwenden, in das ein Bild eingefügt wird, so dass es einen Rahmen um es herum hätte.

Ist so etwas möglich? Wenn das so ist, wie?

+0

Ist das für Test App? Wenn ja, dann können Sie überprüfen, com.android.systemui.screenshot.ScreenshotTest –

+0

was meinst du "Test App"? Ich möchte es für jede Art von App wissen. –

+0

Ich kann es derzeit nicht testen, aber die 'draw'-Methode der Ansichten sollte in der Lage sein, auf eine Leinwand zu zeichnen, auch wenn sie keinem Layout hinzugefügt wird. Sie müssen es jedoch durch alle Layout-Phasen seines Lebenszyklus durchlaufen. http://developer.android.com/reference/android/view/View.html#draw%28android.graphics.Canvas%29 – Jave

Antwort

7

OK, ich habe eine Möglichkeit gefunden, es zu tun, basierend auf 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; 
} 

Anwendungsbeispiel:

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

KLICKEN SIE NICHT AUF DEN LINK IN DIESER ANTWORT !!! Es ist Adware !! – Sevren

+0

@ Nerven82 Es wurde seit dem letzten Mal geändert. Ich würde nie so ein problematisches Ding hier stellen. Auch sagt Virustotal Es ist in Ordnung, basierend auf 67 antiviren: https://www.virustotal.com/en/url/c3279c186440c89052ae0dbd9ac2c1ed5e0663904eed15eae5c49cae348b2f37/analysis/1460416779/ https://www.virustotal.com/en/url/51b003e759a05a34c58ebcb3078de02e73ee779dbffb54ab19ef0711fdd81af5/analysis/ 1460416787/ –

+0

@ Nerves82 Wie auch immer, aktualisierte Link, um vorherigen Inhalt anzuzeigen, mit Wayback –

Verwandte Themen