如何防止在Android上的浮动窗口之外绘制

时间:2015-06-17 23:54:44

标签: android camera

我必须在Android上裁剪相机预览。

相机预览从曲面表面在曲面上绘制视图。当然我使用的是SurfaceView。 要裁剪预览,我将SurfaceView放在自定义ViewGroup中。我可以通过覆盖onMeasure()和覆盖onLayout()时内部表面的大小来管理这个自定义ViewGroup的大小。

$string

工作正常!视频被剪裁,每侧100px。

现在,我需要把它放在浮动窗口中。而问题是浮动窗口的内部非常好。但是在浮动窗口之外,这是一个完整的混乱。我甚至尝试剪辑画布,即使使用此解决方案,预览也会正确地剪切在窗口中,但它仍然在窗口外绘制。

[Image]

我几乎尝试了各种......剪辑...和...裁剪...参数。没有什么工作。

以下是在您的设备上测试的简短活动代码:

@overrides
void onMeasure(...) {
    // do sgt to compute the size of the component
}

@overrides
void onLayout(int l, int t, int b, int r) {
    mSurfaceView.layout(l-100,t-100,b+100,r+100)
}

以防万一,这是清单

中的活动声明
public class FloatingActivity extends ActionBarActivity {

    public Camera camera;

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

        GameView v = new GameView(this);

        camera = Camera.open(id)
        camera.setDisplayOrientation(90);

        setContentView(v);
    }


    public class GameView extends SurfaceView {
        private SurfaceHolder holder;

        public GameView(Context context) {
            super(context);

            holder = getHolder();
            holder.addCallback(new SurfaceHolder.Callback() {

                @Override
                public void surfaceDestroyed(SurfaceHolder holder) {
                }

                @Override
                public void surfaceCreated(SurfaceHolder holder) {
                    camera.setPreviewDisplay(getHolder());
                    camera.startPreview();
                }

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

        @Override
        public void layout(int l, int t, int r, int b) {
            super.layout(-200, -200, 600, 600);
        }

        @Override
        protected void dispatchDraw(Canvas canvas) {
            int save = canvas.save();
            canvas.clipRect(300,300,700,700);
            super.dispatchDraw(canvas);
            canvas.restoreToCount(save);
        }
    }


}

0 个答案:

没有答案