截屏后,布局被拉伸

时间:2017-02-20 04:30:31

标签: android android-layout android-studio scrollview screenshot

我在android中以编程方式创建了屏幕截图活动。使用滚动视图后拍摄屏幕截图布局被拉伸。在拍摄屏幕截图之后我会拍摄照片。这将有助于您了解我的问题。我不知道怎么说?

在拍摄屏幕截图之前

image 1

拍摄屏幕后

image 2

你知道两张图片的区别。拍摄屏幕后的活动延长了我不知道为什么会这样吗?怎么解决这个?

我的代码:

public class MainActivity extends AppCompatActivity {

    File cacheDir;
    final Context context = this;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button print = (Button) findViewById(R.id.btn_print);

        print.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                takeScreenShot();
            }
        });



    }

       private void takeScreenShot() {

        View u =  findViewById(R.id.activity_main);

        int spec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
        u.measure(spec, spec);
        u.layout(0, 0, u.getMeasuredWidth(), u.getMeasuredHeight());

        Bitmap b = getBitmapFromView(u,u.getMeasuredHeight(),u.getMeasuredWidth());

        final String root = Environment.getExternalStorageDirectory().toString();

        File myPath = new File(root + "/saved_img");
        myPath.mkdirs();
        Random generator = new Random();
        int n = 10000;
        n = generator.nextInt(n);
        String fname = "Image-"+n+".jpg";
        File file = new File(myPath, fname);
        FileOutputStream fos = null;
        if(file.exists()) file.delete();
        try{
            fos = new FileOutputStream(file);
            b.compress(Bitmap.CompressFormat.JPEG, 100, fos);
            fos.flush();
            fos.close();


        } catch(FileNotFoundException e){
            e.printStackTrace();
        } catch (Exception e){
            e.printStackTrace();
        }

        Toast.makeText(this,"screen captured",Toast.LENGTH_SHORT).show();
    }



    public Bitmap getBitmapFromView(View u, int totalHeight, int totalWidth){
        Bitmap returnedBitmap = Bitmap.createBitmap(totalWidth,totalHeight , Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(returnedBitmap);

        Drawable bgDrawable = u.getBackground();
        if (bgDrawable != null)
            bgDrawable.draw(canvas);
        else
            canvas.drawColor(Color.WHITE);
        u.draw(canvas);
        return returnedBitmap;
    }
}

xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.own.scrollviewimg.MainActivity"

    >


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        >

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="print"
        android:id="@+id/btn_print"
        />


    <ScrollView
        android:id="@+id/horizontalscroll"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            >


            <ImageView
                android:layout_width="500dp"
                android:layout_height="200dp"
                android:src="@mipmap/ic_launcher"
                />

              <TextView
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:text="@string/testdata"
                  android:textSize="25sp"
                  android:textStyle="bold"
                  />


              </LinearLayout>

          </ScrollView>


        </LinearLayout>

</RelativeLayout>

3 个答案:

答案 0 :(得分:0)

试试这段代码

private void takeScreenShot() {
    Date now = new Date();
    android.text.format.DateFormat.format("yyyy-MM-dd_hh:mm:ss", now);

    try {
        String mPath = Environment.getExternalStorageDirectory().toString() + "/" + now + ".jpg";

        View v1 = getWindow().getDecorView().getRootView();
        v1.setDrawingCacheEnabled(true);
        Bitmap bitmap = Bitmap.createBitmap(v1.getDrawingCache());
        v1.setDrawingCacheEnabled(false);

        File imageFile = new File(mPath);

        FileOutputStream outputStream = new FileOutputStream(imageFile);
        int quality = 100;
        bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream);
        outputStream.flush();
        outputStream.close();

    } catch (Throwable e) {
        e.printStackTrace();
    }
}

答案 1 :(得分:0)

takeScreenShot()区块中,您为何使用View.MeasureSpec 您可以将view.getMeasuredHeight()view.getMeasuredWidth()用于根视图本身的高度和宽度,也可以尝试从已经充气的根中获取视图

View view = getWindow().getDecorView().getRootView();

所以只要注释掉

 /* int spec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
    u.measure(spec, spec);
    u.layout(0, 0, u.getMeasuredWidth(), u.getMeasuredHeight()); */

其余的都很好

注意:ImageView的宽度可能超过当前屏幕尺寸

答案 2 :(得分:0)

最后我找到了答案。这很简单。我只是回想一下按钮点击后的布局。

我的解答:

print.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                takeScreenShot();
                setContentView(R.layout.activity_main);
            }
        });