android - ScrollView设置layoutParams后无法滚动
迷茫
迷茫 2017-04-18 09:13:07
0
1
476

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>
迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

répondre à tous(1)
阿神

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


            }
        });
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal