taking studio start picture open intent for data and activity action_image_capture android android-layout

android - studio - start activity for result camera



getWidth() devuelve 0 si se establece por android: layout_width="match_parent" (2)

Descubrí una manera de hacer esto mientras escribía la pregunta. En lugar de tratar de recuperar el tamaño en el método constructor, moví el código al método onDraw() como este:

private void init() { } @Override protected void onDraw(Canvas canvas) { mScrWidth = canvas.getWidth(); mScrHeight = canvas.getHeight(); [...] }

Esto devuelve las dimensiones correctas.

Tengo una clase llamada FractalView que extiende ImageView. Mi objetivo es dibujar un fractal con esta clase que tiene el tamaño de toda la pantalla. Es la única vista en el archivo de diseño de mi actividad, que no sea el LinearLayout de nivel superior:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FFFFFFFF"> <com.antonc.fractal_wallpaper.FractalView android:id="@+id/fractal" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="gone"/> </LinearLayout>

Como puede ver, estoy usando "match_parent" para layout_width y layout_height tanto de FractalView como de LinearLayout. En este punto, asumí que el tamaño de FractalView se establece en un cierto valor, ya que está haciendo coincidir su padre, que es la coincidencia de su padre (que es toda la pantalla). Luego trato de detectar el tamaño que está disponible para FractalView usando getWidth () y getHeight ():

public class FractalView extends ImageView { private Context mContext; private Handler mHandler; private int mScrWidth; private int mScrHeight; public FractalView(Context context) { super(context); mContext = context; init(); } private void init() { mScrWidth = getWidth(); mScrHeight = getHeight(); // Breakpoint } @Override protected void onDraw(Canvas canvas) { [...] } }

Pero cuando mi código alcanza el punto de interrupción, el depurador muestra que mScrWidth y mScrHeight son cero. He intentado usar getMeasuredWidth () y getMaxWidth (), pero también devuelven valores incorrectos. He leído varias respuestas a preguntas similares, es decir, esta y todas explican que getWidth () devuelve el tamaño de una imagen después de que se dibujó, mientras que lo que realmente necesito es el ancho del área que está disponible para esta vista antes de comenzar a dibujar

¿Hay alguna forma de recuperar dichos valores para ancho y alto?


El tamaño de una vista no está disponible hasta después de onMeasure() , particularmente si está configurado para wrap_content , o fill_parent .

Debería acceder al tamaño en o después de onMeasure() en el código de la vista o en aa Layout Tree Observer:

LinearLayout layout = (LinearLayout)findViewById(R.id.mylayout); ViewTreeObserver vto = layout.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { this.layout.getViewTreeObserver().removeGlobalOnLayoutListener(this); int width = layout.getMeasuredWidth(); int height = layout.getMeasuredHeight(); } });

También necesitará agregar android:id="@+id/mylayout" a su LinearLayout para que el segundo funcione.