Skip to content

Instantly share code, notes, and snippets.

@wanzismail
Created March 6, 2019 10:52
Show Gist options
  • Save wanzismail/9b92ba6643eaeb10ce9dba0015d6c1e6 to your computer and use it in GitHub Desktop.
Save wanzismail/9b92ba6643eaeb10ce9dba0015d6c1e6 to your computer and use it in GitHub Desktop.
Floating Button Behavior
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 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:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
tools:context=".activities.CallPlanActivity">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/call_plan_collapsing_toolbar"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:contentScrim="?attr/colorPrimary"
app:layout_scrollFlags="scroll|exitUntilCollapsed"
app:titleEnabled="false">
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="?attr/actionBarSize"
tools:ignore="MissingPrefix">
<View
android:layout_width="match_parent"
android:layout_height="@dimen/height_custom_toolbar"
android:background="@color/colorPrimary"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<android.support.constraint.ConstraintLayout
android:id="@+id/call_plan_layout_quick_info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/generic_padding_margin"
android:background="@drawable/bg_base_floating_panel"
android:elevation="@dimen/basic_elevation"
android:paddingStart="@dimen/generic_padding_margin"
android:paddingTop="@dimen/padding_top_bottom_call_plan_quick_info"
android:paddingEnd="@dimen/generic_padding_margin"
android:paddingBottom="@dimen/padding_top_bottom_call_plan_quick_info"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:targetApi="lollipop">
<View
android:id="@+id/call_plan_divider"
android:layout_width="@dimen/divider"
android:layout_height="56dp"
android:layout_marginBottom="20dp"
android:background="@color/divider"
app:layout_constraintBottom_toTopOf="@id/call_plan_divider_horizontal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_chainStyle="packed" />
<android.support.constraint.Guideline
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_begin="7dp" />
<ImageView
android:id="@+id/call_plan_img_total_visit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/image_location_buildings"
android:src="@drawable/icon_kunjungan_22x22"
app:layout_constraintBottom_toTopOf="@id/call_plan_divider_horizontal"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.3" />
<ImageView
android:id="@+id/call_plan_img_target"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/margin_start_img_divider_quick_info_call_plan"
android:contentDescription="@string/image_target_arrow"
android:src="@drawable/icon_tercapai_22x22"
app:layout_constraintBottom_toTopOf="@id/call_plan_divider_horizontal"
app:layout_constraintStart_toEndOf="@id/call_plan_divider"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.3" />
<TextView
android:id="@+id/call_plan_tv_total_visit"
style="@style/TextAppearanceInfo"
android:layout_width="@dimen/zero"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/margin_se_tv_img_quick_info_call_plan"
android:layout_marginEnd="@dimen/margin_se_tv_img_quick_info_call_plan"
android:text="@string/text_total_visit"
app:layout_constraintBottom_toTopOf="@id/call_plan_tv_total_visit_output"
app:layout_constraintEnd_toStartOf="@id/call_plan_divider"
app:layout_constraintStart_toEndOf="@id/call_plan_img_total_visit"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.2"
app:layout_constraintVertical_chainStyle="packed" />
<TextView
android:id="@+id/call_plan_tv_total_visit_output"
style="@style/TextAppearanceInfo.Output"
android:layout_width="@dimen/zero"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/margin_se_tv_img_quick_info_call_plan"
android:layout_marginTop="@dimen/margin_top_tv_tv_top_block_call_plan_detail"
android:layout_marginEnd="@dimen/margin_se_tv_img_quick_info_call_plan"
android:text="@string/dummy_demand"
app:layout_constraintBottom_toTopOf="@id/call_plan_divider_horizontal"
app:layout_constraintEnd_toStartOf="@id/call_plan_divider"
app:layout_constraintStart_toEndOf="@id/call_plan_img_total_visit"
app:layout_constraintTop_toBottomOf="@id/call_plan_tv_total_visit" />
<TextView
android:id="@+id/call_plan_tv_target"
style="@style/TextAppearanceInfo"
android:layout_width="@dimen/zero"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/margin_se_tv_img_quick_info_call_plan"
android:text="@string/text_reached"
app:layout_constraintBottom_toTopOf="@id/call_plan_tv_target_output"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/call_plan_img_target"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.2"
app:layout_constraintVertical_chainStyle="packed" />
<TextView
android:id="@+id/call_plan_tv_target_output"
style="@style/TextAppearanceInfo.Output"
android:layout_width="@dimen/zero"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/margin_se_tv_img_quick_info_call_plan"
android:layout_marginTop="@dimen/margin_top_tv_tv_top_block_call_plan_detail"
android:text="@string/dummy_demand"
app:layout_constraintBottom_toTopOf="@id/call_plan_divider_horizontal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/call_plan_img_target"
app:layout_constraintTop_toBottomOf="@id/call_plan_tv_target" />
<View
android:id="@+id/call_plan_divider_horizontal"
android:layout_width="@dimen/zero"
android:layout_height="@dimen/divider"
android:layout_marginTop="@dimen/margin_top_divider_divider_call_plan"
android:background="@color/divider"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/call_plan_divider" />
<TextView
android:id="@+id/call_plan_tv_target_progress_bar"
style="@style/TextAppearanceInfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_top_tv_divider_call_plan"
android:text="@string/text_target_call_plan"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/call_plan_divider_horizontal" />
<TextView
android:id="@+id/call_plan_tv_target_progress_bar_output"
style="@style/TextAppearanceInfo.Output"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_top_tv_divider_call_plan"
android:text="@string/dummy_progress"
android:textSize="@dimen/text_semi_regular"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/call_plan_divider_horizontal" />
<View
android:layout_width="@dimen/zero"
android:layout_height="@dimen/zero"
android:background="@drawable/bg_progress_bar"
app:layout_constraintBottom_toBottomOf="@id/call_plan_pb_progress"
app:layout_constraintEnd_toEndOf="@id/call_plan_pb_progress"
app:layout_constraintStart_toStartOf="@id/call_plan_pb_progress"
app:layout_constraintTop_toTopOf="@id/call_plan_pb_progress" />
<ProgressBar
android:id="@+id/call_plan_pb_progress"
style="@style/Base.Widget.AppCompat.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="@dimen/height_progress_bar_call_plan"
android:layout_marginTop="@dimen/margin_top_pb_tv_call_plan"
android:indeterminate="false"
android:progressDrawable="@drawable/custom_progress_bar"
app:layout_constraintTop_toBottomOf="@id/call_plan_tv_target_progress_bar"
tools:progress="80" />
</android.support.constraint.ConstraintLayout>
</android.support.constraint.ConstraintLayout>
<android.support.v7.widget.Toolbar
android:id="@+id/callplan_toolbar"
android:layout_width="match_parent"
app:layout_collapseMode="pin"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
android:contentInsetEnd="@dimen/zero"
android:contentInsetRight="@dimen/zero"
app:contentInsetEnd="@dimen/zero"
app:contentInsetLeft="@dimen/zero"
app:contentInsetRight="@dimen/zero"
app:contentInsetStart="@dimen/zero"
app:popupTheme="@style/AppTheme.PopupOverlay">
<android.support.constraint.ConstraintLayout
android:id="@+id/include_toolbar_layout"
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize">
<TextView
android:id="@+id/callplan_toolbar_tv_title"
style="@style/TextAppearance.CustomTitle"
fontPath="@string/typeface_bold"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="56dp"
android:text="@string/title_callplan"
android:textAllCaps="true"
android:textSize="16sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
</android.support.v7.widget.Toolbar>
</android.support.design.widget.CollapsingToolbarLayout>
<android.support.design.widget.TabLayout
android:id="@+id/call_plan_tabs"
fontPath="@string/typeface_bold"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
app:tabBackground="@color/white"
app:tabIndicatorColor="@color/colorPrimary"
app:tabIndicatorHeight="3dip"
android:layout_marginLeft="@dimen/generic_padding_margin"
android:layout_marginRight="@dimen/generic_padding_margin"
app:tabMode="fixed"
app:tabPaddingEnd="10dp"
app:tabPaddingStart="10dp"
app:tabSelectedTextColor="@color/colorPrimary"
app:tabTextAppearance="@style/MineCustomTabText"
app:tabTextColor="@color/dark_grey" />
<View
android:layout_marginLeft="@dimen/generic_padding_margin"
android:layout_marginRight="@dimen/generic_padding_margin"
android:layout_width="match_parent"
android:background="@color/light_grey"
android:layout_height="1dip"/>
</android.support.design.widget.AppBarLayout>
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:fillViewport="true"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
android:layout_height="match_parent">
<android.support.v4.view.ViewPager
android:id="@+id/call_plan_viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</android.support.v4.widget.NestedScrollView>
<android.support.design.widget.FloatingActionButton
android:id="@+id/call_plan_fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/generic_padding_margin"
android:src="@drawable/ic_action_add"
app:backgroundTint="@color/colorPrimary"
app:layout_anchorGravity="bottom|end"
app:rippleColor="#FFF"
app:layout_behavior="id.co.bridgetech.mutiarafarmasales.utils.ScrollAwareFABBehavior"
android:tint="@color/white" />
</android.support.design.widget.CoordinatorLayout>
class ScrollAwareFABBehavior(context: Context, attrs: AttributeSet): FloatingActionButton.Behavior(context, attrs) {
override fun onStartNestedScroll(coordinatorLayout: CoordinatorLayout,
child: FloatingActionButton, directTargetChild: View, target: View,
axes: Int, type: Int): Boolean {
return axes == ViewCompat.SCROLL_AXIS_VERTICAL || super.onStartNestedScroll(coordinatorLayout,
child, directTargetChild, target, axes, type)
}
override fun onNestedScroll(coordinatorLayout: CoordinatorLayout,
child: FloatingActionButton, target: View, dxConsumed: Int, dyConsumed: Int,
dxUnconsumed: Int, dyUnconsumed: Int, type: Int) {
super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed,
dyUnconsumed, type)
if (dyConsumed > 0 && child.visibility == View.VISIBLE) {
child.hide(object : FloatingActionButton.OnVisibilityChangedListener() {
override fun onHidden(fab: FloatingActionButton) {
super.onHidden(fab)
fab.visibility = View.INVISIBLE
}
})
// } else if (dyUnconsumed < 0 && child.visibility != View.VISIBLE) {
} else if (dyConsumed < 0 && child.visibility != View.VISIBLE) {
child.show()
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment