26.09.2015, 22:14. Просмотров 246. Ответов 0
AlertDialog Camera SurfaceView заниженная яркость в превью
Перенес работу с камерой в AlertDialog и получил низкую яркость изображения в превью, такое ощущение, что оно затемняется также, как и куски активити, находящиеся под диалогом.
Скриншот
Сами снимки имеют нормальную яркость, проблема только в превью.
Java |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
| public class CameraDialogBuilder
extends AlertDialog.Builder
implements SurfaceHolder.Callback, View.OnClickListener, Camera.PictureCallback, Camera.PreviewCallback, Camera.AutoFocusCallback{
public CameraDialogBuilder(final Context context) {
super(context);
LinearLayout linearLayout = createMainLayout(context);
preview = new SurfaceView(context);
linearLayout.addView(preview);
surfaceHolder = preview.getHolder();
surfaceHolder.addCallback(this);
ClearCamera();
camera = Camera.open();
setView(linearLayout);
setPositiveButton(android.R.string.cancel.OK, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
});
setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
d = create();
d.show();
}
public void surfaceCreated(SurfaceHolder holder) {
if(camera==null){
d.dismiss();
return;
}
try
{
camera.setPreviewDisplay(holder);
camera.setPreviewCallback(this);
}
catch (IOException e)
{
e.printStackTrace();
}
Camera.Size previewSize = camera.getParameters().getPreviewSize();
float aspect = (float) previewSize.width / previewSize.height;
int previewSurfaceHeight = preview.getHeight();
ViewGroup.LayoutParams lp = preview.getLayoutParams();
camera.setDisplayOrientation(90);
lp.height = previewSurfaceHeight;
lp.width = (int) (previewSurfaceHeight / aspect);
preview.setLayoutParams(lp);
camera.startPreview();
}
private LinearLayout createMainLayout(Context context) {
LinearLayout linearLayout = new LinearLayout(context);
linearLayout.setGravity(Gravity.CENTER_HORIZONTAL);
linearLayout.setOrientation(LinearLayout.VERTICAL);
linearLayout.setMinimumHeight(getLinearLayoutMinHeight(context));
linearLayout.setPadding(10,10,10,10);
return linearLayout;
}
} |
|
открытие диалгоа в mainActivity
Java |
1
| CameraDialogBuilder cameraDialogBuilder=new CameraDialogBuilder(this).setCameraDialogListener(this); |
|
Если SurfaceView разместить в активити, а не в диалоге, то этотже код не имеет проблем с яркостью превью. Помогите решить проблему.
Пробовал менять уровень затемнения, делать размытым задний фон, все это вообще не вносит никаких изменений.
// WindowManager.LayoutParams lp = d.getWindow().getAttributes();
// lp.dimAmount = 1.0f; // уровень затемнения пробовал 1.0 до 0
// lp.screenBrightness=1.0f;
// d.getWindow().setAttributes(lp);
// d.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
Добавлено через 6 часов 26 минут
Решение найдено - на затемнение превью камеры влияет затемнение бекграунда диалога.
Ошибка была в том, что я затемнение прописывал до dialog.show(), а нужно после.
Вот такая полумера.