只获得相机的顶部

时间:2014-09-04 07:59:47

标签: java android android-camera

我几天都陷入了这个问题。我想要的只是在屏幕上显示的相机的一部分。这就是我想要的:enter image description here

这就是我所做的:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="200dp">

    <ScrollView
            android:id="@+id/scrollView"
            android:layout_width="match_parent"
            android:layout_height="160dp"
            android:scrollbars="none"
            android:fillViewport="true"
            >
        <LinearLayout
                android:id="@+id/linearLayoutBeautyContent"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:orientation="vertical">
            <SurfaceView
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:id="@+id/surfaceViewBeautyCamera"/>
        </LinearLayout>
    </ScrollView>


    <TextView
            android:id="@+id/scanText"
            android:text="Scanning..."
            android:layout_height="wrap_content"
            android:layout_width="match_parent">
    </TextView>
</LinearLayout>



@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        final LayoutInflater inflator = getLayoutInflater();
        final LinearLayout inflate = (LinearLayout) inflator.inflate(R.layout.main, null);

        final SurfaceView surfaceView = (SurfaceView) inflate.findViewById(R.id.surfaceViewBeautyCamera);
        final SurfaceHolder holder = surfaceView.getHolder();

        WindowManager mW = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
        int screenWidth = mW.getDefaultDisplay().getWidth();
        int screenHeight = mW.getDefaultDisplay().getHeight();

        final ViewGroup.LayoutParams slayout = surfaceView.getLayoutParams();
        slayout.width = screenWidth;
        slayout.height = screenHeight;
        surfaceView.requestLayout();

        final ScrollView beautyContent = (ScrollView) inflate.findViewById(R.id.scrollView);

        holder.addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                try {
                    camera = getCamera();
                    camera.setPreviewDisplay(holder);
                    camera.setDisplayOrientation(90);
                    camera.startPreview();
                } catch (IOException e) {
                    Log.i("Lucy", e.getMessage());
                }
            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
            }
        });

        addContentView(inflate, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
    }
public Camera getCamera() {
    try {
        final Camera open = Camera.open();
        return open;
    } catch (Exception ex) {
        Log.i("Lucy", ex.getMessage());
        return null;
    }
}

当我这样做时,我得到: enter image description here

想法是将SurfaceView的大小设置为全屏但减小滚动视图的大小。但我想要的是第一张图片。我做错了什么?

观察:

当我完全滚动视图时。返回主屏幕并再次打开应用程序。我得到了第一张图片。但如果我再次滚动并返回主要回来,我会得到第二张图片。

还有其他策略吗?

PS:  1.在相机顶部有其他视图也是选项,但我不能长时间使用它

3 个答案:

答案 0 :(得分:1)

问题是元素的高度设置: 你的根元素应该是一个相对布局,然后你可以设置摄像机视图的固定高度,并设置textview,文本高度匹配父级,layout_below滚动视图。

答案 1 :(得分:1)

我不知道为什么你把surfaceView放在scrollView但我忍受了你的布局文件,它在你预期的快照结果中展示了它。

<强>编辑:

   <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="200dp"
    android:orientation="vertical" >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <ScrollView
            android:id="@+id/scrollView"
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:fillViewport="true"
            android:scrollbars="none" >

            <LinearLayout
                android:id="@+id/linearLayoutBeautyContent"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical" >

                <SurfaceView
                    android:id="@+id/surfaceViewBeautyCamera"
                    android:layout_width="match_parent"
                    android:layout_height="160dp" />
                 <TextView
                     android:id="@+id/scanText"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     android:layout_alignParentBottom="true"
                     android:text="Scanning..." >
                 </TextView>
            </LinearLayout>
      </ScrollView>
   </RelativeLayout>
</LinearLayout>

答案 2 :(得分:1)

尝试这个布局。但是不明白为什么要使用scrollView。

我发布了2个布局

表面平均相机面的第一个是160dp

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<LinearLayout
    android:id="@+id/linearLayoutBeautyContent"
    android:layout_width="fill_parent"
    android:layout_height="160dp"
    android:orientation="vertical" >

    <SurfaceView
        android:id="@+id/surfaceViewBeautyCamera"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />
</LinearLayout>



    <TextView
        android:id="@+id/scanText"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
         android:layout_alignParentBottom="true"
        android:layout_below="@id/linearLayoutBeautyContent"
        android:background="#000000"
        android:text="Scanning..." >
    </TextView>

    </RelativeLayout>

第二个是,相机将捕捉全屏大小的图片,但在捕获时你只能看到160个窗口

  <?xml version="1.0" encoding="utf-8"?>
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:orientation="vertical" >

<LinearLayout
    android:id="@+id/linearLayoutBeautyContent"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_alignParentTop="true"
    android:orientation="vertical" >

    <SurfaceView
        android:id="@+id/surfaceViewBeautyCamera"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />
</LinearLayout>

<TextView
    android:id="@+id/scanText"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_alignParentBottom="true"
    android:layout_marginTop="160dp"
    android:background="#000000"
    android:text="Scanning..." >
</TextView>

</RelativeLayout>