Android: Using ObjectAnimator to translate a View with fractional values of the View's dimension

前端 未结 5 1058
执笔经年
执笔经年 2020-11-28 05:56

It appears that the old view animations (translate, scale, and so on) are no longer accepted by the AnimationInflater, at least as of

5条回答
  •  攒了一身酷
    2020-11-28 06:31

    Actually object animators accept fractional values. But maybe you didn't understand the underlying concept of an objectAnimator or more generally a value animator. A value animator will animate a value related to a property (such as a color, a position on screen (X,Y), an alpha parameter or whatever you want). To create such a property (in your case xFraction and yFraction) you need to build your own getters and setters associated to this property name. Lets say you want to translate a FrameLayout from 0% to 25% of the size of your whole screen. Then you need to build a custom View that wraps the FrameLayout objects and write your getters and setters.

    public class SlidingFrameLayout extends FrameLayout
    {
        private static final String TAG = SlidingFrameLayout.class.getName();
    
        public SlidingFrameLayout(Context context) {
            super(context);
        }
    
        public SlidingFrameLayout(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public float getXFraction()
        {
            int width = getWindowManager().getDefaultDisplay().getWidth();
            return (width == 0) ? 0 : getX() / (float) width;
        }
    
        public void setXFraction(float xFraction) {
            int width = getWindowManager().getDefaultDisplay().getWidth();
            setX((width > 0) ? (xFraction * width) : 0);
        }
    }
    

    Then You can use the xml way to declare the object animator putting xFraction under the property xml attribute and inflate it with a AnimatorInflater

    
    
    

    or you can just use the java line code

    ObjectAnimator oa = ObjectAnimator.ofFloat(menuFragmentContainer, "xFraction", 0, 0.25f);
    

    Hope it helps you!

    Olivier,

提交回复
热议问题