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);
  }
}

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

(0)

相关推荐

  • Android编程实现类似天气预报图文字幕垂直滚动效果的方法

    本文实例讲述了Android编程实现类似天气预报图文字幕垂直滚动效果的方法.分享给大家供大家参考,具体如下: 在很多天气或者新闻的应用中,我们都能看到一些字幕滚动的效果,最简单的实现为跑马灯效果,用系统提供的属性即可实现. 复杂一些的就需要自己去用自定义控件实现. 比如 让TextView 实现垂直滚动. 这里我要讲的是垂直滚动的字幕效果,并且内容并不仅为文字,还可以加入图片或者其他元素. 废话不多说,还是直接上效果图: 首先还是看一下核心的实现: 目前我的做法是重写了ScrollView,对外

  • Android实现文字和图片混排(文字环绕图片)效果

    本文实例讲述了Android实现文字和图片混排(文字环绕图片)效果.分享给大家供大家参考,具体如下: 在平时我们做项目中,或许有要对一张图片或者某一个东西进行文字和图片说明,这时候要求排版美观,所以会出现文字和图片混排的情况,如图: 这种情况就是上下两个文字说明是连续在一起的,这就要求我们计算上面的文字说明怎么和下面的文字说明连贯结合在一起呢,这就要求我们进行计算了,下面给出代码,代码中也有详细的注释,原理也很简单. 因为算是比较简单,直接就在activity中去计算了: package com

  • 控制Android LED灯颜色的代码实例

    很多Android手机上都配有LED灯,比如HTC的手机在充电.新来短信等时候都会有响应的指示,其实很简单的这都是NotificationManager的一些参数而已,下面Android123给大家说下如何通过代码控制LED灯的闪烁,因为有些机型没有LED灯或颜色种类较少,发布时需要真机观察. 复制代码 代码如下: final int ID_LED=19871103;         NotificationManager nm=(NotificationManager)getSystemSer

  • Android实现文字滚动效果

    Android 实现文字滚动效果,自己写了个timer小计时器,textview文字上下翻动效果: public class AutoTextView extends TextSwitcher implements ViewSwitcher.ViewFactory { private float mHeight; private Context mContext; //mInUp,mOutUp分别构成向下翻页的进出动画 private Rotate3dAnimation mInUp; priva

  • 详解Android应用层制作LED指示灯

    详解Android应用层制作LED指示灯 在Java应用层修改LED指示灯的颜色,这个花了我半天时间, 才实现该功能! public class LEDActivity extends Activity implements View.OnClickListener { private static final String TAG = "LED"; Button mLedTest; int mLedStatus = 0; private final int mLedColorRed

  • Android Shader应用开发之霓虹闪烁文字效果

    本文实例为大家分享了Android霓虹闪烁文字效果的具体代码,供大家参考,具体内容如下 package com.example.apple.shaderdemo; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.LinearGradient; import android.graphics.Matrix; i

  • Android编程实现文字倒影效果的方法

    本文实例讲述了Android编程实现文字倒影效果的方法.分享给大家供大家参考,具体如下: 我们所有的view都继承自View类,View类里有个方法叫ondraw(). 即,我们看到的界面都是画出来的,所以我们可以重写ondraw()方法. 既然知道了这点就好办了,还有个难点就是,我们的倒影也是画出来的,那我们从哪去取原始图片呢?熟悉View的童鞋都知道Cache这个东西,不错,就是通过Cache我们取到了原始图片. 放源码了.,感谢期待.这个只是个demo,并不完善哈,布局什么的还需要调整下,

  • Android自定义Dialog实现文字动态加载效果

    之前在技术问答上面看到一个提问 "加载中-" 后面三个点是动态的,这么一个效果实现.想来想去,好像没想到好的处理方式. 尝试了一下,以一个最笨的方式实现了.先来看一下效果 : 我是通过自定义一个Dialog,加载中的效果,是在Dialog内部实现的,进度还是从Activity里面控制的. 下面是Dialog实现类: public class CustomDialog extends AlertDialog { public CustomDialog(Context context) {

  • android显示TextView文字的倒影效果实现代码

    今天记录一下TextView的倒影效果,显示一串文字,然后在文字的下方显示出它的倒影,先上效果图: 最重要的就是View中getDrawingCache()方法,该方法可以获取cache中的图像,然后绘制出来. 废话不多说,我是想写一个带有倒影的时间,时间可以走动.首先先写一个带有时间走动的View,这个很简单,获取当前时间,然后开启一个线程,隔一秒获取当前时间一次,然后显示在TextView上,当然,我们写控件,就需要继承TextView,代码如下: 复制代码 代码如下: package co

  • Android中使用TextView实现文字跑马灯效果

    通常情况下我们想实现文字的走马灯效果需要在xml文件中这样设置 <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" android:ellipsize="marquee" android:focusable="true" android:

  • Android基于ViewFilpper实现文字LED显示效果示例

    本文实例讲述了Android基于ViewFilpper实现文字LED显示效果.分享给大家供大家参考,具体如下: 这里给出来自Android官方API DEMO中动画效果实例. /** * FlipperView文字效果动画之:文字滚动动画 * * @description: * @author ldm * @date 2016-5-17 上午9:58:26 */ public class Animation2 extends Activity implements AdapterView.OnI

随机推荐