0

独自のカスタムViewGroupをプログラムして、複数の子ビューを表示したり、動的に移動したり回転させたりできるようにしました。また、このカスタムViewGroupを、カメラプレビューを常に背景として持つために、カメラプレビューを表示している背景SurfaceViewと組み合わせます。

Camera SurfaceViewなしでViewGroupを使用するだけですべてが正常に機能しますが、Camera SurfaceViewを追加すると、画像に示されているように、この奇妙なクリッピング動作が発生します。ビューを移動または回転した場合にのみクリッピングが発生することに注意してください。元の場所ではクリップが解除されているように見えます。

次の画像では、青い線は、カスタムViewGroupのすべての子ビューで呼び出すlayoutメソッドに渡される子ビューの囲み長方形であると想定されています。

public void layout(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 に答える