2014-09-04 88 views
4

自从几天以来,我就陷入了这个问题。我想要的仅仅是在屏幕上显示相机的一部分。这就是我想要的: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.有相机的顶部另一种观点则也选择,但我不能用它冗长的原因

+0

几个问题:1)为什么你不能使用'setContentView'? 2)为什么要在全屏中使用“SurfaceView”,但是“高度减少的ScrollView”?你想只显示图像的一部分,但能够滚动它吗? – mbmc 2014-09-09 05:26:25

+0

1)我不能使用'setContentView',因为我正在为phonegap构建一个插件。我的观点基本上会在浏览器之上。因此。 2)是。基本上我试图把摄像机的feed放在scrollview中,并将scroller的高度限制为200.这样我只能看到feed的一部分。 – Jatin 2014-09-09 05:38:24

+0

@InfiniteRecursion添加了方法 – Jatin 2014-09-09 09:09:37

回答

1

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

+0

我试过了。没有工作。你能提供一个更具体的说法吗? – Jatin 2014-09-09 09:59:43

+0

你可以发布你试过的代码吗,所以我可以检查它。 – 2014-09-09 14:21:55

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> 
+0

我刚刚意识到这不是一个完整的答案。它有一个问题。文本视图实际上在底部,因为它应该在滚动下方。做'android:layout_below =“@ + id/scrollView”'没有帮助。 – Jatin 2014-09-15 11:43:33

+0

就像你在图像中显示的那样,它很难理解你希望textview不在摄像机视图下面,而是在scrollview中。无论如何,您仍然可以将该textview放在具有修复维度的滚动视图的子布局中。请参阅编辑 – dhams 2014-09-16 03:12:03

+0

不。这个新的编辑根本不起作用。现在相机占用全屏幕。 我的意思是滚动下的文字视图,它应该在相机下面而不是在屏幕的底部。 – Jatin 2014-09-16 09:10:34

1

试试这个layout.But不明白为什么使用滚动视图。

我张贴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> 
+0

问题的答案是,'TextView'将占据屏幕的其余部分。我想要的是TextView是'wrap_content',屏幕的其余部分是空的(基本上是在下面的图层显示,这也是我使用'addContentView'的原因) – Jatin 2014-09-15 05:33:17