Show/Hide action button depending on scroll direction

This commit is contained in:
Michael Schättgen 2019-03-26 00:53:32 +01:00
parent cebf15ba44
commit a5778e6b38
2 changed files with 57 additions and 0 deletions

View file

@ -1,6 +1,8 @@
package com.beemdevelopment.aegis.ui; package com.beemdevelopment.aegis.ui;
import android.Manifest; import android.Manifest;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.content.ClipData; import android.content.ClipData;
import android.content.ClipboardManager; import android.content.ClipboardManager;
import android.content.Context; import android.content.Context;
@ -12,6 +14,9 @@ import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.SubMenu; import android.view.SubMenu;
import android.view.View;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.DecelerateInterpolator;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.Toast; import android.widget.Toast;
@ -31,6 +36,9 @@ import com.beemdevelopment.aegis.db.DatabaseManagerException;
import com.beemdevelopment.aegis.db.DatabaseEntry; import com.beemdevelopment.aegis.db.DatabaseEntry;
import com.beemdevelopment.aegis.db.DatabaseManager; import com.beemdevelopment.aegis.db.DatabaseManager;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.interpolator.view.animation.FastOutSlowInInterpolator;
public class MainActivity extends AegisActivity implements EntryListView.Listener { public class MainActivity extends AegisActivity implements EntryListView.Listener {
// activity request codes // activity request codes
private static final int CODE_SCAN = 0; private static final int CODE_SCAN = 0;
@ -499,4 +507,39 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene
public void onEntryChange(DatabaseEntry entry) { public void onEntryChange(DatabaseEntry entry) {
saveDatabase(); saveDatabase();
} }
private boolean isAnimating;
@Override
public void onScroll(int dx, int dy) {
if (dy > 0 && _fabMenu.getVisibility() == View.VISIBLE && !isAnimating) {
isAnimating = true;
CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams) _fabMenu.getLayoutParams();
int fabBottomMargin = lp.bottomMargin;
_fabMenu.animate()
.translationY(_fabMenu.getHeight() + fabBottomMargin)
.setInterpolator(new AccelerateInterpolator(2))
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
isAnimating = false;
_fabMenu.setVisibility(View.INVISIBLE);
super.onAnimationEnd(animation);
}
}).start();
}
else if (dy < 0 && _fabMenu.getVisibility() != View.VISIBLE && !isAnimating) {
_fabMenu.setVisibility(View.VISIBLE);
_fabMenu.animate()
.translationY(0)
.setInterpolator(new DecelerateInterpolator(2))
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
isAnimating = false;
super.onAnimationEnd(animation);
}
}).start();
}
}
} }

View file

@ -3,6 +3,8 @@ package com.beemdevelopment.aegis.ui.views;
import android.content.Context; import android.content.Context;
import android.graphics.PorterDuff; import android.graphics.PorterDuff;
import android.os.Bundle; import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
@ -33,6 +35,8 @@ public class EntryListView extends Fragment implements EntryAdapter.Listener {
private UiRefresher _refresher; private UiRefresher _refresher;
private RecyclerView.OnScrollChangeListener _onScrollListener;
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
@ -50,6 +54,14 @@ public class EntryListView extends Fragment implements EntryAdapter.Listener {
// set up the recycler view // set up the recycler view
_rvKeyProfiles = view.findViewById(R.id.rvKeyProfiles); _rvKeyProfiles = view.findViewById(R.id.rvKeyProfiles);
_rvKeyProfiles.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
_listener.onScroll(dx, dy);
}
});
LinearLayoutManager mLayoutManager = new LinearLayoutManager(view.getContext()); LinearLayoutManager mLayoutManager = new LinearLayoutManager(view.getContext());
_rvKeyProfiles.setLayoutManager(mLayoutManager); _rvKeyProfiles.setLayoutManager(mLayoutManager);
_touchCallback = new SimpleItemTouchHelperCallback(_adapter); _touchCallback = new SimpleItemTouchHelperCallback(_adapter);
@ -199,5 +211,7 @@ public class EntryListView extends Fragment implements EntryAdapter.Listener {
void onEntryMove(DatabaseEntry entry1, DatabaseEntry entry2); void onEntryMove(DatabaseEntry entry1, DatabaseEntry entry2);
void onEntryDrop(DatabaseEntry entry); void onEntryDrop(DatabaseEntry entry);
void onEntryChange(DatabaseEntry entry); void onEntryChange(DatabaseEntry entry);
void onScroll(int dx, int dy);
} }
} }