2525import android .content .res .TypedArray ;
2626import android .graphics .PixelFormat ;
2727import android .graphics .Rect ;
28- import android .graphics .drawable .AnimatedVectorDrawable ;
28+ import android .graphics .drawable .ColorDrawable ;
29+ import android .graphics .drawable .Drawable ;
2930import android .os .Parcel ;
3031import android .os .Parcelable ;
3132import android .util .AttributeSet ;
3536import android .view .Menu ;
3637import android .view .MotionEvent ;
3738import android .view .View ;
38- import android .view .ViewAnimationUtils ;
3939import android .view .ViewTreeObserver ;
4040import android .view .WindowManager ;
4141import android .widget .FrameLayout ;
4242import android .widget .ImageView ;
4343
44+ import com .google .android .material .circularreveal .CircularRevealCompat ;
4445import com .google .android .material .floatingactionbutton .FloatingActionButton ;
4546import com .google .android .material .internal .NavigationMenuView ;
4647import com .google .android .material .navigation .NavigationView ;
4748
49+ import androidx .annotation .ColorInt ;
4850import androidx .annotation .IdRes ;
4951import androidx .annotation .LayoutRes ;
5052import androidx .annotation .MenuRes ;
5153import androidx .annotation .NonNull ;
5254import androidx .annotation .Nullable ;
55+ import androidx .appcompat .app .AppCompatDelegate ;
5356import androidx .coordinatorlayout .widget .CoordinatorLayout ;
54- import androidx .core .content .ContextCompat ;
5557import androidx .core .os .ParcelableCompat ;
5658import androidx .core .os .ParcelableCompatCreatorCallbacks ;
5759import androidx .core .view .MotionEventCompat ;
60+ import androidx .core .view .ViewCompat ;
5861import androidx .customview .view .AbsSavedState ;
62+ import androidx .vectordrawable .graphics .drawable .AnimatedVectorDrawableCompat ;
5963
6064@ SuppressWarnings ({"FieldCanBeLocal" , "InflateParams" , "RtlHardcoded" , "unused" , "WeakerAccess" })
6165public class FloatingNavigationView extends FloatingActionButton {
6266
6367 private final WindowManager mWindowManager ;
6468
65- private final NavigationView mNavigationView ;
69+ private final CircularRevealNavigationView mNavigationView ;
6670 private final NavigationMenuView mNavigationMenuView ;
6771 private final ImageView mFabView ;
6872
@@ -104,12 +108,13 @@ public FloatingNavigationView(Context context, AttributeSet attrs) {
104108
105109 public FloatingNavigationView (Context context , AttributeSet attrs , int defStyleAttr ) {
106110 super (context , attrs , defStyleAttr );
111+ AppCompatDelegate .setCompatVectorFromResourcesEnabled (true );
107112 setImageResource (R .drawable .ic_menu_vector );
108113
109114 mWindowManager = (WindowManager ) context .getSystemService (Context .WINDOW_SERVICE );
110115
111- mNavigationView = (NavigationView ) LayoutInflater .from (context ).inflate (R .layout .navigation_view , null );
112- mNavigationView .setBackgroundTintList ( getBackgroundTintList ( ));
116+ mNavigationView = (CircularRevealNavigationView ) LayoutInflater .from (context ).inflate (R .layout .navigation_view , null );
117+ mNavigationView .setBackground ( new ColorDrawable ( getBackgroundColor () ));
113118 mNavigationView .setOnTouchListener (mNavigationTouchListener );
114119 mNavigationMenuView = (NavigationMenuView ) mNavigationView .findViewById (R .id .design_navigation_view );
115120
@@ -130,10 +135,22 @@ public FloatingNavigationView(Context context, AttributeSet attrs, int defStyleA
130135 a .recycle ();
131136 }
132137
138+ private @ ColorInt int getBackgroundColor () {
139+ ColorStateList colorStateList = getBackgroundTintList ();
140+ if (colorStateList != null ) {
141+ return colorStateList .getDefaultColor ();
142+ }
143+ Drawable background = getBackground ();
144+ if (background instanceof ColorDrawable ) {
145+ return ((ColorDrawable ) background ).getColor ();
146+ }
147+ return getSolidColor ();
148+ }
149+
133150 @ Override
134151 public void setBackgroundTintList (@ Nullable ColorStateList tint ) {
135152 super .setBackgroundTintList (tint );
136- mNavigationView .setBackgroundTintList (tint );
153+ ViewCompat .setBackgroundTintList (mNavigationView , tint );
137154 }
138155
139156 @ NonNull
@@ -201,7 +218,7 @@ private void attachNavigationView() {
201218 // We need to convert script specific gravity to absolute horizontal value
202219 // If horizontal direction is LTR, then START will set LEFT and END will set RIGHT.
203220 // If horizontal direction is RTL, then START will set RIGHT and END will set LEFT.
204- gravity = Gravity .getAbsoluteGravity (gravity , getLayoutDirection ());
221+ gravity = Gravity .getAbsoluteGravity (gravity , ViewCompat . getLayoutDirection (this ));
205222
206223 mWindowManager .addView (mNavigationView , createLayoutParams (gravity ));
207224 }
@@ -215,7 +232,7 @@ private void detachNavigationView() {
215232 private void startOpenAnimations () {
216233
217234 // Icon
218- AnimatedVectorDrawable menuIcon = ( AnimatedVectorDrawable ) ContextCompat . getDrawable (getContext (),
235+ AnimatedVectorDrawableCompat menuIcon = AnimatedVectorDrawableCompat . create (getContext (),
219236 R .drawable .ic_menu_animated );
220237 mFabView .setImageDrawable (menuIcon );
221238 menuIcon .start ();
@@ -225,9 +242,9 @@ private void startOpenAnimations() {
225242 int centerY = mFabRect .centerY ();
226243 float startRadius = getMinRadius ();
227244 float endRadius = getMaxRadius ();
228- Animator reveal = ViewAnimationUtils
229- . createCircularReveal ( mNavigationView ,
230- centerX , centerY , startRadius , endRadius );
245+ Animator reveal = CircularRevealCompat . createCircularReveal (
246+ mNavigationView , centerX , centerY , startRadius , endRadius
247+ );
231248
232249 // Fade in
233250 mNavigationMenuView .setAlpha (0 );
@@ -242,7 +259,7 @@ private void startOpenAnimations() {
242259 private void startCloseAnimations () {
243260
244261 // Icon
245- AnimatedVectorDrawable closeIcon = ( AnimatedVectorDrawable ) ContextCompat . getDrawable (getContext (),
262+ AnimatedVectorDrawableCompat closeIcon = AnimatedVectorDrawableCompat . create (getContext (),
246263 R .drawable .ic_close_animated );
247264 mFabView .setImageDrawable (closeIcon );
248265 closeIcon .start ();
@@ -252,9 +269,9 @@ private void startCloseAnimations() {
252269 int centerY = mFabRect .centerY ();
253270 float startRadius = getMaxRadius ();
254271 float endRadius = getMinRadius ();
255- Animator reveal = ViewAnimationUtils
256- . createCircularReveal ( mNavigationView ,
257- centerX , centerY , startRadius , endRadius );
272+ Animator reveal = CircularRevealCompat . createCircularReveal (
273+ mNavigationView , centerX , centerY , startRadius , endRadius
274+ );
258275 reveal .addListener (new AnimatorListenerAdapter () {
259276 @ Override
260277 public void onAnimationEnd (Animator animation ) {
@@ -278,7 +295,7 @@ private void updateFabBounds() {
278295 layoutParams .width = getWidth ();
279296 layoutParams .height = getHeight ();
280297 layoutParams .topMargin = mFabRect .top ;
281- if (getLayoutDirection () == LAYOUT_DIRECTION_RTL ) {
298+ if (ViewCompat . getLayoutDirection (this ) == ViewCompat . LAYOUT_DIRECTION_RTL ) {
282299 layoutParams .rightMargin = mNavigationView .getWidth () - mFabRect .right ;
283300 } else {
284301 layoutParams .leftMargin = mFabRect .left ;
0 commit comments