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 中的动画有帧动画,view动画,属性动画(3.0后的)
帧动画
AnimationDrawable -
view动画
AlphaAnimation -
RotateAnimation -
ScaleAnimation -
TranslateAnimation -
AnimatorSet -
属性动画
ObjectAnimator -
ValueAnimator -
-------------------------------------------------------------------
1.AnimationDrawable 逐帧动画(是一种drawable,是一张一张图片的顺序展示,缺点是一般占内存比较大)
Java代码
// xml中定义帧动画及引用
// 它是一种drawable所以只能放到drawable文件夹下不能放到anim下
android:oneshot="true"> android:drawable="@mipmap/ic_launcher" android:duration="200" /> android:drawable="@mipmap/ic_launcher" android:duration="200" /> android:drawable="@mipmap/ic_launcher" android:duration="200" />
//animation-list属性:
//visible:drawable的初始可见性,默认为false。
//oneshot:是否只播放一次且停在最后一帧上。
//variablePadding:是否随着其状态的改变而改变。默认是false
//animation-list中的item属性:
//drawable: 当前帧引用的drawable资源
//duration: 当前帧显示的时间(毫秒为单位)
//在代码中引用生成AnimationDrawable
AnimationDrawable animationDrawable = (AnimationDrawable) getResources().getDrawable(R.drawable.animation_drawable);
//--------------------------------------------
//代码中定义帧动画:
animationDrawable = new AnimationDrawable();
animationDrawable.addFrame(drawable1, 100);
animationDrawable.addFrame(drawable2, 100);
animationDrawable.addFrame(drawable3, 100);
//--------------------------------------------
//帧动画使用:
imageView.setBackgroundResource(animationDrawable);
animationDrawable.start();
2.属性动画
Java代码
//属性动画3.0以后才有
//ValueAnimator值动画执行器(是值的一系类变化,这些值付给对象属性形成了动画)
//1.定义
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 1);
//2.设置执行时间
valueAnimator.setDuration(1000);
//3.设置插值器
valueAnimator.setInterpolator(new LinearInterpolator());
//4.设置估值器
valueAnimator.setEvaluator(new TypeEvaluator
@Override
public MyClass evaluate(float fraction, MyClass startValue, MyClass endValue) {
return null;
}
});
//5.设置值变化的监听
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
MyClass myClass = (MyClass) animation.getAnimatedValue();
}
});
//6.开始动画
valueAnimator.start();
//设置执行者监听
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) {
}
});
//ObjectAnimator(继承了ValueAnimator)对象动画执行器(直接对属性做改变)。view要变化的属性必须有set,get方法。
ObjectAnimator.ofFloat(view, "rotationX", 0.0F, 360.0F).setDuration(500).start();
3.view动画
Java代码
//xml定义viewd动画及引用(此种动画xml是放到anim文件夹下的)
//view动画的共有属性:
//duration:属性为动画持续时间
//startOffset:延时多长时间开始执行
//fillAfter:动画结束后是否停留在最后一帧。
repeatCount="-1":重复次数
repeatMode :动画重播的模式,即从头到尾,从头到尾,还是从头到尾,在从尾到头
//interpolator:属性为动画插入器
//accelerate_interpolator 加速-动画插入器
//decelerate_interpolator 减速- 动画插入器
//accelerate_decelerate_interpolator 加速-减速 动画插入器
//例如android:interpolator="@android:anim/accelerate_decelerate_interpolator"
//注:坐标或宽高的取值,可以是绝对值或者的自己宽或高的比例值(一下无特殊说明取值都可以是这两种形式用的坐标系原点都在自己的view的左上角)
//alpha 透明度动画---------------
android:fromAlpha="0" android:toAlpha="1" /> //fromAlpha:属性为动画起始时透明度(取值为0f-1f) //toAlpha:属性为动画结束时透明度 //rotate 旋转动画效果------------- android:pivotX="50%" android:pivotY="50%" android:fromDegrees="0" android:toDegrees="180" /> //pivotX:旋转轴心x轴坐标 //pivotY:旋转轴心y轴坐标 //fromDegrees:动画开始时的角度(顺时针为正值,逆时针为负值。取值可以大于360,水平状态为0度,) //toDegrees:动画结束时的角度 //scale 尺寸伸缩动画效果------------- android:pivotX="50%" android:pivotY="50%" android:fromXScale="0%" android:toXScale="100%" android:fromYScale="100%" android:toYScale="100%"/> //pivotX:旋转轴心x轴坐标 //pivotY:旋转轴心y轴坐标 //fromXScale:动画开始时的宽度 //toXScale:动画结束时的宽度 //fromYScale:动画开始时的高度 //toYScale:动画结束时的高度 //translate 位置转移动画效果------------- android:fromXDelta="0" android:toXDelta="100" android:fromYDelta="0" android:toYDelta="100" /> //fromXDelta:动画开始view左上角的x坐标 //toXDelta:动画结束时view左上角的x坐标 //fromYDelta动画开始时view左上角的y坐标 //toYDelta:动画结束时view左上角的y坐标 //view动画合集------------- android:shareInterpolator="true"> ... //shareInterpolator:集合中的动画是否共享插值器。如果合集中子项也有插值器,子项的起作用。 //xml中定义的view动画合集只能一起播放,顺序播放可以在代码中定义。 //在代码中引用生成动画 Animation myAnimation = AnimationUtils.loadAnimation(this,R.anim.my_action); //-------------------------------------------- //代码中定义view动画: //alpha 透明度动画 AlphaAnimation alphaAnimation=new AlphaAnimation(0.1f, 1.0f); //rotate 旋转动画效果 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(相对父) //scale 尺寸伸缩动画效果 public ScaleAnimation(float fromX, float toX, float fromY, float toY,int pivotXType, float pivotXValue, int pivotYType, float pivotYValue) //translate 位置转移动画效果 public TranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue,int fromYType, float fromYValue, int toYType, float toYValue) //AnimationSet view动画集合 //同时播放 AnimationSet set=new AnimationSet(true); set.addAnimation(alphaAnimation); set.addAnimation(rotateAnimation); set.addAnimation(scaleAnimation); set.addAnimation(translateAnimation); set.addAnimation(aSet); //顺序播放 AnimatorSet set = new AnimatorSet(); set.play(anim1).before(anim2); set.play(anim2).with(anim3); set.play(anim2).with(anim4) set.play(anim5).after(amin2); //-------------------------------------------- //view动画使用: view.startAnimation(animation); //动画可以设置监听 animation.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { // 动画开始时执行 } @Override public void onAnimationEnd(Animation animation) { // 动画结束时执行 } @Override public void onAnimationRepeat(Animation animation) { // 动画每次重复时执行 } });