drawable
view(textview,imageview ...)
viewgroup(relative layout,linearLayout ...)
-----------------------------------------------------------------
分层模式
canvas分层
view叠加(事件传递机制)
view的事件传递机制
是通过dispatchTouchEvent进行事件分发的,(一次触摸的完整行为包括(down move up))
1.父容器的dispatchTouchEvent会调用onInterceptTouchEvent询问要不要拦截
如果拦截就会调用自己的onTouchEvent,事件就不再向下分发。(并且后续的事件(move up等)直接到此view也不再分发)
不拦截
2.就调用子view的dispatchTouchEvent重复上过程。
3.直到叶子节点,叶子节点的dispatchTouchEvent执行叶子节点的onTouchEvent
onTouchEvent如果返回true,dispatchTouchEvent也返回true。事件被消费,事件不再传递。
onTouchEvent如果返回false,dispatchTouchEvent也返回false。
4.父view调其他有关子view的dispatchTouchEvent,如果都返回false,执行父的onTouchEvent。
注:叶子节点onTouchEvent的down事件返回了false后续事件都不会再来(父一般都不会拦截down,因为拦截后move,up都不会到子)
滑动冲突问题其实就是子的view消费了事件导致父view得不到此事件,
解决方法就是根据需要决定父view要不要拦截此事件。
http://www.cnblogs.com/linjzong/p/4191891.html
----------------------------------------------------------------
刷新动力
定时器
延时
滑动
帧动画
属性动画
view动画
---------------------------------------------------------------------------------------------------------------
动画类型
Android 中的动画有帧动画,属性动画(3.0后的)view动画,
帧动画
AnimationDrawable - <animation-list>(它是一种drawable,对应xml只能放在drawable文件夹下,其他两种是放在anim中的)
属性动画
ObjectAnimator - <objectAnimator>
ValueAnimator - <animator>
AnimatorSet - <set>(动画合集,几种动画同时播放,或顺序播放)
view动画
AlphaAnimation - <alpha/>(透明度动画)
RotateAnimation - <rotate/>(旋转动画有轴心)
ScaleAnimation - <scale/>(缩放动画有轴心)
TranslateAnimation - <translate/>(移动动画)
AnimationSet - <set> (view动画合集,几种动画同时播放,或顺序播放)
1.AnimationDrawable逐帧动画(是一种drawable,是一张一张图片的顺序展示,缺点是一般占内存比较大)
xml中定义:
对应的标签是<animation-list>(它是一种drawable所以只能放到res/drawable文件夹下 )
animation-list属性:
visible:drawable的初始可见性,默认为false。
oneshot:是否只播放一次且停在最后一帧上。
variablePadding:是否随着其状态的改变而改变。默认是false
animation-list中的item属性:
drawable: 当前帧引用的drawable资源
duration: 当前帧显示的时间(毫秒为单位)
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="true">
<item
android:drawable="@mipmap/ic_launcher"
android:duration="200" />
<item
android:drawable="@mipmap/ic_launcher"
android:duration="200" />
<item
android:drawable="@mipmap/ic_launcher"
android:duration="200" />
</animation-list>
AnimationDrawable animationDrawable = (AnimationDrawable) getResources().getDrawable(R.drawable.animation_drawable);
imageView.setBackgroundResource(animationDrawable);
animationDrawable.start();
代码定义帧动画:
animationDrawable = new AnimationDrawable();
animationDrawable.addFrame(drawable1, 100);
animationDrawable.addFrame(drawable2, 100);
animationDrawable.addFrame(drawable3, 100);
imageView.setBackgroundResource(animationDrawable);
animationDrawable.start();
2.属性动画(ValueAnimator,ObjectAnimator,AnimatorSet,ViewPropertyAnimator)(3.0以后才有)
是值的一系类变化,这些值可以是int float color object(这个需要自己定义估值器)),变化的值再赋给属性,形成动画。
view动画的共有属性:
duration:动画时长。
startOffset:动画延时多长时间开始。
repeatCount:动画播放次数,默认为0,-1表示无限循环(无限的代码中要自己结束动画)
repeatMode:默认是restart每次结束后重新开始,reverse每次结束后逆向返回。
valueType:变化值的类型xml只能是intType floatType,colorType,pathType(用到ObjectAnimator上)。
valueFrom:开始值。
valueTo:结束值。
interpolator:属性为动画插入器
accelerate_interpolator 加速-动画插入器
decelerate_interpolator 减速- 动画插入器
accelerate_decelerate_interpolator 加速-减速 动画插入器
例如android:interpolator="@android:anim/accelerate_decelerate_interpolator"
设置执行者监听
valueAnimator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
1.ValueAnimator值动画执行器(是值的一系类变化,这些值赋给对象属性形成了动画)
xml中定义:(xml中定义xml文件必须要放到res/animator文件夹下)
对应标签<animtor>
<animator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:startOffset="1000"
android:repeatCount="-1"
android:repeatMode="reverse"
android:valueType="intType"
android:valueFrom="10"
android:valueTo="100"/>
Animator animator= AnimatorInflater.loadAnimator(this,R.animator.my_animator);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float f = (Float) animation.getAnimatedValue();
}
});
valueAnimator.start();
代码中定义:
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 1);//值可以不是两个可以任意多个
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float f = (Float) animation.getAnimatedValue();
}
});
valueAnimator.start();
只能代码中用:
对象
ValueAnimator valueAnimator = ValueAnimator.ofObject(new TypeEvaluator<MyClass>(){
@Override
public String evaluate(float fraction, String MyClass, String MyClass) {
return (MyClass) animation.getAnimatedValue();
}
},new MyClass(),new MyClass());
valueAnimator.start();
属性值holder(可以实现多个属性变化)
PropertyValuesHolder propertyValuesHolder1=PropertyValuesHolder.ofInt(String propertyName, int... values);
propertyValuesHolder1.setObjectValues(myObject);
Keyframe类型对象由一个time/value对组成,定义了指定时间点的指定值
Keyframe ofInt(float fraction)//还需setValue(Object value)
Keyframe ofInt(float fraction, int value)
每一个keyframe还可以拥有自己的interpolator,控制了前一个关键帧到这一个关键帧之间的时间动画行为。
PropertyValuesHolder propertyValuesHolder2=PropertyValuesHolder.ofKeyframe(String propertyName, Keyframe... values)
propertyValuesHolder2.setObjectValues(myObject);
ValueAnimator valueAnimator = ValueAnimator.ofPropertyValuesHolder(propertyValuesHolder1,propertyValuesHolder2);
valueAnimator.start();
2.ObjectAnimator对象动画执行器(继承了ValueAnimator),(对象动画执行器,直接对属性做改变(要变化的属性必须有set,get方法(如果原类没有可以包装原类加上)))
xml中定义:
对应标签<objectAnimator>
propertyName:要改变值的属性名。(一定要有get,set方法)
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:propertyName="xxx"
android:duration="1000"
android:startOffset="1000"
android:repeatCount="-1"
android:repeatMode="reverse"
android:valueType="intType"
android:valueFrom="10"
android:valueTo="100"/>
Animator animator= AnimatorInflater.loadAnimator(this,R.animator.my_animator);
animator.setTarget(object);
animator.start();
代码中定义:
ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(view, "rotationX", 0.0F, 360.0F).setDuration(500);
objectAnimator.start();
ObjectAnimator ofInt(Object target, String xPropertyName, String yPropertyName,Path path);//两个参数需要path就是坐标点
ObjectAnimator ofMultiInt(Object target, String propertyName, Path path)
只能代码中用:
对象
ObjectAnimator objectAnimator = ObjectAnimator.ofObject(object,"propertyName",new TypeEvaluator<MyClass>(){
@Override
public String evaluate(float fraction, String MyClass, String MyClass) {
return (MyClass) animation.getAnimatedValue();
}
},new MyClass(),new MyClass());
objectAnimator.start();
属性值holder
PropertyValuesHolder propertyValuesHolder1=PropertyValuesHolder.ofInt(String propertyName, int... values);
propertyValuesHolder1.setObjectValues(myObject);
Keyframe类型对象由一个time/value对组成,定义了指定时间点的指定值
Keyframe ofInt(float fraction)//还需setValue(Object value)
Keyframe ofInt(float fraction, int value)
每一个keyframe还可以拥有自己的interpolator,控制了前一个关键帧到这一个关键帧之间的时间动画行为。
PropertyValuesHolder propertyValuesHolder2=PropertyValuesHolder.ofKeyframe(String propertyName, Keyframe... values)
propertyValuesHolder2.setObjectValues(myObject);
ObjectAnimator objectAnimator = ObjectAnimator.ofPropertyValuesHolder(Object object,PropertyValuesHolder... values);
objectAnimator.start();
3.AnimatorSet属性对话集
xml中定义:
对应标签<set>
ordering:together一起播放,sequentially顺序播放。
Interpolator:插值器
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:propertyName="xxx"
android:duration="1000"
android:startOffset="1000"
android:repeatCount="-1"
android:repeatMode="reverse"
android:valueType="intType"
android:valueFrom="10"
android:valueTo="100"/>
<objectAnimator
android:propertyName="yyy"
android:duration="1000"
android:startOffset="1000"
android:repeatCount="-1"
android:repeatMode="reverse"
android:valueType="intType"
android:valueFrom="10"
android:valueTo="100"/>
</set>
Animator animator= AnimatorInflater.loadAnimator(this,R.animator.my_animator);
animator.setTarget(object);
animator.start();
代码中定义:
AnimatorSet animatorSet=new AnimatorSet();
animatorSet.playSequentially(objectAnimator1,objectAnimator2);
animatorSet.start();
ViewPropertyAnimator view属性动画(用animator的方式执行view动画)
view.animate().alpha(1);//view布局时的初始值变化到指定值1.
3.view动画(alpha,rotate,scale,translate,AnimationSet)
view动画的共有属性:
duration:属性为动画持续时间
startOffset:延时多长时间开始执行
fillAfter:动画结束后是否停留在最后一帧。
repeatCount="-1":重复次数
repeatMode :动画重播的模式,即从头到尾,从头到尾,还是从头到尾,在从尾到头
interpolator:属性为动画插入器
accelerate_interpolator 加速-动画插入器
decelerate_interpolator 减速- 动画插入器
accelerate_decelerate_interpolator 加速-减速 动画插入器
例如android:interpolator="@android:anim/accelerate_decelerate_interpolator"
注:坐标或宽高的取值,可以是绝对值或者的自己宽或高的比例值(以下无特殊说明取值都可以是这两种形式用的坐标系原点都在自己的view的左上角)
动画可以设置监听
animation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
// 动画开始时执行
}
@Override
public void onAnimationEnd(Animation animation) {
// 动画结束时执行
}
@Override
public void onAnimationRepeat(Animation animation) {
// 动画每次重复时执行
}
});
alpha 透明度动画
xml中定义:
对应标签<alpha>(此种动画xml是放到res/anim文件夹下的)
fromAlpha:属性为动画起始时透明度(取值为0f-1f)
toAlpha:属性为动画结束时透明度
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:fromAlpha="0"
android:toAlpha="1" />
Animation myAnimation = AnimationUtils.loadAnimation(this,R.anim.my_action);
view.startAnimation(animation);
代码中定义:
AlphaAnimation alphaAnimation=new AlphaAnimation(0.1f, 1.0f);
view.startAnimation(animation);
rotate旋转动画
xml中定义:
对应的标签是<rotate>
pivotX:旋转轴心x轴坐标
pivotY:旋转轴心y轴坐标
fromDegrees:动画开始时的角度(顺时针为正值,逆时针为负值。取值可以大于360,水平状态为0度,)
toDegrees:动画结束时的角度
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:pivotX="50%"
android:pivotY="50%"
android:fromDegrees="0"
android:toDegrees="180" />
Animation myAnimation = AnimationUtils.loadAnimation(this,R.anim.my_action);
view.startAnimation(animation);
代码中定义:
public RotateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue,int pivotYType, float pivotYValue)
pivotYType,pivotYValue:可以取值为Animation.ABSOLUTE(绝对)、Animation.RELATIVE_TO_SELF(相对自身)、Animation.RELATIVE_TO_PARENT(相对父)
view.startAnimation(animation);
scale尺寸伸缩动画
xml中定义:
对应的标签是<scale>
pivotX:旋转轴心x轴坐标
pivotY:旋转轴心y轴坐标
fromXScale:动画开始时的宽度
toXScale:动画结束时的宽度
fromYScale:动画开始时的高度
toYScale:动画结束时的高度
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:pivotX="50%"
android:pivotY="50%"
android:fromXScale="0%"
android:toXScale="100%"
android:fromYScale="100%"
android:toYScale="100%"/>
Animation myAnimation = AnimationUtils.loadAnimation(this,R.anim.my_action);
view.startAnimation(animation);
代码中定义:
public ScaleAnimation(float fromX, float toX, float fromY, float toY,int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
pivotYType,pivotYValue:可以取值为Animation.ABSOLUTE(绝对)、Animation.RELATIVE_TO_SELF(相对自身)、Animation.RELATIVE_TO_PARENT(相对父)
view.startAnimation(animation);
translate 位置转移动画
xml中定义:
对应的标签是<translate>
fromXDelta:动画开始view左上角的x坐标
toXDelta:动画结束时view左上角的x坐标
fromYDelta动画开始时view左上角的y坐标
toYDelta:动画结束时view左上角的y坐标
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0"
android:toXDelta="100"
android:fromYDelta="0"
android:toYDelta="100" />
Animation myAnimation = AnimationUtils.loadAnimation(this,R.anim.my_action);
view.startAnimation(animation);
代码中定义:
public TranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue,int fromYType, float fromYValue, int toYType, float toYValue)
view.startAnimation(animation);
AnimationSet view动画合集
xml中定义:
对应的标签是<set>
Interpolator:插值器
shareInterpolator:默认true。集合中的动画是否共享插值器。如果合集中子项也有插值器,子项的起作用。
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="true">
<alpha />
<rotate />
<scale />
<translate />
<set>
...
</set>
</set>
AnimationSet myAnimationSet = AnimationUtils.loadAnimation(this,R.anim.my_action);
view.startAnimation(myAnimationSet);
代码中定义:
AnimationSet set=new AnimationSet(true);
set.addAnimation(alphaAnimation);
set.addAnimation(rotateAnimation);
set.addAnimation(scaleAnimation);
set.addAnimation(translateAnimation);
set.addAnimation(aSet);
view.startAnimation(set);