我的所有内容都与https://github.com/googlesamples/android-vision/tree/master/visionSamples/multi-tracker中的示例完全相同,但我的活动布局是这样的:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/topLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:keepScreenOn="true"
android:weightSum="100"
android:orientation="horizontal">
<be.citylife.communitypurchaseapp.view.camera.CameraSourcePreview
android:id="@+id/preview"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="60">
<be.citylife.communitypurchaseapp.view.camera.GraphicOverlay
android:id="@+id/overlay"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</be.citylife.communitypurchaseapp.view.camera.CameraSourcePreview>
<FrameLayout
android:id="@+id/sideContainer"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="40"/>
</LinearLayout>
我的平板电脑处于横向状态,我希望cameraPreviewSource始终保持在高处并填满整个屏幕,然后立即关闭它我有一个片段填充其余部分。
此布局有效,但我的previewsource不能填满整个高度。它上面有一个黑色横幅。即使我的宽度实际上比我想要的还小,你可以在屏幕截图中看到:
http://i61.tinypic.com/vctmw0.png
我在CameraLourcePreview中使用onLayout函数中的宽度和高度,但它没有帮助。我在预览中知道它确实将屏幕填满了屏幕的底部,但是在平板电脑上它并不是。
任何人都知道如何解决这个问题?
编辑:
我认为这与此有关:
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
int width = 320;
int height = 240;
if (mCameraSource != null) {
Size size = mCameraSource.getPreviewSize();
if (size != null) {
width = size.getWidth();
height = size.getHeight();
}
}
// Swap width and height sizes when in portrait, since it will be rotated 90 degrees
if (isPortraitMode()) {
int tmp = width;
width = height;
height = tmp;
}
final int layoutWidth = right - left;
final int layoutHeight = bottom - top;
// Computes height and width for potentially doing fit width.
int childWidth = layoutWidth;
int childHeight = (int)(((float) layoutWidth / (float) width) * height);
// If height is too tall using fit width, does fit height instead.
if (childHeight > layoutHeight) {
childHeight = layoutHeight;
childWidth = (int)(((float) layoutHeight / (float) height) * width);
}
for (int i = 0; i < getChildCount(); ++i) {
getChildAt(i).layout(0, 0, childWidth, childHeight);
}
try {
startIfReady();
} catch (IOException e) {
Log.e(TAG, "Could not start camera source.", e);
}
}
这是关于CameraSourcePreview的onlayout方法。
答案 0 :(得分:5)
评论或删除CameraSourcePreview下面的行,它应该没问题。我遇到了和你一样的问题,现在已经解决了。
if (childHeight > layoutHeight) {
childHeight = layoutHeight;
childWidth = (int)(((float) layoutHeight / (float) height) * width);
}
答案 1 :(得分:0)
应该将其置于全屏模式:D有许多其他模式可供选择。如果这不起作用,请删除自动生成的
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
/** gets called when a Menu.onClick happens
*
* @param item the ID of the clicked Item
*/
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
int id = item.getItemId();
if (id == R.id.action_settings) {
//TODO
}
return super.onOptionsItemSelected(item);
}
}
答案 2 :(得分:0)
可能与相机的纵横比以及它如何吸入容器有关。
如果您正在使用的相机预览保持纵横比并使预览适合容器,那么您肯定会得到黑条。这是因为大多数相机的传感器产生的图像被设计为适合相对于1920x1080px(或16:9宽高比框)的空间。
您需要的是隐藏侧面的额外空间以及根据高度填充预览。也就是说,如果您不介意在预览时向用户隐藏某些图像。可能无法直接使用您正在使用的视图执行此操作,但如果将对象放入另一个布局容器中,则应该相对简单。
希望这有帮助!