研究了下以前不怎么用到的动画效果的实现
顺便做了一个新浪微博消息页面 图标切换动画 效果的实例
如图
然后封装了一下这个效果的实现代码
如下
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