Android: show/hide a view using an animation

后端 未结 9 2062
青春惊慌失措
青春惊慌失措 2021-01-30 00:53

I\'ve been looking through many google results / questions on here to determine how to show/hide a view via a vertical animation, but I can\'t seem to find one that\'s exactly r

相关标签:
9条回答
  • 2021-01-30 01:07

    This can reasonably be achieved in a single line statement in API 12 and above. Below is an example where v is the view you wish to animate;

    v.animate().translationXBy(-1000).start();
    

    This will slide the View in question off to the left by 1000px. To slide the view back onto the UI we can simply do the following.

    v.animate().translationXBy(1000).start();
    

    I hope someone finds this useful.

    0 讨论(0)
  • 2021-01-30 01:07

    I have used this two function to hide and show view with transition animation smoothly.

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
        public void expand(final View v, int duration, int targetHeight, final int position) {
    
            int prevHeight = v.getHeight();
    
            v.setVisibility(View.VISIBLE);
            ValueAnimator valueAnimator = ValueAnimator.ofInt(0, targetHeight);
            valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    v.getLayoutParams().height = (int) animation.getAnimatedValue();
                    v.requestLayout();
                }
            });
            valueAnimator.setInterpolator(new DecelerateInterpolator());
            valueAnimator.setDuration(duration);
            valueAnimator.start();
            valueAnimator.addListener(new AnimatorListenerAdapter() {
    
                @Override
                public void onAnimationEnd(Animator animation) {
                    v.clearAnimation();
                }
            });
    
        }
    
        @TargetApi(Build.VERSION_CODES.HONEYCOMB)
        public void collapse(final View v, int duration, int targetHeight, final int position) {
            if (position == (data.size() - 1)) {
                return;
            }
            int prevHeight = v.getHeight();
            ValueAnimator valueAnimator = ValueAnimator.ofInt(prevHeight, targetHeight);
            valueAnimator.setInterpolator(new DecelerateInterpolator());
            valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    v.getLayoutParams().height = (int) animation.getAnimatedValue();
                    v.requestLayout();
                }
            });
            valueAnimator.setInterpolator(new DecelerateInterpolator());
            valueAnimator.setDuration(duration);
            valueAnimator.start();
            valueAnimator.addListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    animBoolArray.put(position, false);
                    v.clearAnimation();
    
                }
            });
        }
    
    0 讨论(0)
  • 2021-01-30 01:08

    First of all get the height of the view yo want to saw and make a boolean to save if the view is showing:

    int heigth=0;
    boolean showing=false;
    LinearLayout layout = (LinearLayout) view.findViewById(R.id.layout);
    
            proDetailsLL.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    
                @Override
                public void onGlobalLayout() {
                    // gets called after layout has been done but before display
                    // so we can get the height then hide the view
    
                    proHeight = proDetailsLL.getHeight(); // Ahaha!  Gotcha
    
                    proDetailsLL.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                    proDetailsLL.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 0));
                }
            });
    

    Then call the method for showing hide the view, and change the value of the boolean:

    slideInOutAnimation(showing, heigth, layout);
    proShowing = !proShowing;
    

    The method:

    /**
         * Method to slide in out the layout
         * 
         * @param isShowing
         *            if the layout is showing
         * @param height
         *            the height to slide
         * @param slideLL
         *            the container to show
         */
    private void slideInOutAnimation(boolean isShowing, int height, final LinearLayout slideLL, final ImageView arroIV) {
    
            if (!isShowing) {
            Animation animIn = new Animation() {
            protected void applyTransformation(float interpolatedTime, Transformation t) {
                        super.applyTransformation(interpolatedTime, t);
            // Do relevant calculations here using the interpolatedTime that runs from 0 to 1
            slideLL.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, (int) (heigth * interpolatedTime)));
    
                    }
                };
                animIn.setDuration(500);
                slideLL.startAnimation(animIn);
            } else {
    
                Animation animOut = new Animation() {
                    protected void applyTransformation(float interpolatedTime, Transformation t) {
                        super.applyTransformation(interpolatedTime, t);
                        // Do relevant calculations here using the interpolatedTime that runs from 0 to 1
    
    
                            slideLL.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,
                                    (int) (heigth * (1 - interpolatedTime))));
    
                    }
                };
                animOut.setDuration(500);
                slideLL.startAnimation(animOut);
    
    
            }
    
        }
    
    0 讨论(0)
  • 2021-01-30 01:16

    Try this.

    view.animate()
        .translationY(0)
        .alpha(0.0f)
        .setListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);
                view.setVisibility(View.GONE);
            }
        });
    
    0 讨论(0)
  • 2021-01-30 01:16

    ViewAnimator:

    In XML:

      <ViewAnimator
        android:id="@+id/animator_message"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:inAnimation="@anim/slide_down_text"
        android:outAnimation="@anim/slide_up_text">
    
        <TextView
            android:id="@+id/text_message_authentication"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:text="message_error_authentication" />
    
        <TextView
            android:id="@+id/text_message_authentication_connection"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:text="message_error_authentication_connection" />
    
        <TextView
            android:id="@+id/text_message_authentication_empty"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:text="message_error_authentication_field_empty" />
    
    </ViewAnimator>
    

    Functions:

    public void show(int viewId) {
        ViewAnimator animator = (ViewAnimator) findView(animatorId);
        View view = findViewById(viewId);
    
        if (animator.getDisplayedChild() != animator.indexOfChild(view)) {
            animator.setDisplayedChild(animator.indexOfChild(view));
         }
     }
    
    
     private void showAuthenticationConnectionFailureMessage() {
        show(R.id.text_message_authentication_connection);
    }
    
    0 讨论(0)
  • 2021-01-30 01:20

    If you only want to animate the height of a view (from say 0 to a certain number) you could implement your own animation:

    final View v = getTheViewToAnimateHere();
    Animation anim=new Animation(){
        protected void applyTransformation(float interpolatedTime, Transformation t) {
            super.applyTransformation(interpolatedTime, t);
            // Do relevant calculations here using the interpolatedTime that runs from 0 to 1
            v.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, (int)(30*interpolatedTime)));
        }};
    anim.setDuration(500);
    v.startAnimation(anim);
    
    0 讨论(0)
提交回复
热议问题