0

我已经编写了自己的自定义 ViewGroup 以能够显示多个子视图并动态移动它们并旋转它们。我还将这个自定义 ViewGroup 与显示相机预览的背景 SurfaceView 结合起来,以便始终将相机预览作为背景。

如果我只使用没有 Camera SurfaceView 的 ViewGroup,一切正常,但是当我添加 Camera SurfaceView 时,我得到了图像中记录的这种奇怪的剪切行为。请注意,仅当我移动或旋转视图时才会发生剪裁,它们似乎在原始位置未剪裁。

在下图中,蓝线应该是子视图的封闭矩形,它传递给我在自定义 ViewGroup 的所有子视图上调用的布局方法:

公共无效布局(int l,int t,int r,int b)

http://developer.android.com/reference/android/view/View.html#layout(int , int, int, int)

不要担心红线。

我的假设是,当 ViewGroup 首次创建时,它只考虑原始子视图的位置,这是为它们保留的空间。一旦我旋转它们,它们就会被剪裁到原来的矩形。

270度旋转:

270度旋转无相机背景

与相机背景相同(相机没有出现在屏幕截图上,这就是为什么它也是黑色的):

带相机背景的 270 度旋转

320度旋转:

320度旋转无相机背景

与相机相同

带相机背景的 320 度旋转

0度旋转:

0度旋转无相机背景

与相机相同

0 度旋转与相机背景

这是代码片段,我删掉了很多东西,但这是非常基本的功能(mLayout 是我的自定义 ViewGroup):

    public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      requestWindowFeature(Window.FEATURE_NO_TITLE); 
      cPreview = new CameraPreview(this);
      setContentView(cPreview, new ViewGroup.LayoutParams(FILL_PARENT, FILL_PARENT));
      test1();
    }

    private void test1() {
        addContentView(mLayout, new LayoutParams(LayoutParams.FILL_PARENT, 
            LayoutParams.FILL_PARENT));
    }
4

1 回答 1

1

找到的解决方法是在你的SurfaceView中设置这个标志setWillNotDraw(false) 理由在这里解释

于 2017-10-17T07:21:24.063 回答