VectorDrawable兼容笔记

VectorDrawable使用时,如果要兼容Android 5.0以下版本。应该注意以下几点:

1. ImageView\ImageButton中使用(Activity继承自AppCompatActivity,如果不是,请使用AppCompatImageView)

对于ImageView这样的控件,要兼容Vector图像,只需要将之前的android:src属性,换成app:srcCompat即可,示例代码如下所示:


在代码中设置的话,可以使用setBackgroundResource方法设置,代码如下所示:

ImageView iv = (ImageView) findViewById(R.id.iv);
iv.setImageResource(R.drawable.vector_image);

2. 当在非ImageView控件中(Button、TextView等)作为Background、CompoundDrawable时,需要在Activity中加入以下声明

static {
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}

另外,如果直接在xml布局文件中使用,则必须使用selector、layer-list这种容器包裹起来,不能直接使用
(在代码中设置不需要)


    

3. 虽然Google已经对Vector图像进行了Android 2.1以上的兼容,但对于动态Vector动画,还是有很多限制的,例如:

1) Path Morphing,即路径变换动画,在Android pre-L版本下是无法使用的(不会动)。
2)Path Interpolation,即路径插值器,在Android pre-L版本只能使用系统的插值器,不能自定义。
3)Path Animation,即路径动画,这个一般使用贝塞尔曲线来代替,所以没有太大影响。

4. 除了在低版本上的兼容性问题,在L版本以上,也存在兼容性问题,即继承了AppCompatActivity的界面,如果直接设置ImageView的srcCompat,那么Path Morphing动画是无法生效的,因为默认的AppCompatActivity已经默认使用ImageViewCompat给转换了,但是AnimatedVectorDrawableCompat是不支持Path Morphing动画的,所以,在AppCompatActivity界面里面就无效了。

解决办法很简单,即使用代码来给ImageView添加动画:

ImageView imageView = (ImageView) view;
AnimatedVectorDrawable morphing = (AnimatedVectorDrawable)getDrawable(morphing);
imageView.setImageDrawable(morphing);
if (morphing != null) {
    morphing.start();
}

注意不要使用AnimatedVectorDrawableCompat。

详细情况,这篇文章讲解的很清楚:

Android Vector曲折的兼容之路:http://blog.csdn.net/eclipsexys/article/details/51838119

你可能感兴趣的:(android)