事件
事件就是当用户触摸屏幕所产生的点击事件(Touch Event),其相关细节被封装成MotionEvent对象
事件类型
- MotionEvent.ACTION_DOWN 按下View(所有事件的开始)
- MotionEvent.ACTION_MOVE 滑动View
- MotionEvent.ACTION_UP 抬起View(与DOWN对应)
- MotionEvent.ACTION_CANCEL 结束事件(非人为原因)
事件分发
把点击事件传递到某个对应的View上,并处理的过程
事件分发顺序
Activity -> ViewGroup -> View
注解:dispatch(分发)
在ViewGroup中可以通过onInterceptTouchEvent方法对事件传递进行拦截onInterceptTouchEvent方法返回true代表不允许事件继续向子View传递,返回false代表不对事件进行拦截,默认返回false。而View中没有onInterceptTouchEvent方法。
子View中如果将传递的事件消费掉,ViewGroup中将无法接收到任何事件。
事件传递机制最重要的三个方法:dispatchTouchEvent()分发事件、onInterceptTouchEvent()拦截事件、onTouchEvent()消费事件。
动画 Animation
分类:属性动画(property Animation)、视图动画(逐帧动画(Frame Animation)、补间动画(Tween Animation))
三种动画之间的继承关系
逐帧动画(Frame Animation)
把静态图片放入res/drawable目录下面,快速播放形成动画,实现方式有xml和Java,推荐使用xml
XML创建:
通过创建Animation_list.xml定义动画,在xml文件中每个item对应一帧(一张图片),drawable配置当前显示的界面,duration图片显示的时长。MainActivity中通过imageview.getDrawable实例化AnimationDrawabel对象,由animationdrawable调用start和stop来启动或暂停动画。
Java代码创建:
将图片资源保存到drawable目录下面,代码中将图片资源保存到整型数组中;通过new实例化AnimationDrawable对象,for循环遍历图片资源的整型数组然后由animationdrawable对象调用addFrame()方法来添加图片;最后把animationdrawable通过setImageDrawable添加到显示的控件上面。同样调用start和stop来启动或暂停动画。
补间动画(Tween Animation)
只指定图片开始和图片结束的“关键帧”,“中间帧”由系统计算并补齐
通过AnimationUtils.loadAnimation()来加载动画,startAnimation来启动动画
分类:
位移:Translate Animation
缩放: Scale Animation
透明度:Alpha Animation
旋转: Rotate Animation
XML创建四种方式共有属性:
- android:duration="3000" 动画持续时间(ms),必须设置,动画才有效果
- android:startOffset="1000" 动画延迟开始时间(ms)
- android:fillBefore 用于确定动画开始时,View的动画属性值,默认为true;fillBefore为true,在startOffset阶段时,将动画属性设置为给与的初始值
fillBefore为false,将动画属性设置为View本身的初始值 - android:fillAfter 动画播放完后,视图是否会停留在动画结束的状态,优先于fillBefore值,默认为false
- android:fillEnabled 是否应用fillBefore值,对fillAfter值无影响,默认为false
- android:repeatMode 选择重复播放动画模式,restart代表正序重放,reverse代表倒序回放,默认为restart
- android:repeatCount 重放次数(所以动画的播放次数=重放次数+1),为infinite时无限重复
- android:interpolator 插值器,即影响动画的播放速度
共有的Java方法:
- public void setDuration(long durationMillis) // 动画持续时间(ms),必须设置,动画才有效果
- public void setStartOffset(long startOffset) // 动画延迟开始时间(ms)
- public void setFillBefore(boolean fillBefore) // 用于确定动画开始时,View的动画属性值,默认为true
// fillBefore为true,在startOffset阶段时,将动画属性设置为给与的初始值
// fillBefore为false,将动画属性设置为View本身的初始值 - public void setFillAfter(boolean fillAfter) // 动画播放完后,视图是否会停留在动画结束的状态,优先于fillBefore值,默认为false
- public void setFillEnabled(boolean fillEnabled) // 是否应用fillBefore值,对fillAfter值无影响,默认为false
- public void setRepeatMode(int repeatMode) // 选择重复播放动画模式,Animation.RESTART 代表正序重放,Animation.REVERSE 代表倒序回放,默认为Animation.RESTART
- public void setRepeatCount(int repeatCount) // 重放次数(所以动画的播放次数=重放次数+1),为Animation.INFINITE 时无限重复
- public void setInterpolator(Interpolator i) // 插值器,即影响动画的播放速度
插值器:
系统内置插值器自定义插值器:
本质根据动画的进度(0%-100%)改变当前属性的值
实现方式:实现Interpolator/TimeInterpolator接口,重写getInterpolator()方法
补间动画实现Interpolator接口,属性动画实现TimeInterpolator接口(用于兼容Interpolator接口)
// Interpolator接口
public interface Interpolator {
// 内部只有一个方法
float getInterpolation(float input) {
// 参数说明
// input值值变化范围是0-1,且随着动画进度(0% - 100% )均匀变化
// 即动画开始时,input值 = 0;动画结束时input = 1
// 而中间的值则是随着动画的进度(0% - 100%)在0到1之间均匀增加
...
// 插值器的计算逻辑
return xxx;
// 返回的值就是用于估值器继续计算的fraction值,下面会详细说明
}
// TimeInterpolator接口
// 同上
public interface TimeInterpolator {
float getInterpolation(float input);
}
平移独有特性:
- android:fromXDelta 视图在水平方向x移动的起始值
- android:toXDelta 视图在水平方向x移动结束始值
- android:fromYDelta 视图在垂直方向y移动的起始值
- android:toYDelta 视图在垂直方向y移动的结束值
平移Java方法:
public TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
缩放独有特性:
-
android:fromXScale //动画在水平方向x的起始缩放倍数
-
android:toXScale //动画在水平方向x的结束缩放倍数
-
android:fromYScale //动画在竖直方向y的起始缩放倍数
-
android:toYScale //动画在竖直方向y的结束缩放倍数
//缩放倍数 0.0 表示收缩到没有,1.0 表示正常无收缩
//缩放倍数 < 1.0,收缩
//缩放倍数 > 1.0 放大 -
android:pivotX //缩放轴点的x坐标
-
android:pivotY //缩放轴点的y坐标
缩放Java方法:
public ScaleAnimation(float fromX, float toX, float fromY, float toY,int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
//缩放轴点取值类型:数值,百分比,百分比p
//数值(如50):轴点为View的左上角的原点在x方向或y方向加上50px的点。
//百分比(如50%):轴点为View的左上角的原点在x方向加上自身宽度50%或y方向加上自身高度50%的点
//百分比p(如50%p):轴点为View的左上角的原点在x方向加上父控件宽度50%或y方向加上父控件高度50%的点。与旋转共享
旋转独有特性:
-
android:fromDegrees // 动画开始时 视图的旋转角度(正数 = 顺时针,负数 = 逆时针)
-
android:toDegrees // 动画结束时 视图的旋转角度(正数 = 顺时针,负数 = 逆时针)
-
android:pivotX //缩放轴点的x坐标
-
android:pivotY //缩放轴点的y坐标
旋转Java方法:
public RotateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue,int pivotYType, float pivotYValue)
透明度独有特性:
- android:fromAlpha // 动画开始时视图的透明度(取值范围: 0.0 ~ 1.0)
- android:toAlpha // 动画结束时视图的透明度(取值范围: 0.0 ~ 1.0)
1表示不透明,0表示完全透明
透明度Java方法:
public AlphaAnimation(float fromAlpha, float toAlpha)
组合动画
同时使用旋转,缩放,透明度,平移的动画称为组合动画
组合动画创建XML,需要使用<set></set>标签
组合动画Java方法:
- public AnimationSet(boolean shareInterpolator) //AnimationSet的构造方法,shareInterpolator控制组合动画中的动画是否和集合共享同一个差值器
- public void addAnimation(Animation a) //将子动画加入到组合动画中
动画高级使用
1、监听动画
通过给Animation设置Listener,监听动画的开始、结束、重复来进行一系列操作,例如:界面跳转等。
采用动画适配器,解决实现接口繁琐的问题:
anim.addListener(new AnimatorListenerAdapter() {
// 向addListener()方法中传入适配器对象AnimatorListenerAdapter()
// 由于AnimatorListenerAdapter中已经实现好每个接口
// 所以这里不实现全部方法也不会报错
@Override
public void onAnimationStart(Animator animation) {
// 如想只想监听动画开始时刻,就只需要单独重写该方法就可以
}
});
补间动画原理
属性动画
补间动画只能作用在View上,无法对非View的对象进行动画操作;且补间动画没有改变View属性,只改变了视觉效果,以及动画效果单一。
属性动画是通过在一定时间间隔内不断对值进行改变和将该值赋值给对象,实现从对象属性上产生动画效果。
属性动画原理
参考文献:
http://182.254.228.71/
网友评论