recherche

Maison  >  Questions et réponses  >  le corps du texte

android - ScrollView设置layoutParams后无法滚动

ScrollView中包含一个高度远超屏幕的LinearLayout,可以正常滚动。当使用ObjectAnimator把ScrollView向上平移100个px,在updateLisnter中重设ScrollView的高度后,Scrollview没有完全显示,也无法滚动,这是什么原因呢?
代码:

    ll_wrap.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(scrollview, "translationY", -100f);
                    objectAnimator.setDuration(500);
                    objectAnimator.start();
    
                    objectAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                        @Override
                        public void onAnimationUpdate(ValueAnimator valueAnimator) {
                            //重设ScrollView高度
                            ViewGroup.LayoutParams params = scrollview.getLayoutParams();
                    params.height = (int) (scrollview.getHeight() - (float) valueAnimator.getAnimatedValue());
                    scrollview.setLayoutParams(params);
                        }
                    });
                }
            });
            
布局代码:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:id="@+id/ll_wrap"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">


        <FrameLayout
            android:background="@color/colorAccent"
            android:layout_width="match_parent"
            android:layout_height="400dp">

        </FrameLayout>
        <FrameLayout
            android:background="@android:color/darker_gray"
            android:layout_width="match_parent"
            android:layout_height="400dp">

        </FrameLayout>
    </LinearLayout>

</ScrollView>
迷茫迷茫2772 Il y a quelques jours477

répondre à tous(1)je répondrai

  • 阿神

    阿神2017-04-18 09:15:07

    Tout d'abord, j'ai le regret de vous dire que votre méthode d'animation d'attribut est erronée translationYCet attribut View existe, c'est-à-dire que toutes les vues et leurs sous-classes l'auront. Si vous définissez le nom de l'attribut, alors. it Il appellera automatiquement le Set方法 correspondant. Par exemple, si vous écrivez comme ceci maintenant, il appellera automatiquement la méthode View.setTranslationY(float translationY), vous n'avez donc pas besoin d'exécuter le code suivant :

    .
    objectAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                            @Override
                            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                                ViewGroup.LayoutParams params = scrollview.getLayoutParams();
                                params.height = (int) (params.height + (float)valueAnimator.getAnimatedValue());
                                scrollview.setLayoutParams(params);
                            }
                        });

    Le deuxième problème est que LayoutParams.height correspond à

            public static final int FILL_PARENT = -1;
    
            /**
             * Special value for the height or width requested by a View.
             * MATCH_PARENT means that the view wants to be as big as its parent,
             * minus the parent's padding, if any. Introduced in API Level 8.
             */
            public static final int MATCH_PARENT = -1;
    
            /**
             * Special value for the height or width requested by a View.
             * WRAP_CONTENT means that the view wants to be just large enough to fit
             * its own internal content, taking its own padding into account.
             */
            public static final int WRAP_CONTENT = -2;

    Une fois votre code exécuté, le paramètre LayoutParams.height<-2 est évidemment faux. Il est généralement supérieur à 0.
    Après avoir supprimé ce bloc de code, si vous souhaitez cliquer pour effectuer un panoramique de 100 pixels en ligne, alors vous peut écrire comme ceci :

    ll_wrap.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    float curTranslationY = scrollview.getTranslationY();
                    Log.e("test","curTranslationY: "+curTranslationY);
                    ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(scrollview, "translationY", curTranslationY,curTranslationY-100f);
                    objectAnimator.setDuration(500);
                    objectAnimator.start();
    
    
                }
            });

    répondre
    0
  • Annulerrépondre