RecyclerView Animation on Item Click

后端 未结 2 535
逝去的感伤
逝去的感伤 2020-12-23 10:41

I am trying to implement my own recyclerview Animation - I would like to achieve this without using any external libraries. Here is what the theoretical animation should

2条回答
  •  感情败类
    2020-12-23 11:19

    Solution:

    The way I solved this problem was to implement a listener View.OnClickListener to the ViewHolder class which extends RecyclerView.ViewHolder. So we get the following code:

    public static class ExampleViewHolder extends RecyclerView.ViewHolder 
        implements View.OnClickListener {
    
        private int originalHeight = 0;
        private boolean isViewExpanded = false;
        private YourCustomView yourCustomView
    
        // ..... CODE ..... //
    
    }
    

    The variables originalHeight and isViewExpanded are used in the animation process. In the constructor I initialize the view to the View.OnClickListener like so:

    public ExampleViewHolder(View v) {
         super(v);
         v.setOnClickListener(this);
    
         // Initialize other views, like TextView, ImageView, etc. here
    
         // If isViewExpanded == false then set the visibility 
         // of whatever will be in the expanded to GONE
    
         if (isViewExpanded == false) {
             // Set Views to View.GONE and .setEnabled(false)
             yourCustomView.setVisibility(View.GONE);
             yourCustomView.setEnabled(false);
         }
    
     }
    

    Now that the constructor has been taken care of we want to configure what happens when the user clicks on an individual RecyclerView item. The classes that will be useful here would be the ValueAnimator and the Animation objects. We override the onClick method like so to accomplish this:

    @Override
    public void onClick(final View view) {
        // If the originalHeight is 0 then find the height of the View being used 
        // This would be the height of the cardview
        if (originalHeight == 0) {
                originalHeight = view.getHeight();
            }
    
        // Declare a ValueAnimator object
        ValueAnimator valueAnimator;
            if (!mIsViewExpanded) {
                yourCustomView.setVisibility(View.VISIBLE);
                yourCustomView.setEnabled(true);
                mIsViewExpanded = true;
                valueAnimator = ValueAnimator.ofInt(originalHeight, originalHeight + (int) (originalHeight * 2.0)); // These values in this method can be changed to expand however much you like
            } else {
                mIsViewExpanded = false;
                valueAnimator = ValueAnimator.ofInt(originalHeight + (int) (originalHeight * 2.0), originalHeight);
    
                Animation a = new AlphaAnimation(1.00f, 0.00f); // Fade out
    
                a.setDuration(200);
                // Set a listener to the animation and configure onAnimationEnd
                a.setAnimationListener(new Animation.AnimationListener() {
                    @Override
                    public void onAnimationStart(Animation animation) {
    
                    }
    
                    @Override
                    public void onAnimationEnd(Animation animation) {
                        yourCustomView.setVisibility(View.INVISIBLE);
                        yourCustomView.setEnabled(false);
                    }
    
                    @Override
                    public void onAnimationRepeat(Animation animation) {
    
                    }
                });
    
                // Set the animation on the custom view
                yourCustomView.startAnimation(a);
            }
            valueAnimator.setDuration(200);
            valueAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
            valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                public void onAnimationUpdate(ValueAnimator animation) {
                    Integer value = (Integer) animation.getAnimatedValue();
                    view.getLayoutParams().height = value.intValue();
                    view.requestLayout();
                }
            });
    
    
            valueAnimator.start();
    
        }
    

    Now when you touch an individual cardview on the RecyclerView (assuming you have a CardView setup then it should expand out. Make sure to declare your customView properly in your xml file (example if you want the CardView to expand down when you touch it then properly assign the customView underneath the other views and set the visibility to gone when you declare it and then when the animation starts like so in the code above then set the visibility to Visible and enable the view.

    Hope this can help someone out.

提交回复
热议问题