android - 使用 Surfaceview 尺寸调整相机视图
问题描述
我正在开发一个读取一些条形码的应用程序。在第一步中,我有一个很大的 SurfaceView,在那里我可以很好地看到相机预览,但现在我会将 Surfaceview 的尺寸设置为条形码的尺寸,但我的相机可视化效果很差(它太小)。有人可以帮我拉伸相机预览吗?谢谢
这里管理检测器和表面视图:
公共类 LettoreBarcode 扩展片段 {
View view;
SurfaceView surfaceView;
Handler handler;
private BarcodeDetector detector;
private CameraSource cameraSource;
private TextView code;
SparseArray<Barcode> items;
private static Button btnBack;
String barcode = "" ;
SparseArray<Articoli> groups = new SparseArray<Articoli>();
Context _context = null;
ProductsAdapter.ViewHolder _ViewHolder = null;
public LettoreBarcode(){
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_barcode_scanner, container, false);
surfaceView = (SurfaceView) view.findViewById(R.id.surfaceView);
detector = new BarcodeDetector.Builder(getActivity()).setBarcodeFormats(Barcode.ALL_FORMATS).build();
final Dialog d = new Dialog(getActivity());
btnBack = (Button) view.findViewById(R.id.btnBack);
handler = new Handler();
if(!detector.isOperational()){
Toast.makeText(getActivity(), "Detector non attivabile", Toast.LENGTH_LONG).show();
}
cameraSource = new CameraSource.Builder(getActivity(), detector).setAutoFocusEnabled(true).build();
surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
AttivaCamera();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
});
detector.setProcessor(new Detector.Processor<Barcode>() {
@Override
public void release() {
}
@Override
public void receiveDetections(Detector.Detections<Barcode> detections) {
items = detections.getDetectedItems();
if (items.size() > 0){
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
if (items.valueAt(0) != null){
//do something
handler.postDelayed(new Runnable() {
@Override
public void run() {
DisattivaCamera();
}
},10); //1000
}else
{
d.setContentView(R.layout.dialog_barcode_assente);
d.setTitle("Scanner");
d.setCancelable(true);
d.show();
DisattivaCamera();
}
}
});
}
}
});
btnBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
getActivity().onBackPressed();
}
});
return view;
}
private void AttivaCamera()
{
try{
cameraSource.start(surfaceView.getHolder());
}catch(IOException e){
Toast.makeText(getActivity(), "Errore nell'avvio della fotocamera", Toast.LENGTH_LONG).show();
}
}
private void DisattivaCamera()
{
cameraSource.stop();
}
}
这就是我用小表面视图可视化相机的方式:
https://i.stack.imgur.com/TMunJ.png
我是android开发的新手,所以如果代码中有很多错误,我很抱歉。
对不起我的英语也..
谢谢你们!
解决方案
为了只显示相机输入的一部分,即在屏幕上裁剪它,您需要一个具有适合相机框架纵横比的尺寸的表面视图,并用一些不透明的视图覆盖它以使其仅部分可见。不要将 SurfaeView 放在滚动布局中:
所以,而不是
<SurfaceView width: match_parent height: 400dp />
您需要例如 FrameLayout,如下所述:是否可以裁剪相机预览?
这不会改变到达条形码检测器的帧。但这不应该让你担心;检测器将正确处理未裁剪的图像。
推荐阅读
- javascript - 添加 *ngFor 索引值会导致“超出最大调用堆栈大小”
- javascript - fullpage.js 部分中的可滚动 div 不起作用
- javascript - 为什么只点击第一个表,但所有表都排序?
- reactjs - 我想传递索引并将我的所有数据显示到下一个屏幕
- c# - 即使有两个接收者正在监听队列,Azure 队列消息也应该发送给一个接收者,在 C# 中实现
- python - 在 tkinter,时钟应用程序中的帧之间切换
- amazon-web-services - AWS Ansible iam_policy:请求中包含的安全令牌无效
- php - PHP脚本安装问题。已遵循页面中给出的所有步骤:https://h-educate.com/publish-php-scripts/
- android - 按下按钮后如何更改应用程序的主题?
- mysql-cli - 用逗号以 CSV 格式导出 Mysql 数据