Configura o layout params dinamicamente

? masmic @ | Original: StackOverFlow
---

Eu estou usando o demo CameraPreview exemplo API. Eu preciso adicionar alguns pontos de vista ( de botão, etc .. ) que recobrem o SurfaceView .

Para isso, eu estou tentando definir seus parâmetros, mas eles aparecem o tempo todo no lado superior esquerdo da tela.

Este é o método onCreate do 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;
            }
        }
    }

Tenho que dizer que os valores aqui

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

está atualizando bem se eu mudá-los. O que não muda é o que contém o método addRule ()

---

Top 5 Responder

1Liam Neil Parker @

tentar definir o pai de btnTakePhoto para mPreview

btnTakePhoto.setParent(mPreview);

que fará com que o botão para aparecer acima da visualização .

2Weibo @

são que você quer adicionar o btnTakPhoto ao centro direita do ponto de vista? Se assim for, tem uma tentativa :

btn.setGravity(Gravity.RIGHT | Gravity.CENTER_VERTICAL);
3Liam Neil Parker @
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));

Você deve ser alvo de uma API mais de 14 anos, setParent deve trabalhar com novas APIs . Acima de código é uma forma alternativa, no entanto, você teria que colocar tudo por código, mas funciona. Espero que isso ajude .

FORM é o recipiente, e você teria que adicionar os outros componentes como FORM.addView (BTN) com parâmetros de layout relativos.

4RizN81 @

Try This

// 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 obter a altura da tela e largura

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;
    }
5masmic @

Finalmente resolvido. Ao fazer setContentView () e addContentView (), eu estava colocando os pontos de vista em um DecorView que é um FrameLayout . Então, LayoutParams referenciando RelativeLayout não vai funcionar, como por um FrameLayout únicas características genéricas de LayoutParams vai funcionar.

Então, a coisa é primeiro criar uma RelativeLayout, defina os parâmetros e defini-lo como o conteúdo :

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

Mas, agora, cada vez que eu quiser adicionar um ponto de vista, eu tenho que adicionar a este RelativeLayout desta forma:

relativeLayout.addView(View, Params);

Just this.