Search code examples
androidandroid-layoutcoordinatesandroid-relativelayoutcircularreveal

Incorrect view size in RelativeLayout


I have a RelativeLayout below. There are an expandable view and a reveal frame layout in it. RevealFrameLayout aligned to screen bottom and is below ExpandableView. When user click fab reveal animation will starts from the fab center and show the reveal frame layout.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            xmlns:tools="http://schemas.android.com/tools"
            android:id="@+id/root"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

<FrameLayout
    android:id="@+id/expandable_frame"
    android:layout_width="match_parent"
    android:layout_height="250dp"
    android:layout_alignParentTop="true"
    android:background="@color/colorPrimary"
    android:elevation="16dp"
    android:fitsSystemWindows="true"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    <TextView
        android:id="@+id/app_name_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|start"
        android:padding="16dp"
        android:text="@string/app_name"
        android:textAppearance="@style/ExtraLargeText"/>

</FrameLayout>

<TextView
    android:id="@+id/error_tv"
    android:layout_width="match_parent"
    android:layout_height="60dp"
    android:layout_below="@id/expandable_frame"
    android:background="@color/mid_grey"
    android:gravity="center"
    android:textColor="@color/error_red"
    android:visibility="invisible"
    tools:text="@string/error_login"
    tools:visibility="visible"/>

<android.support.design.widget.TextInputLayout
    android:id="@+id/username_til"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@id/error_tv"
    android:layout_marginEnd="16dp"
    android:layout_marginStart="16dp">

    <android.support.design.widget.TextInputEditText
        android:id="@+id/username_tiet"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/username"
        android:inputType="text"
        android:lines="1"
        android:nextFocusDown="@+id/password_tiet"/>

</android.support.design.widget.TextInputLayout>

<android.support.design.widget.TextInputLayout
    android:id="@+id/password_til"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@id/username_til"
    android:layout_marginEnd="16dp"
    android:layout_marginStart="16dp">

    <android.support.design.widget.TextInputEditText
        android:id="@id/password_tiet"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/password"
        android:inputType="textPassword"
        android:lines="1"/>

</android.support.design.widget.TextInputLayout>

<FrameLayout
    android:id="@+id/loading_reveal_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_below="@id/expandable_frame"
    android:background="@color/colorAccent"
    android:visibility="invisible">

    <com.wang.avi.AVLoadingIndicatorView
        android:id="@+id/loading_animation_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:visibility="invisible"/>

</FrameLayout>

<WebView
    android:id="@+id/web_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignParentBottom="true"
    android:layout_below="@id/expandable_frame"
    android:visibility="gone"/>

<android.support.design.widget.FloatingActionButton
    android:id="@+id/login_fab"
    android:layout_width="56dp"
    android:layout_height="56dp"
    android:layout_alignParentBottom="true"
    android:layout_alignParentEnd="true"
    android:layout_margin="16dp"
    android:tint="@android:color/white"
    app:srcCompat="@drawable/ic_ok"/>

</RelativeLayout>

I calculate center of fab like this:

        int cx = mLoginFab.getRight() - mLoginFab.getMeasuredWidth() / 2;
        int cy = mLoginFab.getBottom() - mLoginFab.getMeasuredHeight() / 2;

But I get coordinates that are always lower than fab's location. It look like Reveal Frame Layout's bottom is out of the phone screen bounds.

Does anyone know what is wrong with this layout and how to get actual fab center coordinates?

Thanks in advance.


Solution

  • Try getWidth() and getHeight instead of getMeasuredWidth and getMeasuredHeight. According to the documentation for View:

    int getMeasuredWidthAndState ()

    Return the full width measurement information for this view as computed by the most recent call to measure(int, int). This result is a bit mask as defined by MEASURED_SIZE_MASK and MEASURED_STATE_TOO_SMALL. This should be used during measurement and layout calculations only. Use getWidth() to see how wide a view is after layout.

    Emphasis is mine and this applies to getMeasuredWidth and getMeasuredHeight as well.