studio intent example android layout camera params

intent - permissions camera android



Establecer parámetros de diseño dinámicamente (5)

Estoy usando la demostración de API de ejemplo de CameraPreview. Necesito agregar algunas vistas (botón, etc.) superponiendo SurfaceView.

Para esto, estoy tratando de establecer sus parámetros, pero aparecen todo el tiempo en el lado superior izquierdo de la pantalla.

Este es el método onCreate del código:

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); btnTakePhoto = new Button(this); btnTakePhoto.setBackgroundResource(android.R.drawable.ic_menu_camera); /*Set container*/ mPreview = new Preview(this); setContentView(mPreview); /*Set button params and add it to the view*/ RelativeLayout.LayoutParams buttonParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); buttonParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); buttonParams.addRule(RelativeLayout.CENTER_VERTICAL); addContentView(btnTakePhoto, buttonParams); numberOfCameras = Camera.getNumberOfCameras(); CameraInfo cameraInfo = new CameraInfo(); for (int i = 0; i < numberOfCameras; i++) { Camera.getCameraInfo(i, cameraInfo); if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) { defaultCameraId = i; } } }

Tengo que decir que los valores aquí

RelativeLayout.LayoutParams buttonParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

se están actualizando bien si los cambio. Lo que no cambia es qué contiene el método addRule ()


¿Quieres agregar el btnTakPhoto al centro derecho de la vista? si es así, inténtalo:

btn.setGravity(Gravity.RIGHT | Gravity.CENTER_VERTICAL);


intenta establecer el elemento primario de btnTakePhoto en mPreview

btnTakePhoto.setParent(mPreview);

que hará que el botón aparezca encima de la vista previa.


Finalmente resuelto. Al hacer setContentView () y addContentView (), estaba colocando las vistas en un DecorView que es un FrameLayout. Por lo tanto, LayoutParams que hace referencia a RelativeLayout no funcionará, ya que para FrameLayout solo funcionarán las funciones genéricas de LayoutParams.

Por lo tanto, se trata de crear primero un diseño relativo, configurar los parámetros y configurarlo como el contenido:

RelativeLayout relativeLayout = new RelativeLayout(this); RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT); setContentView(relativeLayout, rlp);

Pero, ahora, cada vez que quiero agregar una vista, tengo que agregarla a este pariente. De esta manera:

relativeLayout.addView(View, Params);

Sólo esta.


Prueba esto

// create main linearLayout and set properties LinearLayout linearLayout = new LinearLayout(this); linearLayout.setBackgroundColor(Color.TRANSPARENT); // Create camera layout params LinearLayout.LayoutParams cameralayoutParams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT); // set layout params linearLayout.setLayoutParams(cameralayoutParams); linearLayout.setOrientation(LinearLayout.HORIZONTAL); int m_Height=ScreenHeight(this); int buttonWH = 80; // Create button for capture, save and discard captureButton = new Button(this); captureButton.setBackgroundResource(R.drawable.camera); captureButton.setWidth(buttonWH); captureButton.setHeight(buttonWH); saveButton = new Button(this); saveButton.setBackgroundResource(R.drawable.save); saveButton.setVisibility(View.INVISIBLE); saveButton.setWidth(buttonWH); saveButton.setHeight(buttonWH); discardButton = new Button(this); discardButton.setBackgroundResource(R.drawable.discard); discardButton.setVisibility(View.INVISIBLE); discardButton.setWidth(buttonWH); discardButton.setHeight(buttonWH); // Create layout for controls controlLayout = new LinearLayout(this); controlLayout.setOrientation(LinearLayout.VERTICAL); controlLayout.setBackgroundColor(Color.BLACK); // Create params for control layout LinearLayout.LayoutParams controlLayoutParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT); // Set layout params controlLayout.setLayoutParams(controlLayoutParams); int buttonMargin = ((m_Height - (buttonWH * 3)) / 3) / 2; // Create params for capture button LinearLayout.LayoutParams buttonCaptureParams = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); buttonCaptureParams.setMargins(10, buttonMargin, 10, buttonMargin); LinearLayout.LayoutParams buttonSaveParams = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); buttonSaveParams.setMargins(10, buttonMargin, 10, buttonMargin); LinearLayout.LayoutParams buttonDiscardParams = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); buttonDiscardParams.setMargins(10, buttonMargin, 10, buttonMargin); // Add button to main layout controlLayout.addView(discardButton, buttonDiscardParams); controlLayout.addView(captureButton, buttonCaptureParams); controlLayout.addView(saveButton, buttonSaveParams); // Make it full screen requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); // set main layout as content view setContentView(linearLayout);

Método para obtener la altura y el ancho de la pantalla

public static int ScreenHeight(Context ctx) { DisplayMetrics displaymetrics = new DisplayMetrics(); ((Activity) ctx).getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); return displaymetrics.heightPixels; } public static int ScreenWidth(Context ctx) { DisplayMetrics displaymetrics = new DisplayMetrics(); ((Activity) ctx).getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); return displaymetrics.widthPixels; }


ScrollView sv = new ScrollView(this); this.addContentView(sv, new RelativeLayout.LayoutParams(screen.widthPixels, screen.heightPixels)); RelativeLayout FORM = new RelativeLayout(this); sv.addView(FORM, new RelativeLayout.LayoutParams(screen.widthPixels, screen.heightPixels));

Debes dirigirte a una API anterior a 14, setParent debería funcionar con API más nuevas. El código anterior es una alternativa, sin embargo, debe colocar todo por código, pero funciona. Espero que esto ayude.

FORM es el contenedor, y usted debería agregar sus otros componentes como FORMATO.addView (btn) con params de diseño relativo.