热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Android实现文字翻转动画的效果

本文实现了Android程序文字翻转动画的实现,具有一定的参考价值,有需要的朋友可以了解一下。

本文实现了Android程序文字翻转动画的小程序,具体代码如下:

先上效果图如下:

要求:

沿Y轴正方向看,数值减1时动画逆时针旋转,数值加1时动画顺时针旋转。

实现动画的具体细节见"RotateAnimation.Java"。为方便查看动画旋转方向,可以将RotateAnimation.DEBUG值设置为true即可。


RotateAnimation参考自APIDemos的Rotate3DAnimation


RotateAnimation的构造函数需有三个参数,分别说明动画组件的中心点位置及旋转方向。


RotateAnimation.initialize()将初始化动画组件及其父容器的宽高;通常亦可进行另外的初始化工作,本例中用于执行对camera进行实例化赋值。


RotateAnimation.applyTransformation()第一个参数为动画的进度时间值,取值范围为[0.0f,1.0f],第二个参数Transformation记录着动画某一帧中变形的原始数据。该方法在动画的每一帧显示过程中都会被调用。


在翻转过程中,为了避免在动画下半部分时图像为镜面效果影响数字的阅读,应将翻转角度做180度的减法。代码为

RotateAnimation.applyTransformation()中的:
if (overHalf) { 
  // 翻转过半的情况下,为保证数字仍为可读的文字而非镜面效果的文字,需翻转180度。 
  degree = degree - 180; 
} 

动画翻转到一半后,应更新数字内容。为了得知翻转进度,于RotateAnimation中设计一内部静态接口类"InterpolatedTimeListener",该接口只有一个方法"interpolatedTime(float interpolatedTime)"可以将动画进度传递给监听发起者。

Java代码如下,XML请根据效果图自行实现:


ActRotate.java

package lab.sodino.rotate; 
 
import lab.sodino.rotate.RotateAnimation.InterpolatedTimeListener; 
import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 
 
/** 
 * @author Sodino E-mail:sodinoopen@hotmail.com 
 * @version Time:2012-6-27 上午07:32:00 
 */ 
public class ActRotate extends Activity implements OnClickListener, InterpolatedTimeListener { 
  private Button btnIncrease, btnDecrease; 
  private TextView txtNumber; 
  private int number; 
  /** TextNumber是否允许显示最新的数字。 */ 
  private boolean enableRefresh; 
 
  public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
 
    btnIncrease = (Button) findViewById(R.id.btnIncrease); 
    btnDecrease = (Button) findViewById(R.id.btnDecrease); 
    txtNumber = (TextView) findViewById(R.id.txtNumber); 
 
    btnIncrease.setOnClickListener(this); 
    btnDecrease.setOnClickListener(this); 
 
    number = 3; 
    txtNumber = (TextView) findViewById(R.id.txtNumber); 
    txtNumber.setText(Integer.toString(number)); 
  } 
 
  public void onClick(View v) { 
    enableRefresh = true; 
    RotateAnimation rotateAnim = null; 
    float cX = txtNumber.getWidth() / 2.0f; 
    float cY = txtNumber.getHeight() / 2.0f; 
    if (v == btnDecrease) { 
      number--; 
      rotateAnim = new RotateAnimation(cX, cY, RotateAnimation.ROTATE_DECREASE); 
    } else if (v == btnIncrease) { 
      number++; 
      rotateAnim = new RotateAnimation(cX, cY, RotateAnimation.ROTATE_INCREASE); 
    } 
    if (rotateAnim != null) { 
      rotateAnim.setInterpolatedTimeListener(this); 
      rotateAnim.setFillAfter(true); 
      txtNumber.startAnimation(rotateAnim); 
    } 
  } 
 
  @Override 
  public void interpolatedTime(float interpolatedTime) { 
    // 监听到翻转进度过半时,更新txtNumber显示内容。 
    if (enableRefresh && interpolatedTime > 0.5f) { 
      txtNumber.setText(Integer.toString(number)); 
      Log.d("ANDROID_LAB", "setNumber:" + number); 
      enableRefresh = false; 
    } 
  } 
} 

RotateAnimation.java

import android.view.animation.Animation; 
import android.view.animation.Transformation; 
 
/** 
 * @author Sodino E-mail:sodinoopen@hotmail.com 
 * @version Time:2012-6-27 上午07:32:00 
 */ 
public class RotateAnimation extends Animation { 
  /** 值为true时可明确查看动画的旋转方向。 */ 
  public static final boolean DEBUG = false; 
  /** 沿Y轴正方向看,数值减1时动画逆时针旋转。 */ 
  public static final boolean ROTATE_DECREASE = true; 
  /** 沿Y轴正方向看,数值减1时动画顺时针旋转。 */ 
  public static final boolean ROTATE_INCREASE = false; 
  /** Z轴上最大深度。 */ 
  public static final float DEPTH_Z = 310.0f; 
  /** 动画显示时长。 */ 
  public static final long DURATION = 800l; 
  /** 图片翻转类型。 */ 
  private final boolean type; 
  private final float centerX; 
  private final float centerY; 
  private Camera camera; 
  /** 用于监听动画进度。当值过半时需更新txtNumber的内容。 */ 
  private InterpolatedTimeListener listener; 
 
  public RotateAnimation(float cX, float cY, boolean type) { 
    centerX = cX; 
    centerY = cY; 
    this.type = type; 
    setDuration(DURATION); 
  } 
 
  public void initialize(int width, int height, int parentWidth, int parentHeight) { 
    // 在构造函数之后、getTransformation()之前调用本方法。 
    super.initialize(width, height, parentWidth, parentHeight); 
    camera = new Camera(); 
  } 
 
  public void setInterpolatedTimeListener(InterpolatedTimeListener listener) { 
    this.listener = listener; 
  } 
 
  protected void applyTransformation(float interpolatedTime, Transformation transformation) { 
    // interpolatedTime:动画进度值,范围为[0.0f,10.f] 
    if (listener != null) { 
      listener.interpolatedTime(interpolatedTime); 
    } 
    float from = 0.0f, to = 0.0f; 
    if (type == ROTATE_DECREASE) { 
      from = 0.0f; 
      to = 180.0f; 
    } else if (type == ROTATE_INCREASE) { 
      from = 360.0f; 
      to = 180.0f; 
    } 
    float degree = from + (to - from) * interpolatedTime; 
    boolean overHalf = (interpolatedTime > 0.5f); 
    if (overHalf) { 
      // 翻转过半的情况下,为保证数字仍为可读的文字而非镜面效果的文字,需翻转180度。 
      degree = degree - 180; 
    } 
    // float depth = 0.0f; 
    float depth = (0.5f - Math.abs(interpolatedTime - 0.5f)) * DEPTH_Z; 
    final Matrix matrix = transformation.getMatrix(); 
    camera.save(); 
    camera.translate(0.0f, 0.0f, depth); 
    camera.rotateY(degree); 
    camera.getMatrix(matrix); 
    camera.restore(); 
    if (DEBUG) { 
      if (overHalf) { 
        matrix.preTranslate(-centerX * 2, -centerY); 
        matrix.postTranslate(centerX * 2, centerY); 
      } 
    } else { 
      //确保图片的翻转过程一直处于组件的中心点位置 
      matrix.preTranslate(-centerX, -centerY); 
      matrix.postTranslate(centerX, centerY); 
    } 
  } 
 
  /** 动画进度监听器。 */ 
  public static interface InterpolatedTimeListener { 
    public void interpolatedTime(float interpolatedTime); 
  } 
} 

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文讲述了如何通过代码在Android中更改Recycler视图项的背景颜色。通过在onBindViewHolder方法中设置条件判断,可以实现根据条件改变背景颜色的效果。同时,还介绍了如何修改底部边框颜色以及提供了RecyclerView Fragment layout.xml和项目布局文件的示例代码。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 本文是关于自学Android的笔记,包括查看类的源码的方法,活动注册的必要性以及布局练习的重要性。通过学习本文,读者可以了解到在自学Android过程中的一些关键点和注意事项。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了一种图片处理应用,通过固定容器来实现缩略图的功能。该方法可以实现等比例缩略、扩容填充和裁剪等操作。详细的实现步骤和代码示例在正文中给出。 ... [详细]
author-avatar
陈家美女22_135
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有