研究了下以前不怎么用到的动画效果的实现
顺便做了一个新浪微博消息页面 图标切换动画 效果的实例
如图
然后封装了一下这个效果的实现代码
如下
- package com.lurencun.unit.unit;
- import android.app.Activity;
- import android.graphics.BitmapFactory;
- import android.graphics.Matrix;
- import android.view.animation.Animation;
- import android.view.animation.TranslateAnimation;
- import android.widget.ImageView;
- /**
- * 标签切换对应动画效果实现类
- *
- * @author poolo
- * @since 2012年8月10日
- * @version 1.0.0 完成了2,3,4个标签的情况下的处理(越多- -就要以笛卡尔积的数量增长- -我觉得呢2~4够用了)
- */
- public class Unit {
- private int current = 0;
- private Activity at;
- private ImageView cursor;
- private float bmpW;
- private float screenW;
- private float offset;// 偏移量
- /**
- *
- * @param a
- * 当前Activity
- * @param layoutId
- * 当前作为图标使用的ImageViewId
- * @param drawId
- * 当前图标的drawId
- * @param num
- * 当前标签个数
- */
- public Unit(Activity a, int viewId, int drawId, int num) {
- at = a;
- init(viewId, drawId, num);
- }
- /**
- * 纯粹是为了好看些的一个初始化数据包 无视这里吧
- *
- * @param viewId
- * @param drawId
- * @param num
- */
- private void init(int viewId, int drawId, int num) {
- cursor = (ImageView) at.findViewById(viewId);
- bmpW = BitmapFactory.decodeResource(at.getResources(), drawId)
- .getWidth();
- screenW = at.getWindowManager().getDefaultDisplay().getWidth();
- offset = (screenW / num - bmpW) / 2;
- Matrix matrix = new Matrix();
- matrix.postTranslate(offset, 0);
- cursor.setImageMatrix(matrix);
- }
- /**
- * 两个标签的情况
- * @param selectId 被选中的id
- */
- public void move2tag(int selectId) {
- Animation animation = null;
- float zero = 0;
- float one = offset * 2 + bmpW;
- switch (selectId) {
- case 0:
- if (current == 1) {
- animation = new TranslateAnimation(one, zero, 0, 0);
- }
- break;
- case 1:
- if (current == 0) {
- animation = new TranslateAnimation(zero, one, 0, 0);
- }
- break;
- }
- current = selectId;
- animation.setFillAfter(true);
- animation.setDuration(300);
- cursor.startAnimation(animation);
- }
- /**
- * 三个标签的情况
- * @param selectId 被选中的id
- */
- public void move3tag(int selectId) {
- Animation animation = null;
- float zero = 0;
- float one = offset * 2 + bmpW;
- float two = one * 2;
- switch (selectId) {
- case 0:
- if (current == 1) {
- animation = new TranslateAnimation(one, zero, 0, 0);
- }
- if (current == 2) {
- animation = new TranslateAnimation(two, zero, 0, 0);
- }
- break;
- case 1:
- if (current == 0) {
- animation = new TranslateAnimation(zero, one, 0, 0);
- }
- if (current == 2) {
- animation = new TranslateAnimation(two, one, 0, 0);
- }
- break;
- case 2:
- if (current == 0) {
- animation = new TranslateAnimation(zero, two, 0, 0);
- }
- if (current == 1) {
- animation = new TranslateAnimation(one, two, 0, 0);
- break;
- }
- }
- current = selectId;
- animation.setFillAfter(true);
- animation.setDuration(300);
- cursor.startAnimation(animation);
- }
- /**
- * 四个标签的情况
- * @param selectId 被选中的id
- */
- public void move4tag(int selectId) {
- Animation animation = null;
- float zero = 0;
- float one = offset * 2 + bmpW;
- float two = one * 2;
- float three = one * 3;
- switch (selectId) {
- case 0:
- if (current == 1) {
- animation = new TranslateAnimation(one, zero, 0, 0);
- }
- if (current == 2) {
- animation = new TranslateAnimation(two, zero, 0, 0);
- }
- if (current == 3) {
- animation = new TranslateAnimation(three, zero, 0, 0);
- }
- break;
- case 1:
- if (current == 0) {
- animation = new TranslateAnimation(zero, one, 0, 0);
- }
- if (current == 2) {
- animation = new TranslateAnimation(two, one, 0, 0);
- }
- if (current == 3) {
- animation = new TranslateAnimation(three, one, 0, 0);
- }
- break;
- case 2:
- if (current == 0) {
- animation = new TranslateAnimation(zero, two, 0, 0);
- }
- if (current == 1) {
- animation = new TranslateAnimation(one, two, 0, 0);
- }
- if (current == 3) {
- animation = new TranslateAnimation(three, two, 0, 0);
- }
- break;
- case 3:
- if (current == 0) {
- animation = new TranslateAnimation(zero, three, 0, 0);
- }
- if (current == 1) {
- animation = new TranslateAnimation(one, three, 0, 0);
- }
- if (current == 2) {
- animation = new TranslateAnimation(two, three, 0, 0);
- }
- break;
- }
- current = selectId;
- animation.setFillAfter(true);
- animation.setDuration(300);
- cursor.startAnimation(animation);
- }
- }
一个需要注意的地方 使用此方法的童鞋 切记自己的ImageView需要设置 android:scaleType="matrix" 才能使图形作为矩形计算 不至于出现错误
- <ImageView
- android:id="@+id/testImg1"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:contentDescription="@string/hello"
- android:scaleType="matrix"
- android:src="@drawable/jian_tou" />
部分借鉴与:http://www.eoeandroid.com/code/2012/0322/994_2.html
另如果路过的同学知道如何截android手机上的动态图麻烦留言告知下,谢谢。
jar包,源码,apk,截图都在下面。
已经交给团队封装代码的童鞋 将会封装到这个工具jar中
https://github.com/chenyoca/ToolkitForAndroid