Mostrar una animación de barra de herramientas oculta no suave
En una de mis aplicaciones recientes implementé la barra de herramientas de ocultar / mostrar cuando el usuario se desplaza en una lista (Recyclerview). Mi aplicación tiene 3 fragmentos y un buscapersonas de vista para presentarlos. La barra de herramientas se esconde apropiadamente al desplazarse. Sin embargo, cuando cambio el fragmento (onPageChange el oyente se llama en la página de la visión) estoy ampliando la barra de herramientas. A veces, cuando se está expandiendo la animación es suave, pero a veces hay un ligero retraso. No entiendo lo que estoy haciendo mal. Para ilustrar esto grabé mi pantalla, por favor, lame aquí para ver el video.
Este es mi main_layout:
- Barra de herramientas android muestra medio contenido
- ¿Cómo puedo hacer que DrawerLayout se muestre debajo de la barra de herramientas?
- Título, etc. que no se muestran en la barra de herramientas de Android
- ¿Es posible agregar vista de imagen en una barra de herramientas?
- Barra de herramientas con calendario
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:fab="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:fitsSystemWindows="true" tools:context="com.studentsins.lust.MainActivity"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/appBarLayouy" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay" app:layout_scrollFlags="scroll|enterAlways" /> <android.support.design.widget.TabLayout android:id="@+id/sliding_tabs" android:layout_width="match_parent" android:layout_height="@dimen/tabsHeight" style="@style/NavigationTab"/> </android.support.design.widget.AppBarLayout> <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"/> <include layout="@layout/content_main"/> <com.getbase.floatingactionbutton.FloatingActionsMenu android:id="@+id/floatingActionMenu" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" fab:fab_addButtonColorNormal="@color/blood_orange" fab:fab_addButtonColorPressed="@color/dirtyWhite" fab:fab_addButtonPlusIconColor="@color/dirtyWhite" fab:fab_addButtonSize = "normal" fab:fab_labelStyle="@style/menu_labels_style" fab:fab_labelsPosition="left" app:layout_anchor="@id/viewpager" app:layout_anchorGravity="bottom|end"> <com.getbase.floatingactionbutton.FloatingActionButton android:id="@+id/createPlanBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" fab:fab_colorNormal="@color/blood_orange" fab:fab_title="Create a plan" fab:fab_size="normal" app:fab_icon="@drawable/ic_event_white_48dp" fab:fab_colorPressed="@color/dirtyWhite"/> <com.getbase.floatingactionbutton.FloatingActionButton android:id="@+id/changeStatusBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" fab:fab_colorNormal="@color/blood_orange" fab:fab_size="normal" app:fab_icon="@drawable/ic_textsms_white_48dp" fab:fab_title="Change status" fab:fab_colorPressed="@color/dirtyWhite"/> </com.getbase.floatingactionbutton.FloatingActionsMenu>
Este es mi feed_fragment:
public class FeedFragment extends Fragment { public static final String ARG_PAGE = "ARG_PAGE"; private static final String TAG = FeedFragment.class.getSimpleName(); private int mPage; private RecyclerView mRefreshLayout; private Context mActivity; public static FeedFragment newInstance(int page) { Bundle args = new Bundle(); args.putInt(ARG_PAGE, page); FeedFragment fragment = new FeedFragment(); fragment.setArguments(args); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mPage = getArguments().getInt(ARG_PAGE); mActivity = getActivity(); Log.d("MainActivity", "onCreate" + mPage); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_feed_layout,container,false); mRefreshLayout = (RecyclerView) view.findViewById(R.id.feedCardViewList); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mActivity); linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); mRefreshLayout.setLayoutManager(linearLayoutManager); mRefreshLayout.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); if (dy >= 0) { // Scrolling up.. hide the FAB MainActivity.mFloatingActionsMenu.animate() .setDuration(150) .translationY(300); } else { // Scrolling down.. show the FAB MainActivity.mFloatingActionsMenu.animate() .setDuration(150) .translationY(0); } Log.d(TAG,"DY value: "+dy); } }); ArrayList<String> users = new ArrayList<>(); users.add("Georgi Koemdzhiev"); users.add("Mariya Menova"); users.add("Simeon Simeonov"); users.add("Ivan Dqkov"); users.add("Dymityr Vasilev"); users.add("Petar Dimov"); users.add("Stoyan Stoyanov"); users.add("Alexander Lunar"); users.add("Awesome Jhon"); FeedCardAdapter adapter = new FeedCardAdapter(users,mActivity); mRefreshLayout.setAdapter(adapter); Log.d("MainActivity", "onCreateView" + mPage); return view; } }
Este es mi método onCreate de MainActivity:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); sharedPreferences = PreferenceManager.getDefaultSharedPreferences(MainActivity.this); editor = sharedPreferences.edit(); Boolean isUserLoggedIn = sharedPreferences.getBoolean(Constants.USER_IF_LOG_IN,false); if(!isUserLoggedIn){ navigateToLogin(); } // Get the ViewPager and set it's PagerAdapter so that it can display items final ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager); viewPager.setAdapter(new LustFragmentPagerAdapter(getSupportFragmentManager(), this)); // Give the TabLayout the ViewPager final TabLayout tabLayout = (TabLayout) findViewById(R.id.sliding_tabs); tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); tabLayout.setupWithViewPager(viewPager); mFloatingActionsMenu = (FloatingActionsMenu)findViewById(R.id.floatingActionMenu); mChangeStatus = (FloatingActionButton)findViewById(R.id.changeStatusBtn); mChangeStatus.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Log.d(TAG,"Change Status pressed! | " + viewPager.getCurrentItem()); mFloatingActionsMenu.collapse(); } }); mCreatePlan = (FloatingActionButton)findViewById(R.id.createPlanBtn); mCreatePlan.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Log.d(TAG,"Create plan pressed! | " + viewPager.getCurrentItem()); mFloatingActionsMenu.collapse(); } }); viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { //Make sure that the fab is visible when scrolling the pages... MainActivity.mFloatingActionsMenu.animate() .setDuration(150) .translationY(0); //show the toolbar expandToolbar(); } @Override public void onPageSelected(int position) { } @Override public void onPageScrollStateChanged(int state) { } }); }
Este es mi código de método expandToolbar:
public void expandToolbar(){ //setExpanded(boolean expanded, boolean animate) AppBarLayout appBarLayout = (AppBarLayout)findViewById(R.id.appBarLayouy); appBarLayout.setExpanded(true, true); }
- ¿Cómo se establece el color del título de la nueva barra de herramientas?
- Cómo configurar una fuente personalizada para el título en la barra de herramientas de Android
- Flecha de flecha hacia arriba que superpone el título de la barra de herramientas
- barra de herramientas ocultar androide en fragmento específico
- Uso de la barra de herramientas AppCompat con FrameLayout
- Barra de herramientas flotante con controles de selección de texto
- Elemento de menú de la barra de herramientas que no se puede hacer clic en android 4.4 (19)
- Dos barras de acción al iniciar ActionMode
¿Puedo sugerirle otro método? Solo muestra / ocultar la barra superior usando el conjunto Visibilidad de GONE a VISIBLE o de visible a ido dependen de mostrar / ocultar necesidad. Y agrega android:animateLayoutChanges="true"
al padre de la barra superior.
Me enteré de lo que estaba causando este retraso de la animación de expansión de la barra de herramientas. El problema era que en el método onPageChanged en el oyente se llamaba muchas veces, por lo que el código de abajo se llamaba muchas veces:
onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { //Make sure that the fab is visible when scrolling the pages... MainActivity.mFloatingActionsMenu.animate() .setDuration(150) .translationY(0); //show the toolbar expandToolbar();
Asumo que esto estaba causando que el sistema luchara un poco de vez en cuando al tratar con tantas llamadas / animaciones.
Lo que hice para solucionar el problema es simplemente mover mi código de onScrolled al método "onPageScrollStateChanged" (que se llama una vez por barrido de visor a izquierda / derecha).
- OnCreateContextMenu se invoca con un valor nulo para ContextMenuInfo
- Android: BroadcastManager tiene colas?