Drawable 和 动画

Drawable

Drawable分类

  • BitmapDrawable:对应xml中<bitmap>
  • ShapeDrawable:对应xml中<shape>
    • android:shape 指定shape的形状
    • corners
    • gradient
    • solid
    • stroke
    • padding
  • LayerDrawable:对应xml中<layer-list>,它是一种层次化的drawable集合,后面的层会覆盖前面的层。
    • android:left top bottom right 可以达到错开的效果
  • StateListDrawable:对应xml中<selector>,它也是一种drawable的集合,只不过不是层次化的,而是状态化的。根据不同的状态展现不同的层。
  • LevelListDrawable:对应xml中<level-list>,它也是一种drawable的集合,它是通过level的值(0~10000)来进行不同的展现。
  • TransitionDrawable:对应xml中<transition>,可以实现两个drawable资源之间淡入淡出的效果。
  • InsetDrawable:对应xml中<inset>,作用在于可以将drawable嵌入到view当中,而不是完全的覆盖,作用相当于padding。
  • ScaleDrawable:对应xml中<scale>,根据level的值将指定的drawable缩放到一定的比例。
    • android:scaleGravity 指定缩放后的gravity的位置
    • android:scaleHeight
    • android:scaleWeight
  • ClipDrawable:对应xml中<clip>,将图片进行裁剪。
    • android:clipOrientation 裁剪的方向
    • android:gravity 配合上面一起使用
  • NinePatchDrawable:对应xml中<nine-patch>,属性上和BitmapDrawable一样。

自定义Drawable

主要是重写draw()方法。

动画

  • View动画
  • 帧动画
  • 属性动画

帧动画

在xml中定义<animation-list>属性,通过AnimationDrawable来播放动画。

LayoutAnimation

作用于ViewGroup,为ViewGroup指定一个动画,从而使得它的子元素都有这个动画的效果。比较常用的是使用在ListView上。

属性动画

帧动画

  • 时间插值器:TimeInterpolator
  • 类型估值器:TypeEvaluator

都可重写这2个类,从而实现自己需要的功能。

属性动画的前提条件

  1. 属性必须有对应的set方法,如果属性的在动画的时候没有传递初始值,那还需要提供get方法。
  2. 对属性所做的修改必须通过某种方法反映踹,比如UI上的改变。

如何破?

针对上面的两个问题,如果需要修改的属性不满足条件该怎么办?

  1. 在有权限可修改的情况下,给对象加上自己get、set方法;
  2. 在方法1不行的情况下,用一个雷来包装原始对象,间接设置get、set方法。
  3. 采用ValueAnimator监听动画的过程,主动修改属性的值。
private void performAnimation(final View target, final int start, final int end) {
    ValueAnimator valueAnimator = ValueAnimator.ofInt(1, 100);
    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            IntEvaluator evaluator = new IntEvaluator();
            float fraction = animation.getAnimatedFraction();
            target.getLayoutParams().width = evaluator.evaluate(fraction, start, end);
            target.requestLayout();
        }
    });
    valueAnimator.setDuration(5000).start();
}

属性动画的原理

动画是运行在主线程的。

results matching ""

    No results matching ""