我必须在Android上裁剪相机预览。
相机预览从曲面表面在曲面上绘制视图。当然我使用的是SurfaceView。 要裁剪预览,我将SurfaceView放在自定义ViewGroup中。我可以通过覆盖onMeasure()和覆盖onLayout()时内部表面的大小来管理这个自定义ViewGroup的大小。
$string
工作正常!视频被剪裁,每侧100px。
现在,我需要把它放在浮动窗口中。而问题是浮动窗口的内部非常好。但是在浮动窗口之外,这是一个完整的混乱。我甚至尝试剪辑画布,即使使用此解决方案,预览也会正确地剪切在窗口中,但它仍然在窗口外绘制。
[]
我几乎尝试了各种......剪辑...和...裁剪...参数。没有什么工作。
以下是在您的设备上测试的简短活动代码:
@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);
}
}
}