2012-03-20 6 views
30

मैंने एक टेबल बनाया है जो मूल रूप से के अंदर HorizontalScrollView द्वारा किया गया है। मैंने उपयोगकर्ता को फ़ील्ड संपादित कर सकते हैं।पूरे दृश्य का एक स्क्रीनशॉट लें

अब मैं एक स्क्रीन, जेपीजी, पीएनजी, पीडीएफ या किसी अन्य चीज़ पर टेबल को सहेजना चाहता हूं।

समस्या यह है कि तालिका स्क्रीन से लगभग हमेशा बड़ी होती है।

क्या पूरे ScrollView लेआउट का स्क्रीनशॉट बनाने का कोई तरीका है? यदि नहीं, तो आपको लगता है कि नौकरी क्या कर सकती है?

+0

http://stackoverflow.com/questions/8325498/take-screenshot-of-whole- स्क्रीन आपको मदद करता है। –

+0

इस पोस्ट में उत्तर की जांच करें, मुझे किसी प्रकार का समाधान मिला: [बड़े रिज़ॉल्यूशन की छवि के रूप में एकाधिक टेक्स्ट व्यू सहेजें] (http://stackoverflow.com/questions/36424381/save-multiple-textviews-as-image-of-large -resolution/36455437 # 36455437) –

उत्तर

54

वास्तव में मैं इस सवाल का जवाब मिला:

public static Bitmap loadBitmapFromView(View v, int width, int height) { 
    Bitmap b = Bitmap.createBitmap(width , height, Bitmap.Config.ARGB_8888);     
    Canvas c = new Canvas(b); 
    v.layout(0, 0, v.getLayoutParams().width, v.getLayoutParams().height); 
    v.draw(c); 
    return b; 
} 
+3

अनुरोध किए जाने तक दृश्य प्रस्तुत नहीं किया जाएगा समस्या यह है कि औसत लेआउट में वास्तविक ऊंचाई/चौड़ाई मान नहीं होते हैं, और अक्सर match_parent/fill_parent पर सेट करें। मेरे मामले में, मुझे वास्तविक आकार के साथ माता-पिता की जांच करने की आवश्यकता थी। –

+4

लियोन, आप हमेशा कॉल को देखते हैं .getWidth() और view.get उड़ान पर दृश्य विचलन देखने के लिए हाइट – Defuera

+0

यह कोड मेरे साथ ठीक काम कर रहा है, लेकिन मैं लगातार एक स्क्रीन में 24-25 स्क्रीनशॉट जैसे स्क्रीनशॉट लेना चाहता हूं, मैं प्रति सेकंड 14-15 स्क्रीनशॉट करने में सक्षम हूं लेकिन 24-25 स्क्रीनशॉट लेने में सक्षम नहीं हूं। क्या आप मुझे बता सकते हैं कि इसके लिए क्या करना है? –

0

आप एक ऐसा दृश्य के ड्राइंग कैश का उपयोग करने में सक्षम हो सकता है, लेकिन मुझे यकीन है कि अगर इस पूरे दृश्य का आयोजन करेगा या सिर्फ क्या परदे के लिए प्रदान की गई है नहीं कर रहा हूँ।

मैं सलाह देता हूं कि आप समान प्रश्नों के लिए स्टैक ओवरव्लो पर चारों ओर शिकार करें, इसकी संभावना पहले से अधिक से अधिक है।

+0

असल में मुझे एक उपयुक्त समाधान नहीं मिला। दुर्भाग्यवश ड्राइंग कैश पूरे दृश्य को प्राप्त करने में सक्षम नहीं है। – softwaresupply

+0

यह एक जटिल समाधान है जिसके बाद आप हैं। डिवाइस स्क्रीन के बाहर कुछ भी प्रस्तुत नहीं करेगा (जैसा कि यह नहीं है) और इसलिए – Mimminito

0

यह अपने काम करता है मेरे लिए ठीक कोशिश

TableLayout tabLayout = (TableLayout) findViewById(R.id.allview); 

    if (tabLayout != null) { 

      Bitmap image = Bitmap.createBitmap(tabLayout.getWidth(), 
        tabLayout.getHeight(), Config.ARGB_8888); 
      Canvas b = new Canvas(image); 

      tabLayout.draw(b); 
} 
7

यह ऑफ स्क्रीन की तरह (नहीं अभी तक प्रदान की गई सामग्री का एक स्क्रीनशॉट बनाने के लिए असंभव है स्क्रॉलव्यू के कुछ हिस्सों)। हालांकि, आप एक से अधिक स्क्रीनशॉट बना सकते हैं, प्रत्येक शॉट के बीच सामग्री स्क्रॉल कर सकते हैं, फिर छवियों में शामिल हो सकते हैं। https://github.com/PGSSoft/scrollscreenshot

illustration

अस्वीकरण:: यहाँ एक उपकरण है जो आप के लिए यह स्वचालित कर सकते हैं है मैं इस उपकरण के लेखक हूँ, यह my employer द्वारा प्रकाशित किया गया था। फ़ीचर अनुरोधों का स्वागत है।

+0

धन्यवाद! मैं थोड़ी देर के लिए उलझन में था क्योंकि मैंने सोचा था "लेकिन डिवाइस में चलाने के लिए मुझे क्या भाग चाहिए?" - ऐसा नहीं लगता था कि यह इस तरह काम करेगा। –

2

आप एक बिटमैप वस्तु पर बनाया गया एक कैनवास के एक ताजा उदाहरण देखने पारित कर सकते हैं।

Bitmap b = Bitmap.createBitmap(targetView.getWidth(), 
           targetView.getHeight(), Bitmap.Config.ARGB_8888); 
Canvas c = new Canvas(b); 
targetView.draw(c); 
BitmapDrawable d = new BitmapDrawable(getResources(), b); 
canvasView.setBackgroundDrawable(d);` 

साथ यह वास्तव में मेरे लिए काम किया है

की कोशिश करो।

13
ScrollView iv = (ScrollView) findViewById(R.id.scrollView); 
    Bitmap bitmap = Bitmap.createBitmap(
     iv.getChildAt(0).getWidth(), 
     iv.getChildAt(0).getHeight(), 
     Bitmap.Config.ARGB_8888); 
    Canvas c = new Canvas(bitmap); 
    iv.getChildAt(0).draw(c); 

    // Do whatever you want with your bitmap 
    saveBitmap(bitmap); 
6

@softwaresupply उत्तर का उपयोग करना मेरे मामले जहां मेरे विचार दोबारा बनाई और पूरी तरह से सफेद हो रही मिल रही थी, में समस्या का कारण बनता है। स्क्रीनशॉट पाने के लिए एक आसान समाधान है जहां आपको चौड़ाई और ऊंचाई को पैरामीटर के रूप में भी आपूर्ति नहीं करना है। ड्राइंग कैश का उपयोग करें।

public static Bitmap loadBitmapFromView(View v) { 
    Bitmap bitmap; 
    v.setDrawingCacheEnabled(true); 
    bitmap = Bitmap.createBitmap(v.getDrawingCache()); 
    v.setDrawingCacheEnabled(false); 
    return bitmap; 
} 
+0

यह दृष्टिकोण अधिक सुरक्षित नहीं है, कैश ड्राइंग करने की सीमा है और जब आपका दृश्य बड़ा होता है (स्क्रॉल करने योग्य दृश्य की तरह), getDrawingCache शून्य वापस आ जाएगा। View.java और विधि buildDrawingCacheImpl के लिए एंड्रॉइड एसडीके में देखें, लॉग में भी चेतावनी है "प्रदर्शित नहीं है क्योंकि यह एक सॉफ्टवेयर परत (या ड्राइंग कैश) में फ़िट होने के लिए बहुत बड़ा है, जरूरत है ..." – Yuraj

0

// सेट बटन क्लिक श्रोता

share = (Button)findViewById(R.id.share); 
    share.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Bitmap bitmap = takeScreenshot(); 
      saveBitmap(bitmap); 

     } 
    }); 

// तो आप बनाने के लिए दो विधि

public Bitmap takeScreenshot() { 
    View rootView = findViewById(android.R.id.content).getRootView(); 
    rootView.setDrawingCacheEnabled(true); 
    return rootView.getDrawingCache(); 
    } 

    public void saveBitmap(Bitmap bitmap) { 
    File imagePath = new File(Environment.getExternalStorageDirectory() + "/screenshot.png"); 
    FileOutputStream fos; 
    try { 
     fos = new FileOutputStream(imagePath); 
     bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos); 
     fos.flush(); 
     fos.close(); 
    } catch (FileNotFoundException e) { 
     Log.e("GREC", e.getMessage(), e); 
    } catch (IOException e) { 
     Log.e("GREC", e.getMessage(), e); 
    } 
    } 

के बाद, अपने ऐप्लिकेशन में इस कोड को जोड़ना अनुप्रयोग चलाने और जाँच अपने स्थानीय भंडारण, आप पूरे पृष्ठ का स्क्रीन शॉट बनाया है।

2

मेरे लिए यह काम करते हैं, यह आप के लिए भी उपयोगी है उम्मीद है।

public static Bitmap getBitmapByView(ScrollView scrollView) { 
    int h = 0; 
    Bitmap bitmap = null; 
    //get the actual height of scrollview 
    for (int i = 0; i < scrollView.getChildCount(); i++) { 
     h += scrollView.getChildAt(i).getHeight(); 
     scrollView.getChildAt(i).setBackgroundResource(R.color.white); 
    } 
    // create bitmap with target size 
    bitmap = Bitmap.createBitmap(scrollView.getWidth(), h, 
      Bitmap.Config.ARGB_8888); 
    final Canvas canvas = new Canvas(bitmap); 
    scrollView.draw(canvas); 
    FileOutputStream out = null; 
    try { 
     out = new FileOutputStream("/sdcard/screen_test.png"); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 
    try { 
     if (null != out) { 
      bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); 
      out.flush(); 
      out.close(); 
     } 
    } catch (IOException e) { 
     // TODO: handle exception 
    } 
    return bitmap; 
} 
+0

यह ठीक काम कर रहा है मुझे –

0
public static Bitmap loadBitmapFromView(ScrollView v) { 
    Bitmap b = Bitmap.createBitmap(v.getWidth() , v.getChildAt(0).getHeight(), Bitmap.Config.ARGB_8888); 
    Canvas c = new Canvas(b); 
    v.draw(c); 
    return b; 
} 
0

डाउनलोड स्रोत कोड यहाँ से (Take screenshot of scrollview in android programmatically)

activity_main.xml

<LinearLayout android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" 
android:background="#efefef" 
xmlns:android="http://schemas.android.com/apk/res/android"> 


<Button 
android:layout_width="match_parent" 
android:layout_margin="10dp" 
android:layout_height="50dp" 
android:id="@+id/btn_screenshot" 
android:text="Take ScreenShot"/> 


<ScrollView 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:id="@+id/scrollView" 
android:layout_marginBottom="10dp" 
android:background="#ffffff"> 

<LinearLayout 
android:layout_width="match_parent" 
android:layout_marginLeft="10dp" 
android:id="@+id/ll_linear" 
android:layout_marginRight="10dp" 
android:orientation="vertical" 
android:layout_height="match_parent"> 


<ImageView 
android:layout_width="match_parent" 
android:layout_marginTop="10dp" 
android:scaleType="fitXY" 
android:layout_height="200dp" 
android:layout_gravity="center" 
android:src="@drawable/image2"/> 
<ImageView 
android:layout_width="match_parent" 
android:layout_marginTop="10dp" 
android:scaleType="fitXY" 
android:layout_height="200dp" 
android:layout_gravity="center" 
android:src="@drawable/image3"/> 

<ImageView 
android:layout_width="match_parent" 
android:layout_marginTop="10dp" 
android:scaleType="fitXY" 
android:layout_height="200dp" 
android:layout_gravity="center" 
android:src="@drawable/image5"/> 


<ImageView 
android:layout_width="match_parent" 
android:layout_marginTop="10dp" 
android:scaleType="fitXY" 
android:layout_height="200dp" 
android:layout_gravity="center" 
android:src="@drawable/image6"/> 

</LinearLayout> 


</ScrollView> 

</LinearLayout> 

MainActivity.xml

package deepshikha.com.screenshot; 
import android.Manifest; 
import android.app.ProgressDialog; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.support.v4.app.ActivityCompat; 
import android.support.v4.content.ContextCompat; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.LinearLayout; 
import android.widget.ProgressBar; 
import android.widget.ScrollView; 
import android.widget.Toast; 

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 

public class MainActivity extends AppCompatActivity { 

Button btn_screenshot; 
ScrollView scrollView; 
LinearLayout ll_linear; 
public static int REQUEST_PERMISSIONS = 1; 
boolean boolean_permission; 
boolean boolean_save; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 
init(); 
fn_permission(); 
} 

private void init() { 
btn_screenshot = (Button) findViewById(R.id.btn_screenshot); 
scrollView = (ScrollView)findViewById(R.id.scrollView); 
ll_linear = (LinearLayout) findViewById(R.id.ll_linear); 

btn_screenshot.setOnClickListener(new View.OnClickListener() { 
@Override 
public void onClick(View view) { 

if (boolean_save) { 
Intent intent = new Intent(getApplicationContext(),Screenshot.class); 
startActivity(intent); 

}else { 
if (boolean_permission) { 
Bitmap bitmap1 = loadBitmapFromView(ll_linear, ll_linear.getWidth(), ll_linear.getHeight()); 
saveBitmap(bitmap1); 
} else { 

} 
} 

} 
}); 
} 
public void saveBitmap(Bitmap bitmap) { 

File imagePath = new File("/sdcard/screenshotdemo.jpg"); 
FileOutputStream fos; 
try { 
fos = new FileOutputStream(imagePath); 
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos); 
fos.flush(); 
fos.close(); 
Toast.makeText(getApplicationContext(),imagePath.getAbsolutePath()+"",Toast.LENGTH_SHORT).show(); 
boolean_save = true; 

btn_screenshot.setText("Check image"); 

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

public static Bitmap loadBitmapFromView(View v, int width, int height) { 
Bitmap b = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
Canvas c = new Canvas(b); 
v.draw(c); 

return b; 
} 

private void fn_permission() { 
if ((ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)|| 
(ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) { 

if ((ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, android.Manifest.permission.READ_EXTERNAL_STORAGE))) { 
} else { 
ActivityCompat.requestPermissions(MainActivity.this, new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE}, 
REQUEST_PERMISSIONS); 

} 

if ((ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE))) { 
} else { 
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 
REQUEST_PERMISSIONS); 

} 
} else { 
boolean_permission = true; 


} 
} 


@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
if (requestCode == REQUEST_PERMISSIONS) { 

if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

boolean_permission = true; 


} else { 
Toast.makeText(getApplicationContext(), "Please allow the permission", Toast.LENGTH_LONG).show(); 

} 
} 
} 
} 

धन्यवाद!