J'essaie actuellement d'utiliser la fonction CoordinatorLayout
pour adapter un Toolbar
l'opacité en fonction d'un ScrollView
position de défilement. Je parviens à relier manuellement les deux vues, en écoutant le message d'alerte de l'opérateur. ScrollView
les événements de défilement et de les rapporter sur la valeur alpha de mon Toolbar
l'arrière-plan.
Le comportement recherché est :
La barre d'outils commence dans un transparent (à la fois le texte et l'arrière-plan) et se retrouver totalement fond blanc y texte en noir lorsqu'une vue est entièrement déroulée.
Le comportement est à peu près celui-ci : Vidéo sur Youtube .
Mise en œuvre actuelle
fichier de présentation (simplifié)
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true">
<ScrollView
android:id="@+id/scrollView"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<my.package.widgets.DetailsTop
android:id="@+id/layout_details_top"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<my.package.widgets.DetailsBottom
android:id="@+id/layout_details_bottom"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</ScrollView>
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#00FFFFFF"/>
</RelativeLayout>
Mise en œuvre des fragments
public class SearchVehicleDetailsFragment extends BaseFragment<SearchContract.ParentView> {
@Bind(R.id.layout_details_top) DetailsTop detailsTopLayout;
@Bind(R.id.layout_details_bottom) DetailsBottom detailsBottomLayout;
@Bind(R.id.scrollView) ScrollView scrollView;
@Bind(R.id.toolbar) Toolbar toolbar;
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
scrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
@Override
public void onScrollChanged() {
float alpha = (float) scrollView.getScrollY() / vehicleDetailsTopLayout.getHeight();
toolbar.setBackgroundColor(getColorWithAlpha(alpha, getResources().getColor(R.color.white)));
toolbar.setTitleTextColor(getColorWithAlpha(alpha, getResources().getColor(R.color.dark_grey)));
}
});
}
public static int getColorWithAlpha(float alpha, int baseColor) {
int a = Math.min(255, Math.max(0, (int) (alpha * 255))) << 24;
int rgb = 0x00ffffff & baseColor;
return a + rgb;
}
}
Problème
Cependant, même si les extraits précédents constituent une solution particulièrement simple qui semble fonctionner parfaitement, je ne comprends pas très bien pourquoi cela n'a pas fonctionné avec CoordinatorLayout
. J'ai aussi trouvé un gars qui semble avoir réussi cette tâche avec un produit personnalisé. CoordinatorLayout.Behavior<android.support.v7.widget.Toolbar>
la mise en œuvre.
Vous pouvez consulter son implémentation personnalisée de CoordinatorLayout.Behavior . Il donne également des précisions sur Moyen . Toutefois, en raison d'un grand nombre de <android.support.v7.widget.Toolbar .../>
au lieu de l'ensemble des Toolbar
et un manque flagrant de compréhension du fonctionnement de cette partie de la bibliothèque Support Design, je n'ai jamais pu la mettre en œuvre...
Question
J'aimerais comprendre comment CoordinatorLayout
et toutes les classes qui l'entourent fonctionnent ensemble. Je serai donc probablement en mesure d'implémenter le comportement que je recherche, à savoir : lier la position de défilement d'un ScrollView à la valeur alpha de la couleur d'arrière-plan d'une barre d'outils.
Bien entendu, si vous savez également comment mettre en œuvre tout cela, je serai très heureux de voir votre extrait :)