Android部分知识点事件和动画

事件

事件就是当用户触摸屏幕所产生的点击事件(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/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,340评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,762评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,329评论 0 329
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,678评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,583评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,995评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,493评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,145评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,293评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,250评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,267评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,973评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,556评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,648评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,873评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,257评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,809评论 2 339