私には密接に関連している2つの主要な問題があります。私はこれらの問題をプログラムの観点から見ています。
(1)-特定のレイアウトのコンテンツのスクリーンショットを撮りたい。つまり、ScrollView
がLinearLayout
にネストされている。
(2)-ScrollView
には画面からこぼれるコンテンツが含まれているため(したがってスクロールが可能になります)、スクリーンショットに画面に表示されない要素が含まれていることを確認するにはどうすればよいですか?
これは私が使用しているコードの現在のブロックです。スクリーンショットを撮る仕事をしますが、画面全体に対してのみです。 これは、R.id.boss
がScrollView
のIDであり、メインのLinearLayout
ではない場合でも同様です。
View view = findViewById(R.id.boss);
View v = view.getRootView();// this does not seem to make a difference
v.setDrawingCacheEnabled(true);
v.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());
v.buildDrawingCache(true);
Bitmap b = Bitmap.createBitmap(u.getDrawingCache());
v.setDrawingCacheEnabled(false);
前もって感謝します。
編集:
私はいくつかの間違いをしました。間違ったリソースであるR.id.boss
を使用しました。画面外の部分を除いて、スクロールビューだけのスクリーンショットを撮ることができるようになりました。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/boss"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:layout_gravity="top"
Android:orientation="vertical" >
<TextView
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:text="F"
Android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:text="Analyze via image URL"
Android:textAppearance="?android:attr/textAppearanceSmall" />
<LinearLayout
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
>
<EditText
Android:id="@+id/mUrl"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_weight="0.7"
Android:text="http://" >
<requestFocus />
</EditText>
<ImageView
Android:id="@+id/call"
Android:layout_width="75dp"
Android:layout_height="50dp"
Android:layout_weight="0.3"
Android:text="ABC"
Android:src="@drawable/run" />
</LinearLayout>
<TextView
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:text="ABC"
Android:textAppearance="?android:attr/textAppearanceSmall" />
<LinearLayout
Android:layout_width="fill_parent"
Android:layout_height="wrap_content" >
<EditText
Android:id="@+id/filepath"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_weight="0.55" />
<ImageView
Android:id="@+id/cam"
Android:layout_width="75dp"
Android:layout_height="50dp"
Android:layout_weight="0.15"
Android:src="@drawable/cam" />
<ImageView
Android:id="@+id/browse"
Android:layout_width="75dp"
Android:layout_height="50dp"
Android:layout_weight="0.15"
Android:src="@drawable/folder"
Android:text="B" />
<ImageView
Android:id="@+id/upload"
Android:layout_width="75dp"
Android:layout_height="50dp"
Android:layout_weight="0.15"
Android:src="@drawable/run"
Android:text="A" />
</LinearLayout>
<LinearLayout
Android:id="@+id/baba"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:orientation="vertical" >
<ScrollView
Android:id="@+id/scroll"
Android:layout_width="fill_parent"
Android:layout_height="150dp"
Android:layout_weight="0.7" >
<LinearLayout
Android:layout_width="fill_parent"
Android:layout_height="186dp"
Android:orientation="vertical" >
<ImageView
Android:id="@+id/pic"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:layout_weight="1" />
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_weight="1"
Android:text="Facial recognition"
Android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
Android:id="@+id/text3"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_weight="1"
Android:text="Small Text"
Android:textAppearance="?android:attr/textAppearanceSmall" />
<TextView
Android:id="@+id/avmarwe"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_weight="1"
Android:text="Gender and age"
Android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
Android:id="@+id/text1"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_weight="1"
Android:text="Small Text"
Android:textAppearance="?android:attr/textAppearanceSmall" />
<TextView
Android:id="@+id/skahasd"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_weight="1"
Android:text="Expression and mood"
Android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
Android:id="@+id/text2"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_weight="1"
Android:text="Small Text"
Android:textAppearance="?android:attr/textAppearanceSmall" />
<TextView
Android:id="@+id/dsfsfs"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_weight="1"
Android:text="Celebrity Facial Match"
Android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
Android:id="@+id/text4"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_weight="1"
Android:text="Small Text"
Android:textAppearance="?android:attr/textAppearanceSmall" />
</LinearLayout>
</ScrollView>
</LinearLayout>
<LinearLayout
Android:id="@+id/linearLayout1"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_gravity="bottom" >
<Button
Android:id="@+id/c"
Android:layout_width="fill_parent"
Android:layout_height="50dp"
Android:layout_weight="0.7"
Android:text="" />
<Button
Android:id="@+id/share"
Android:layout_width="70dp"
Android:layout_height="50dp"
Android:layout_weight="0.3"
Android:text="" />
</LinearLayout>
</LinearLayout>
皆さんのおかげで、私はついに何が悪かったのかを見つけました。
View v = view.getRootView();
は、不要なルートビューを呼び出すため、使用しないでください。間違ったリソースIDを入力したため、これは違いがないと誤って考えました。
MeasureSpec
はどういうわけか幅と高さをうまく説明していませんでした。だから私は別の方法を使うことになった:
...
ScrollView z = (ScrollView) findViewById(R.id.scroll);
int totalHeight = z.getChildAt(0).getHeight();
int totalWidth = z.getChildAt(0).getWidth();
u.layout(0, 0, totalWidth, totalHeight);
...
ScrollViewの全高は、それが持つ単一の子要素によって決定できるためです。
これらの変更を行った後、ネストされたScrollViewとそのすべてのコンテンツ(表示されているかどうかに関係なく)のスクリーンショットを撮ることができます。興味のある人のために、ビットマップの保存を含むコードのブロックは次のとおりです。
View u = findViewById(R.id.scroll);
u.setDrawingCacheEnabled(true);
ScrollView z = (ScrollView) findViewById(R.id.scroll);
int totalHeight = z.getChildAt(0).getHeight();
int totalWidth = z.getChildAt(0).getWidth();
u.layout(0, 0, totalWidth, totalHeight);
u.buildDrawingCache(true);
Bitmap b = Bitmap.createBitmap(u.getDrawingCache());
u.setDrawingCacheEnabled(false);
//Save bitmap
String extr = Environment.getExternalStorageDirectory().toString() + File.separator + "Folder";
String fileName = new SimpleDateFormat("yyyyMMddhhmm'_report.jpg'").format(new Date());
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(getContentResolver(), b, "Screen", "screen");
}catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
これを試してみてください
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);
}
編集:OPのコメントを見た後
新しいアクティビティについて考える必要はまったくありません。現在アクティビティにいるとします。レイアウトAはアクティビティのメインレイアウトであり、レイアウトBとCはレイアウトA内の2つの子レイアウトです。このように
Layout A -> Parent
|
-------Layout B
|
-------Layout C
Cのみのスクリーンショットを撮りたい場合
1)アクティビティのonCreate()内
LinearLayout myCLayout = (LinearLayout)this.findViewbyId(R.id.my_c_layout);
ViewTreeObserver vto = myCLayout.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
//fully drawn, no need of listener anymore
myCLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
getDrawingBitmap();
}
});
ここで、getDrawingBitmap()はスクリーンショットを撮るための関数です。
public void getDrawingBitmap(){
LinearLayout myCLayout = (LinearLayout)this.findViewbyId(R.id.my_c_layout);
Bitmap b = myCLayout.getDrawingCache();
File file = saveBitmapAsFile(b);
}
編集:ScrollViewの場合
私はそれを試したことがありません..しかし、私はあなたがこれを行うことができると思います..
1)最初にscrollViewをオーバーライドし、onMeasure関数をオーバーライドします。
public class MyScrollView extends ScrollView{
public MyScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
super.onMeasure(widthMeasureSpec, yourFullScrollViewHeight));
}
}
レイアウトでMyScrollViewを使用します。ここでyourFullScrollViewHeightは、スクリーンショットを撮る必要があるすべてのscrollViewコンテンツの高さです。これを試したことはありませんが、機能する可能性があります。
これがあなたが望む正確な解決策です、それはあなたのScrollView
に隠されたコンテンツを含む画面全体を表示します
LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE);
FrameLayout root = (FrameLayout) inflater.inflate(R.layout.activity_main, null); // activity_main is UI(xml) file we used in our Activity class. FrameLayout is root view of my UI(xml) file.
root.setDrawingCacheEnabled(true);
Bitmap bitmap = getBitmapFromView(this.getWindow().findViewById(R.id.frameLayout)); // here give id of our root layout (here its my FrameLayout's id)
bitmap
にImageView
を表示するか、必要に応じて使用します。
楽しい..
私もこの問題を抱えていて、自分でコーディングしました。
このコードを使用して、レイアウト全体のスクリーンショットを撮りました。
リストのサイズといくつかの数学的な項目を変更しました。
以下を参照してください ウェブサイト 、