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:

<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); } 

¿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).

  • Barra de herramientas no se contraerá con Scrollview como hijo de CoordinatorLayout
  • ¿El icono del logotipo de la barra de herramientas se puede hacer clic?
  • Androide diseño biblioteca barra de herramientas sombra
  • CollapsingToolbarLayout con una vista personalizada
  • Uso de la barra de herramientas en fragmento o en la actividad
  • CollapsingToolbarLayout no funciona correctamente
  • Appcompat v21 Elevación de la barra de herramientas pre-lollipop
  • Título de la barra de herramientas primera letra otro color
  • ¿Cómo implementar el evento de clic en el icono de la barra de herramientas?
  • Cómo cambiar el color del icono de inicio de la barra de herramientas
  • Usar la barra de herramientas en todas las actividades (Android)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.