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个类,从而实现自己需要的功能。
属性动画的前提条件
- 属性必须有对应的set方法,如果属性的在动画的时候没有传递初始值,那还需要提供get方法。
- 对属性所做的修改必须通过某种方法反映踹,比如UI上的改变。
如何破?
针对上面的两个问题,如果需要修改的属性不满足条件该怎么办?
- 在有权限可修改的情况下,给对象加上自己get、set方法;
- 在方法1不行的情况下,用一个雷来包装原始对象,间接设置get、set方法。
- 采用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();
}
属性动画的原理
动画是运行在主线程的。