我有一些问题唠叨了我一段时间了。
我的自定义相机应用程序显示了实时预览。我还在使用FaceDetection来更好地关注人脸。当我检查我在Gallery中拍摄的图片时,我可以正确地看到矩形。下一步是在实时预览中显示FaceDetection-Rectangle。所以我决定使用一个画布来获取Preview-Rectangle的坐标,并将它们转换为画布可以使用的坐标。
我的问题是我必须将预览旋转90度才能正确显示预览。因此,当我在绘制之前旋转画布视图时,矩形也会正确显示并移动右轴。但是矩形可以从左侧和右侧移出屏幕,并且仅使用大约一半的可用高度。我认为轮换引起了麻烦,但我无法把事情弄清楚。有人有个主意吗?
屏幕截图(我添加了紫色线条,以显示红色矩形无法到达的顶部/底部部分):
预览
mCamera = Camera.open();
mCamera.getParameters();
mCamera.setDisplayOrientation(90);
mCamera.setFaceDetectionListener(new FaceDetectionListener() {
@Override
public void onFaceDetection(Face[] faces, Camera camera) {
if(mDraw != null) {
mDraw.update(f.rect, f);
}
}
}
}
});
mCamera.startFaceDetection();
}
private DrawOnTop mDraw = null;
public void setDrawOnTop(DrawOnTop d) {
this.mDraw = d;
}
DrawOnTop:
public DrawOnTop(Context context) {
super(context);
myColor = new Paint();
myColor.setStyle(Paint.Style.STROKE);
myColor.setColor(Color.RED);
}
@Override
protected void onDraw(Canvas canvas) {
rect.set((((rect.left+1000)*1000) / WIDTH_DIVISOR),(((rect.top+1000)*1000) / HEIGHT_DIVISOR),(((rect.right+1000)*1000) / WIDTH_DIVISOR),(((rect.bottom+1000)*1000) / HEIGHT_DIVISOR ));
setRotation(90);
canvas.drawRect(rect, myColor);
}
public void update(Rect rect, Face face) {
this.invalidate();
this.rect = rect;
this.face = face;
}
修改 我得出结论,这是一个罕见但已知的错误,到目前为止还没有其他解决办法,但迫使应用程序进入横向模式。工作正常,但尺寸看起来有点拉伸或铆接,具体取决于用户操作的视角。
答案 0 :(得分:2)
基本上,你只需要缩放紫色矩形。找到定义它的位置,然后将其放在画布上并执行以下操作:
float screenWidth = /*get the width of your screen here*/;
float xScale = rect.width / screenWidth;
float screenHeight = /*get the height of your screen here*/;
float yScale = rect.height / screenWidth;
canvas.setScaleX(xScale);
canvas.setScaleY(yScale);
这样,坐标将被正确翻译。
第二次编辑(回复您的评论):如果您愿意,也可以使用视图执行此操作。 玩得开心。