Created
March 6, 2019 10:52
-
-
Save wanzismail/9b92ba6643eaeb10ce9dba0015d6c1e6 to your computer and use it in GitHub Desktop.
Floating Button Behavior
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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