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.
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.