捕捉布局并将其保存为图像

huangapple go评论86阅读模式
英文:

Capture the layout and save it as image

问题

我有以下的代码,我想当我点击按钮时,将会捕获并保存**"@+id/layout_capture"**作为一个带有指定名称的图像到相册中。
我已经尝试过[这个][1],但它在我的代码中不起作用。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <LinearLayout
        android:id="@+id/layout_capture"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_gravity="center"
        android:gravity="center_horizontal"
        android:background="#AFA4BF"
        android:padding="10dp">

        <ImageView
            android:id="@+id/noaman_1"
            android:layout_width="89dp"
            android:layout_height="89dp"
            android:src="@drawable/ic_launcher_foreground"
            android:background="@drawable/ic_launcher_background"/>

        <!-- First Semister Result -->
        <TextView
            android:id="@+id/first_semis1"
            android:layout_width="180dp"
            android:layout_height="24dp"
            android:layout_marginTop="20dp"
            android:text="@string/first_semis"
            android:textAppearance="@style/first_semis"
            android:gravity="center_horizontal|top"/>

        <TextView
            android:id="@+id/first_semis2"
            android:layout_width="180dp"
            android:layout_height="24dp"
            android:text="@string/first_semis"
            android:textAppearance="@style/first_semis"
            android:gravity="center_horizontal|top"/>
    </LinearLayout>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/first_semis"/>
</LinearLayout>

> 这是屏幕内容

[![enter image description here][2]][2]

> 这是捕获之后

[![enter image description here][3]][3]

> **感谢您的时间 ❤**

  [1]: https://stackoverflow.com/questions/32779405/save-part-of-activity-fragment-as-image
  [2]: https://i.stack.imgur.com/TVJin.png
  [3]: https://i.stack.imgur.com/OFHi0.png

<details>
<summary>英文:</summary>

I have the following code below, I want to when I click on the button, the **&quot;@+id/layout_capture&quot;** will be captured and saved as an image .to the gallery with specified name.
I&#39;ve tried [this][1] but doesn&#39;t work with my code

    &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
    &lt;LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    xmlns:app=&quot;http://schemas.android.com/apk/res-auto&quot;
    xmlns:tools=&quot;http://schemas.android.com/tools&quot;
    android:layout_width=&quot;match_parent&quot;
    android:layout_height=&quot;match_parent&quot;
    android:gravity=&quot;center&quot;
    android:orientation=&quot;vertical&quot;
    tools:context=&quot;.MainActivity&quot;&gt;



    &lt;LinearLayout
        android:id=&quot;@+id/layout_capture&quot;
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:orientation=&quot;vertical&quot;
        android:layout_gravity=&quot;center&quot;
        android:gravity=&quot;center_horizontal&quot;
        android:background=&quot;#AFA4BF&quot;
        android:padding=&quot;10dp&quot;
        &gt;

    &lt;ImageView
        android:id=&quot;@+id/noaman_1&quot;
        android:layout_width=&quot;89dp&quot;
        android:layout_height=&quot;89dp&quot;
        android:src=&quot;@drawable/ic_launcher_foreground&quot;
        android:background=&quot;@drawable/ic_launcher_background&quot;

        /&gt;
    &lt;!-- First Semister Result --&gt;
    &lt;TextView
        android:id=&quot;@+id/first_semis1&quot;
        android:layout_width=&quot;180dp&quot;
        android:layout_height=&quot;24dp&quot;
        android:layout_marginTop=&quot;20dp&quot;
        android:text=&quot;@string/first_semis&quot;
        android:textAppearance=&quot;@style/first_semis&quot;
        android:gravity=&quot;center_horizontal|top&quot;
        /&gt;
    &lt;TextView
        android:id=&quot;@+id/first_semis2&quot;
        android:layout_width=&quot;180dp&quot;
        android:layout_height=&quot;24dp&quot;
        android:text=&quot;@string/first_semis&quot;
        android:textAppearance=&quot;@style/first_semis&quot;
        android:gravity=&quot;center_horizontal|top&quot;
        /&gt;

    &lt;/LinearLayout&gt;
      &lt;Button
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:text=&quot;@string/first_semis&quot;
         /&gt;

       &lt;/LinearLayout&gt;


&gt; this is the screen content 

[![enter image description here][2]][2]
&gt; and this after capture

[![enter image description here][3]][3] 

&gt; **thanks for your time ❤**

  [1]: https://stackoverflow.com/questions/32779405/save-part-of-activity-fragment-as-image
  [2]: https://i.stack.imgur.com/TVJin.png
  [3]: https://i.stack.imgur.com/OFHi0.png

</details>


# 答案1
**得分**: 1

```xml
我已经复制了您的layout.xml文件,并在代码中简单地添加了onClick操作:

    <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/first_semis"
            android:onClick="capture"
            />

我在您提供的链接中找到的代码确实完美运行:

以下是我的MainActivity.java文件:

    package com.example.androidlayout;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.content.res.Configuration;
    import android.graphics.Bitmap;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.drawable.Drawable;
    import android.os.Bundle;
    import android.provider.MediaStore;
    import android.view.View;
    import android.widget.LinearLayout;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
        }
        public void capture(View view){
            Bitmap photo = getBitmapFromView((LinearLayout) findViewById(R.id.layout_capture));
            String savedImageURL = MediaStore.Images.Media.insertImage(
                    getContentResolver(),
                    photo,
                    "your_layout",
                    "image"
            );
        }
        public static Bitmap getBitmapFromView(View view) {
            //Define a bitmap with the same size as the view
            Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(),Bitmap.Config.ARGB_8888);
            //Bind a canvas to it
            Canvas canvas = new Canvas(returnedBitmap);
            //Get the view's background
            Drawable bgDrawable =view.getBackground();
            if (bgDrawable!=null)
                //has background drawable, then draw it on the canvas
                bgDrawable.draw(canvas);
            else
                //does not have background drawable, then draw white background on the canvas
                canvas.drawColor(Color.WHITE);
            // draw the view on the canvas
            view.draw(canvas);
            //return the bitmap
            return returnedBitmap;
        }
    }

它将图像保存到您的图库中。
英文:

I've copied your layout.xml file and simply added the onClick Action to the code:

&lt;Button
android:layout_width=&quot;wrap_content&quot;
android:layout_height=&quot;wrap_content&quot;
android:text=&quot;@string/first_semis&quot;
android:onClick=&quot;capture&quot;
/&gt;

I used the code in your link and it does work perfectly:

Here is my MainActivity.java file:

package com.example.androidlayout;
import androidx.appcompat.app.AppCompatActivity;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.LinearLayout;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void capture(View view){
Bitmap photo = getBitmapFromView((LinearLayout) findViewById(R.id.layout_capture));
String savedImageURL = MediaStore.Images.Media.insertImage(
getContentResolver(),
photo,
&quot;your_layout&quot;,
&quot;image&quot;
);
}
public static Bitmap getBitmapFromView(View view) {
//Define a bitmap with the same size as the view
Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(),Bitmap.Config.ARGB_8888);
//Bind a canvas to it
Canvas canvas = new Canvas(returnedBitmap);
//Get the view&#39;s background
Drawable bgDrawable =view.getBackground();
if (bgDrawable!=null)
//has background drawable, then draw it on the canvas
bgDrawable.draw(canvas);
else
//does not have background drawable, then draw white background on the canvas
canvas.drawColor(Color.WHITE);
// draw the view on the canvas
view.draw(canvas);
//return the bitmap
return returnedBitmap;
}
}

It saves the image to your gallery.

huangapple
  • 本文由 发表于 2020年8月18日 22:11:19
  • 转载请务必保留本文链接:https://go.coder-hub.com/63470497.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定