web-dev-qa-db-ja.com

Android)で特定のレイアウトの「スクリーンショット」を撮る

私には密接に関連している2つの主要な問題があります。私はこれらの問題をプログラムの観点から見ています。

(1)-特定のレイアウトのコンテンツのスクリーンショットを撮りたい。つまり、ScrollViewLinearLayoutにネストされている。

(2)-ScrollViewには画面からこぼれるコンテンツが含まれているため(したがってスクロールが可能になります)、スクリーンショットに画面に表示されない要素が含まれていることを確認するにはどうすればよいですか?

これは私が使用しているコードの現在のブロックです。スクリーンショットを撮る仕事をしますが、画面全体に対してのみです。 これは、R.id.bossScrollViewの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>
12
Reuben L.

皆さんのおかげで、私はついに何が悪かったのかを見つけました。

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();
            }
18
Reuben L.

これを試してみてください

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);
}
3
Mahtab

編集: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コンテンツの高さです。これを試したことはありませんが、機能する可能性があります。

2
Krishnabhadra

これがあなたが望む正確な解決策です、それはあなたの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)

bitmapImageViewを表示するか、必要に応じて使用します。
楽しい..

1
Nirav Dangi

私もこの問題を抱えていて、自分でコーディングしました。

このコードを使用して、レイアウト全体のスクリーンショットを撮りました。

リストのサイズといくつかの数学的な項目を変更しました。

以下を参照してください ウェブサイト

0
muruganvel