AnimatedVectorDrawable in Support Library and animation of “pathData”

后端 未结 2 1729
死守一世寂寞
死守一世寂寞 2020-12-06 06:04

I am using animated vectors from Support Library 23.2.0, like this:

compile \'com.android.support:support-vector-drawable:2         


        
相关标签:
2条回答
  • 2020-12-06 06:32

    Sorry, this will not work with the current version of the Support Library(23.2.0).

    See Chris Banes article.

    There are also some limitations to what kind of things animated vectors can do when running on platforms < API 21. The following are the things which do not work currently on those platforms:

    Path Morphing (PathType evaluator). This is used for morphing one path into another path.

    Path Interpolation. This is used to defined a flexible interpolator (represented as a path) instead of the system defined ones like LinearInterpolator.

    Move along path. This is rarely used. The geometry object can move around, along an arbitrary path.

    So animating the pathData, or 'Path Morphing' isn't currently supported.

    Update:
    Frank's comment:

    This is finally fixed in support lib 25.4.0 (June 2017): "Path morphing and path interpolation are supported in AnimatedVectorDrawableCompat"

    0 讨论(0)
  • 2020-12-06 06:52


    the circular "flash" in the above animation (in the center of the image) is me pressing the screen to start the morph.
    Inflating Drawable's

    `VectorDrawable` and `AnimatedVectorDrawable` in this support library (`vector-compat`) can be inflated in this way:

    • Calling static getDrawable() methods:
    //This will only inflate a drawable with <vector> as the root element
    VectorDrawable.getDrawable(context, R.drawable.ic_arrow_vector);
    
    //This will only inflate a drawable with <animated-vector> as the root element
    AnimatedVectorDrawable.getDrawable(context, R.drawable.ic_arrow_to_menu_animated_vector);
    
    // This will inflate any drawable and will auto-fallback to the lollipop implementation on api 21+ devices
    ResourcesCompat.getDrawable(context, R.drawable.any_drawable);

    If inflating the Drawable in java code, it is recommended to always use ResourcesCompat.getDrawable() as this handles Lollipop fallback when applicable. This allows the system to cache Drawable ConstantState and hence is more efficient.
    The library (`vector-compat`) has the following morph (bi-directional) animations :

  • Play-Pause morph animation
  • Play-Stop morph animation
  • Arrow-Hamburger menu morph animation

  • As you can see, I produced the above image on my API 16 phone:

    import com.wnafee.vector.compat.AnimatedVectorDrawable;
    mdrawable = (AnimatedVectorDrawable) AnimatedVectorDrawable.getDrawable(this.getApplicationContext(), R.drawable.consolidated_animated_vector);
    

    Look at the github README for vector-compat here: https://github.com/wnafee/vector-compat
    This will fix your problem (down to API 14) if you merge it with your app module's build.gradle dependencies (usually at the end of file):

    dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    //Trying to FIX Binary XML file line #2: invalid drawable tag animated-vector
        compile 'com.android.support:appcompat-v7:25.0.0'
        compile 'com.android.support:design:25.0.0'
    //not needed
    //  compile 'com.android.support:support-vector-drawable:25.0.0'
        compile 'com.wnafee:vector-compat:1.0.5'//*******holy grail *******https://github.com/wnafee/vector-compat
    //  Failed to resolve: com.android.support:support-animated-vector-drawable:25.0.0
    //not needed
    //  compile 'com.android.support:support-animated-vector-drawable:25.0.0'
    }
    
0 讨论(0)
提交回复
热议问题