如何使区域的程序性屏幕截图与相应的纹理视图相匹配?

时间:2019-07-19 19:29:39

标签: android android-camera2

我正在尝试创建一个Android应用,该应用将允许用户在框架布局内保存与用户看到的纹理视图完全相同的纹理视图,但是生成的“保存的屏幕截图”会捕获完整的相机视图以及不需要的区域。

我的布局xml如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="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:orientation="vertical"
android:weightSum="1"
>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/frlayout"
    android:layout_weight="0.82"
    android:layout_width="match_parent"
        android:layout_height="0dp">
            <TextureView
            android:id="@+id/cameraView"
                android:background="@android:color/transparent"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
             />
    </FrameLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="0dp"
    android:layout_weight="0.07"
    android:orientation="horizontal"
    android:gravity="center"
    android:id="@+id/seekbarView">
<SeekBar
    android:id="@+id/seekBar"
    android:layout_width="fill_parent"
    android:layout_height="0dp"
    android:layout_weight="0.07"
    android:progress="1000"
    android:max="2000"
    />
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.11"
android:background="#004D79"
android:orientation="horizontal"
    android:id="@+id/controlView">
    <Button
        android:text="Save File"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:id="@+id/sfbutton" />
</LinearLayout>
</LinearLayout>

如您所见,纹理视图(垂直)占据了屏幕的82%,但看起来还包括了其他视图/元素所遮盖的所有内容。

获取纹理视图内容的代码部分如下:

   Bitmap bitmap;
    ViewGroup v1 = findViewById(R.id.frlayout);

    bitmap = textureView.getBitmap();
    bitmap = Bitmap.createBitmap( bitmap, 0, v1.getTop(), bitmap.getWidth(), v1.getHeight(), textureView.getTransform( null ), true );

我试图让它仅从框架布局的顶部开始拍摄照片,并且仅对布局的高度拍摄照片,但是到目前为止还没有运气。我的android应用是仅横向应用程序,因此getTransform(...)调用仅应用90度变换即可从纵向转换为横向。

我包括了一些照片;第一个是整个屏幕的实际屏幕抓图。第二个是上面代码的输出。它们相距几秒钟,所以相机在几像素内略有抖动,但是据我所知,图片中物体的大小和纵横比都很好-只是我得到的比我还多想要 comparison of real screengrab with programmatic version

编辑:我做了更多的分析,而且我认为它更加复杂。

在屏幕截图上,FrameLayout区域从(0,48)变为(1196,600)。以编程方式保存的区域从(0,0)变为(1196,897)。因此,宽度正确。 问题在于,在编程的屏幕快照中,框架布局区域上方的垂直“多余”为178,而在下方区域则为190,非常接近。看起来程序化屏幕截图显示的内容远远超过“正常”屏幕截图中其他视图的下方。很难解释,但程序屏幕截图的“下方”最大最大高度为48像素(包含电话充电状态等的条形图),而底部的模糊高度应为120像素,即面板的高度与按钮等。

0 个答案:

没有答案