在上一篇中我们使用到了位移动画TranslateAnimation,下面我们先来看看TranslateAnimation是如何实现Animation中的抽象方法的:

  1. /*
  2. * Copyright (C) 2006 The Android Open Source Project
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16.  
  17. package android.view.animation;
  18.  
  19. import android.content.Context;
  20. import android.content.res.TypedArray;
  21. import android.util.AttributeSet;
  22.  
  23. /**
  24. * An animation that controls the position of an object. See the
  25. * {@link android.view.animation full package} description for details and
  26. * sample code.
  27. *
  28. */
  29. public class TranslateAnimation extends Animation {
  30. private int mFromXType = ABSOLUTE;
  31. private int mToXType = ABSOLUTE;
  32.  
  33. private int mFromYType = ABSOLUTE;
  34. private int mToYType = ABSOLUTE;
  35.  
  36. private float mFromXValue = 0.0f;
  37. private float mToXValue = 0.0f;
  38.  
  39. private float mFromYValue = 0.0f;
  40. private float mToYValue = 0.0f;
  41.  
  42. private float mFromXDelta;
  43. private float mToXDelta;
  44. private float mFromYDelta;
  45. private float mToYDelta;
  46.  
  47. /**
  48. * Constructor used when a TranslateAnimation is loaded from a resource.
  49. *
  50. * @param context Application context to use
  51. * @param attrs Attribute set from which to read values
  52. */
  53. public TranslateAnimation(Context context, AttributeSet attrs) {
  54. super(context, attrs);
  55.  
  56. TypedArray a = context.obtainStyledAttributes(attrs,
  57. com.android.internal.R.styleable.TranslateAnimation);
  58.  
  59. Description d = Description.parseValue(a.peekValue(
  60. com.android.internal.R.styleable.TranslateAnimation_fromXDelta));
  61. mFromXType = d.type;
  62. mFromXValue = d.value;
  63.  
  64. d = Description.parseValue(a.peekValue(
  65. com.android.internal.R.styleable.TranslateAnimation_toXDelta));
  66. mToXType = d.type;
  67. mToXValue = d.value;
  68.  
  69. d = Description.parseValue(a.peekValue(
  70. com.android.internal.R.styleable.TranslateAnimation_fromYDelta));
  71. mFromYType = d.type;
  72. mFromYValue = d.value;
  73.  
  74. d = Description.parseValue(a.peekValue(
  75. com.android.internal.R.styleable.TranslateAnimation_toYDelta));
  76. mToYType = d.type;
  77. mToYValue = d.value;
  78.  
  79. a.recycle();
  80. }
  81.  
  82. /**
  83. * Constructor to use when building a TranslateAnimation from code
  84. *
  85. * @param fromXDelta Change in X coordinate to apply at the start of the
  86. * animation
  87. * @param toXDelta Change in X coordinate to apply at the end of the
  88. * animation
  89. * @param fromYDelta Change in Y coordinate to apply at the start of the
  90. * animation
  91. * @param toYDelta Change in Y coordinate to apply at the end of the
  92. * animation
  93. */
  94. public TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta) {
  95. mFromXValue = fromXDelta;
  96. mToXValue = toXDelta;
  97. mFromYValue = fromYDelta;
  98. mToYValue = toYDelta;
  99.  
  100. mFromXType = ABSOLUTE;
  101. mToXType = ABSOLUTE;
  102. mFromYType = ABSOLUTE;
  103. mToYType = ABSOLUTE;
  104. }
  105.  
  106. /**
  107. * Constructor to use when building a TranslateAnimation from code
  108. *
  109. * @param fromXType Specifies how fromXValue should be interpreted. One of
  110. * Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF, or
  111. * Animation.RELATIVE_TO_PARENT.
  112. * @param fromXValue Change in X coordinate to apply at the start of the
  113. * animation. This value can either be an absolute number if fromXType
  114. * is ABSOLUTE, or a percentage (where 1.0 is 100%) otherwise.
  115. * @param toXType Specifies how toXValue should be interpreted. One of
  116. * Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF, or
  117. * Animation.RELATIVE_TO_PARENT.
  118. * @param toXValue Change in X coordinate to apply at the end of the
  119. * animation. This value can either be an absolute number if toXType
  120. * is ABSOLUTE, or a percentage (where 1.0 is 100%) otherwise.
  121. * @param fromYType Specifies how fromYValue should be interpreted. One of
  122. * Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF, or
  123. * Animation.RELATIVE_TO_PARENT.
  124. * @param fromYValue Change in Y coordinate to apply at the start of the
  125. * animation. This value can either be an absolute number if fromYType
  126. * is ABSOLUTE, or a percentage (where 1.0 is 100%) otherwise.
  127. * @param toYType Specifies how toYValue should be interpreted. One of
  128. * Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF, or
  129. * Animation.RELATIVE_TO_PARENT.
  130. * @param toYValue Change in Y coordinate to apply at the end of the
  131. * animation. This value can either be an absolute number if toYType
  132. * is ABSOLUTE, or a percentage (where 1.0 is 100%) otherwise.
  133. */
  134. public TranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue,
  135. int fromYType, float fromYValue, int toYType, float toYValue) {
  136.  
  137. mFromXValue = fromXValue;
  138. mToXValue = toXValue;
  139. mFromYValue = fromYValue;
  140. mToYValue = toYValue;
  141.  
  142. mFromXType = fromXType;
  143. mToXType = toXType;
  144. mFromYType = fromYType;
  145. mToYType = toYType;
  146. }
  147.  
  148. @Override
  149. protected void applyTransformation(float interpolatedTime, Transformation t) {
  150. float dx = mFromXDelta;
  151. float dy = mFromYDelta;
  152. if (mFromXDelta != mToXDelta) {
  153. dx = mFromXDelta + ((mToXDelta - mFromXDelta) * interpolatedTime);
  154. }
  155. if (mFromYDelta != mToYDelta) {
  156. dy = mFromYDelta + ((mToYDelta - mFromYDelta) * interpolatedTime);
  157. }
  158. t.getMatrix().setTranslate(dx, dy);
  159. }
  160.  
  161. @Override
  162. public void initialize(int width, int height, int parentWidth, int parentHeight) {
  163. super.initialize(width, height, parentWidth, parentHeight);
  164. mFromXDelta = resolveSize(mFromXType, mFromXValue, width, parentWidth);
  165. mToXDelta = resolveSize(mToXType, mToXValue, width, parentWidth);
  166. mFromYDelta = resolveSize(mFromYType, mFromYValue, height, parentHeight);
  167. mToYDelta = resolveSize(mToYType, mToYValue, height, parentHeight);
  168. }

可以看到实际上重写了两个方法:initialize和applyTransformation

  1. /**
  2. * Initialize this animation with the dimensions of the object being
  3. * animated as well as the objects parents. (This is to support animation
  4. * sizes being specifed relative to these dimensions.)
  5. *
  6. * <p>Objects that interpret Animations should call this method when
  7. * the sizes of the object being animated and its parent are known, and
  8. * before calling {@link #getTransformation}.
  9. *
  10. *
  11. * @param width Width of the object being animated
  12. * @param height Height of the object being animated
  13. * @param parentWidth Width of the animated object's parent
  14. * @param parentHeight Height of the animated object's parent
  15. */
  16. public void initialize(int width, int height, int parentWidth, int parentHeight) {
  17. reset();
  18. mInitialized = true;
  19. }
  1. /**
  2. * Helper for getTransformation. Subclasses should implement this to apply
  3. * their transforms given an interpolation value. Implementations of this
  4. * method should always replace the specified Transformation or document
  5. * they are doing otherwise.
  6. *
  7. * @param interpolatedTime The value of the normalized time (0.0 to 1.0)
  8. * after it has been run through the interpolation function.
  9. * @param t The Transofrmation object to fill in with the current
  10. * transforms.
  11. */
  12. protected void applyTransformation(float interpolatedTime, Transformation t) {
  13. }

从initialize方法的注释上看,这个方法的主要作用是:初始化对象的尺寸以及父容器尺寸(为了确定和父容器的相对位置)。

从applyTransformation方法的注释上看,这个方法应该被实现,这个方法给出了一个interpolation值,并帮助获得Transformation对象,应该自己设置transformation对象来实现自己的动画效果。

好吧,基于以上研究,我们试着来重写一个Animation

  1. package com.example.testanimation;
  2.  
  3. import android.graphics.Camera;
  4. import android.graphics.Matrix;
  5. import android.view.animation.Animation;
  6. import android.view.animation.LinearInterpolator;
  7. import android.view.animation.Transformation;
  8.  
  9. /**
  10. * 自定义动画
  11. * @author 阳光小强
  12. *
  13. */
  14. public class MyAnimation extends Animation{
  15.  
  16. private float centerX;
  17. private float centerY;
  18. private int duration;
  19. private Camera camera = new Camera();
  20. public MyAnimation(float x, float y, int duration){
  21. this.centerX = x;
  22. this.centerY = y;
  23. this.duration = duration;
  24. }
  25.  
  26. @Override
  27. public void initialize(int width, int height, int parentWidth,
  28. int parentHeight) {
  29. super.initialize(width, height, parentWidth, parentHeight);
  30.  
  31. setDuration(duration);
  32.  
  33. setFillAfter(true);
  34.  
  35. setInterpolator(new LinearInterpolator());
  36. }
  37.  
  38. @Override
  39. protected void applyTransformation(float interpolatedTime, Transformation t) {
  40. camera.save();
  41. camera.translate(100f - 100f * interpolatedTime, 150f * interpolatedTime -150, 80f - 80f * interpolatedTime);
  42. camera.rotateY(360 * interpolatedTime);
  43. camera.rotateX(360 * interpolatedTime);
  44. Matrix matrix = t.getMatrix();
  45. camera.getMatrix(matrix);
  46. matrix.preTranslate(-centerX, -centerY);
  47. matrix.postTranslate(centerX, centerY);
  48. camera.restore();
  49. }
  50. }

代码解释:

1、setDuration(duration):设置动画时间

2、setFillAfter(true):设置动画结束后保持,如果设为false则动画结束后回到原来状态。

3、setInterpolator(new LinearInterpolator()):Interpolater实际上是控制补间动画的插入帧的频率的,所以就会有加速、减速、匀速动画。

4、Camera:一个空间变换工具,类似于Matrix,提供了各种变换方法,如上面的translate和rotateY等。

5、Matrix:一个三维的矩阵变换函数。

6、camera.getMatrix(matrix):计算当前的矩阵变换,并将其复制到矩阵matrix中。

7、matrix.preTranslate :执行矩阵指定的转换。

8、matrix.postTranslate:执行矩阵指定的转换(后面两个方法怎么转换,有什么区别,这就是数学知识了,一两句也说不清)。

Android中的动画详解系列【3】——自定义动画研究的更多相关文章

  1. Android中的动画详解系列【4】——Activity之间切换动画

    前面介绍了Android中的逐帧动画和补间动画,并实现了简单的自定义动画,这一篇我们来看看如何将Android中的动画运用到实际开发中的一个场景--Activity之间跳转动画. 一.定义动画资源 如 ...

  2. Android中Service(服务)详解

    http://blog.csdn.net/ryantang03/article/details/7770939 Android中Service(服务)详解 标签: serviceandroidappl ...

  3. Android中mesure过程详解

    我们在编写layout的xml文件时会碰到layout_width和layout_height两个属性,对于这两个属性我们有三种选择:赋值成具体的数值,match_parent或者wrap_conte ...

  4. Android中Intent组件详解

    Intent是不同组件之间相互通讯的纽带,封装了不同组件之间通讯的条件.Intent本身是定义为一个类别(Class),一个Intent对象表达一个目的(Goal)或期望(Expectation),叙 ...

  5. Android中的动画详解系列【2】——飞舞的蝴蝶

    这一篇来使用逐帧动画和补间动画来实现一个小例子,首先我们来看看Android中的补间动画. Android中使用Animation代表抽象的动画类,该类包括下面几个子类: AlphaAnimation ...

  6. RxJava在Android中使用场景详解

    RxJava 系列文章 <一,RxJava create操作符的用法和源码分析> <二,RxJava map操作符用法详解> <三,RxJava flatMap操作符用法 ...

  7. Android中shape属性详解

    一.简单使用 刚开始,就先不讲一堆标签的意义及用法,先简单看看shape标签怎么用. 1.新建shape文件 首先在res/drawable文件夹下,新建一个文件,命名为:shape_radius.x ...

  8. Android中的Service详解

    今天我们就来介绍一下Android中的四大组件中的服务Service,说到Service, 它分为本地服务和远程服务:区分这两种服务就是看客户端和服务端是否在同一个进程中,本地服务是在同一进程中的,远 ...

  9. Android中Service 使用详解(LocalService + RemoteService)

    Service 简介: Service分为本地服务(LocalService)和远程服务(RemoteService): 1.本地服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外L ...

随机推荐

  1. Linux的用户和组管理

    1.用户和组 一个用户必须有一个主组 一个用户可以同时属于多个组 一个组可以拥有多个用户 用户信息存在: /etc/passwd 组信息存在:/etc/group 密码信息存在: /etc/shado ...

  2. Quartz学习总结(1)——Spring集成Quartz框架

    一.Quartz简介 Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简 ...

  3. android屏幕适配方案

    曾经看了android的屏幕适配方案,有非常多种.当中自己用到的一种是:先找一款主流的分辨率的android机,如:1080*1920的分辨率做基准,然后在这个基准上.调整好一切布局.图片.适配其它手 ...

  4. activity-栈相关属性

    1.启动任务栈 第一种,动作设置为“android.intent.action.MAIN”,类别设置为“android.intent.category.LAUNCHER”,可以使这个ACT(activ ...

  5. elasticsearch cluster 详解

    上一篇通过clusterservice对cluster做了一个简单的概述, 应该能够给大家一个初步认识.本篇将对cluster的代码组成进行详细分析,力求能够对cluster做一个更清晰的描述.clu ...

  6. h.264硬件解码

    // H264HWDecoder.m // H264EncoderDecoder // // Created by lujunjie on 2016/11/28. // Copyright © 201 ...

  7. .v 和 .sdf

    DC输出的.v(网表?)和.sdf(储存的是延时的信息) 用于后仿真

  8. [Mobx] Use MobX actions to change and guard state

    This lesson explains how actions can be used to control and modify the state of your application. Th ...

  9. js进阶 14-1 jquery的ajax系列中的load方法的作用是什么

    js进阶 14-1 jquery的ajax系列中的load方法的作用是什么 一.总结 一句话总结:jQuery load()方法作用是从服务器加载数据,是一个简单但强大的AJAX方法. 1.load函 ...

  10. Library Component Properties的表格如何填写