废话一句:TranslateAnimation(移动) ScaleAnimation(大小)AlphaAnimation(透明度)
上代码
public class MainActivity extends Activity { private List<Map<String, Object>> itemList; private TextView tvPrevious, tvCurrent, tvNext; private ImageView ivCurrent, ivSelect; private final int DURATION = 600; // 动画时长 private final int MSG_UPDATE_THE_CONTENT = 1; private int currentPosition = 0; @SuppressLint("HandlerLeak") Handler handler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case MSG_UPDATE_THE_CONTENT: setValue(); break; } }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initViews(); initData(); findViewById(R.id.btn_up).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (currentPosition > 0) { currentPosition--; slidingDown(); } } }); findViewById(R.id.btn_down).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (currentPosition < itemList.size() - 1) { currentPosition++; slidingUp(); } } }); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_DPAD_UP: if (currentPosition > 0) { currentPosition--; slidingDown(); } break; case KeyEvent.KEYCODE_DPAD_DOWN: if (currentPosition < itemList.size() - 1) { currentPosition++; slidingUp(); } break; } return super.onKeyDown(keyCode, event); } // 按住下键向上滑动 private void slidingUp() { slidingUpAnimation(); handler.sendEmptyMessageDelayed(MSG_UPDATE_THE_CONTENT, DURATION + 10); } // 按住上键向下滑动 private void slidingDown() { slidingDownAnimation(); handler.sendEmptyMessageDelayed(MSG_UPDATE_THE_CONTENT, DURATION + 10); } /** * 向上滑动时候显示的动画 */ private void slidingUpAnimation() { // previous标题隐藏 Animation tvPreviousFadeOut = new AlphaAnimation(0.5f, 0f); tvPreviousFadeOut.setDuration(DURATION); tvPrevious.setAnimation(tvPreviousFadeOut); tvPrevious.startAnimation(tvPreviousFadeOut); // current标题褪色至previous AnimationSet tvCurrentToFade = new AnimationSet(true); float currentToFadeScale = (float) tvPrevious.getHeight() / tvCurrent.getHeight(); tvCurrentToFade.addAnimation(new TranslateAnimation(0, 0, 0, -(tvCurrent.getTop() - tvPrevious.getTop()) / currentToFadeScale)); tvCurrentToFade.addAnimation(new ScaleAnimation(1, currentToFadeScale, 1, currentToFadeScale)); tvCurrentToFade.addAnimation(new AlphaAnimation(1f, 0.5f)); tvCurrentToFade.setDuration(DURATION); tvCurrent.setAnimation(tvCurrentToFade); tvCurrent.startAnimation(tvCurrentToFade); // next标题显示至current AnimationSet tvNextToShow = new AnimationSet(true); float nextToShowScale = (float) tvCurrent.getHeight() / tvNext.getHeight(); tvNextToShow.addAnimation(new TranslateAnimation(0, 0, 0, -(tvNext.getTop() - tvCurrent.getTop()) / nextToShowScale)); tvNextToShow.addAnimation(new ScaleAnimation(1, nextToShowScale, 1, nextToShowScale)); tvNextToShow.addAnimation(new AlphaAnimation(0.5f, 1f)); tvNextToShow.setDuration(DURATION); tvNext.setAnimation(tvNextToShow); tvNext.startAnimation(tvNextToShow); // current图片隐藏 AnimationSet ivCurrentToFadePart1 = new AnimationSet(true); ivCurrentToFadePart1.addAnimation(new TranslateAnimation(0, 0, 0, -ivCurrent.getHeight() / 5)); ivCurrentToFadePart1.addAnimation(new AlphaAnimation(1f, 0.0f)); ivCurrentToFadePart1.setDuration(DURATION / 2); ivCurrentToFadePart1.setFillAfter(true); ivCurrent.setAnimation(ivCurrentToFadePart1); ivCurrent.startAnimation(ivCurrentToFadePart1); // next图片显示 Map<String, Object> nextItem = itemList.get(currentPosition); ivSelect.setImageResource((Integer) nextItem.get("image")); AnimationSet ivNextToShowPart2 = new AnimationSet(true); ivNextToShowPart2.addAnimation(new TranslateAnimation(0, 0, ivCurrent.getHeight() / 5, 0)); ivNextToShowPart2.addAnimation(new AlphaAnimation(0f, 1f)); ivNextToShowPart2.setStartOffset(DURATION / 2); ivNextToShowPart2.setDuration(DURATION / 2); ivSelect.setAnimation(ivNextToShowPart2); ivSelect.startAnimation(ivNextToShowPart2); } /** * 向下滑动时候显示的动画 */ private void slidingDownAnimation() { // next标题隐藏 Animation tvNextFadeOut = new AlphaAnimation(0.5f, 0f); tvNextFadeOut.setDuration(DURATION); tvNext.setAnimation(tvNextFadeOut); tvNext.startAnimation(tvNextFadeOut); // pervious标题显示至current AnimationSet PreviousToShow = new AnimationSet(true); float previousToShowScale = (float) tvCurrent.getHeight() / tvPrevious.getHeight(); PreviousToShow.addAnimation(new TranslateAnimation(0, 0, 0, (tvCurrent.getTop() - tvPrevious.getTop()) / previousToShowScale)); PreviousToShow.addAnimation(new ScaleAnimation(1, previousToShowScale, 1, previousToShowScale)); PreviousToShow.addAnimation(new AlphaAnimation(0.5f, 1f)); PreviousToShow.setDuration(DURATION); tvPrevious.setAnimation(PreviousToShow); tvPrevious.startAnimation(PreviousToShow); // current标题褪色至next AnimationSet tvCurrentToFade = new AnimationSet(true); float CurrentToFadeScale = (float) tvNext.getHeight() / tvCurrent.getHeight(); tvCurrentToFade.addAnimation(new TranslateAnimation(0, 0, 0, (tvNext.getTop() - tvCurrent.getTop()) / CurrentToFadeScale)); tvCurrentToFade.addAnimation(new ScaleAnimation(1, CurrentToFadeScale, 1, CurrentToFadeScale)); tvCurrentToFade.addAnimation(new AlphaAnimation(1f, 0.5f)); tvCurrentToFade.setDuration(DURATION); tvCurrent.setAnimation(tvCurrentToFade); tvCurrent.startAnimation(tvCurrentToFade); // current图片隐藏 AnimationSet ivCurrentToFadePart1 = new AnimationSet(true); ivCurrentToFadePart1.addAnimation(new TranslateAnimation(0, 0, 0, ivCurrent.getHeight() / 5)); ivCurrentToFadePart1.addAnimation(new AlphaAnimation(1f, 0.0f)); ivCurrentToFadePart1.setDuration(DURATION / 2); ivCurrentToFadePart1.setFillAfter(true); ivCurrent.setAnimation(ivCurrentToFadePart1); ivCurrent.startAnimation(ivCurrentToFadePart1); // previous 图片显示 Map<String, Object> previousItem = itemList.get(currentPosition); ivSelect.setImageResource((Integer) previousItem.get("image")); AnimationSet ivPreviousToShowPart2 = new AnimationSet(true); ivPreviousToShowPart2.addAnimation(new TranslateAnimation(0, 0, -ivSelect.getHeight() / 5, 0)); ivPreviousToShowPart2.addAnimation(new AlphaAnimation(0f, 1f)); ivPreviousToShowPart2.setStartOffset(DURATION / 2); ivPreviousToShowPart2.setDuration(DURATION / 2); ivSelect.setAnimation(ivPreviousToShowPart2); ivSelect.startAnimation(ivPreviousToShowPart2); } private void initData() { itemList = new ArrayList<Map<String, Object>>(); Map<String, Object> item1 = new HashMap<String, Object>(); item1.put("title", "USB设备:sda"); item1.put("image", R.drawable.gallery_audio); itemList.add(item1); Map<String, Object> item2 = new HashMap<String, Object>(); item2.put("title", "USB设备:sdb"); item2.put("image", R.drawable.gallery_file); itemList.add(item2); Map<String, Object> item3 = new HashMap<String, Object>(); item3.put("title", "USB设备:sdc"); item3.put("image", R.drawable.gallery_image); itemList.add(item3); Map<String, Object> item4 = new HashMap<String, Object>(); item4.put("title", "USB设备:sdd"); item4.put("image", R.drawable.gallery_video); itemList.add(item4); setValue(); } private void setValue() { // 更新tvPrevious:title值 Map<String, Object> previousItem = currentPosition > 0 ? itemList.get(currentPosition - 1) : null; if (previousItem != null) tvPrevious.setText((CharSequence) previousItem.get("title")); else tvPrevious.setText(" "); tvPrevious.clearAnimation(); // 更新tvCurrent:title值和tvCurrent:image值 Map<String, Object> currentItem = itemList.get(currentPosition); tvCurrent.setText((CharSequence) currentItem.get("title")); tvCurrent.clearAnimation(); ivCurrent.setImageResource((Integer) currentItem.get("image")); ivCurrent.clearAnimation(); // 更新tvNext:title值 Map<String, Object> nextItem = currentPosition + 1 < itemList.size() ? itemList.get(currentPosition + 1) : null; if (nextItem != null) tvNext.setText((CharSequence) nextItem.get("title")); else tvNext.setText(" "); tvNext.clearAnimation(); } private void initViews() { tvPrevious = (TextView) findViewById(R.id.tv_previous); tvCurrent = (TextView) findViewById(R.id.tv_current); tvNext = (TextView) findViewById(R.id.tv_next); ivCurrent = (ImageView) findViewById(R.id.iv_current); ivSelect = (ImageView) findViewById(R.id.iv_select); } }
View.clearAnimation() 解决动画完毕一瞬间闪烁问题
animation.setStartOffset()使中间的图片切换动画的错落有致
animation.setFillAfter()使动画执行完毕时不还原到之前的位置
initData()中item想放几个都行
然后布局 activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/my_blue" > <RelativeLayout android:id="@+id/layout_image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:paddingBottom="@dimen/image_spacing" > <ImageView android:id="@+id/iv_select" android:layout_width="wrap_content" android:layout_height="@dimen/image_hight" android:layout_marginBottom="@dimen/image_spacing" android:layout_marginTop="@dimen/image_spacing" /> <ImageView android:id="@+id/iv_current" android:layout_width="wrap_content" android:layout_height="@dimen/image_hight" android:layout_marginBottom="@dimen/image_spacing" android:layout_marginTop="@dimen/image_spacing" /> </RelativeLayout> <TextView android:id="@+id/tv_current" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@id/layout_image" android:textColor="@color/white" android:textSize="26sp" /> <TextView android:id="@+id/tv_previous" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@id/tv_current" android:textColor="@color/fade_white" android:textSize="12sp" /> <TextView android:id="@+id/tv_next" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/layout_image" android:textColor="@color/fade_white" android:textSize="12sp" /> <Button android:id="@+id/btn_up" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:text="up" android:textColor="@color/white" /> <Button android:id="@+id/btn_down" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_toRightOf="@id/btn_up" android:text="down" android:textColor="@color/white" /> </RelativeLayout>
dimens.xml
<resources> <!-- Default screen margins, per the Android Design guidelines. --> <dimen name="image_spacing">30dp</dimen> <dimen name="image_hight">200dp</dimen> </resources>
colors.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="white">#FFFFFF</color> <color name="fade_white">#AAFFFFFF</color> <color name="my_blue">#15A0F5</color> </resources>
完成!
以上内容为本人 刚刚学android时候随便写的。 关于代码设置动画看起来很重复 很烦。
现在自己封了个工具类用,共享给大家
public class AnimUtils { public static final int default_duration = 800; private AnimationSet set; private AnimUtils() { } public static AnimUtils init() { AnimUtils animUtils = new AnimUtils(); animUtils.set = new AnimationSet(false); return animUtils; } public AnimUtils addAlpha(float fromAlpha, float toAlpha) { AlphaAnimation alpha = new AlphaAnimation(fromAlpha, toAlpha); alpha.setDuration(default_duration); set.addAnimation(alpha); return this; } public AnimUtils addAlpha(float fromAlpha, float toAlpha, long offset, long duration, Interpolator interpolator, int repeatMode) { AlphaAnimation alpha = new AlphaAnimation(fromAlpha, toAlpha); alpha.setDuration(duration); alpha.setStartOffset(offset); alpha.setInterpolator(interpolator); alpha.setRepeatMode(repeatMode); if (repeatMode == Animation.REVERSE) alpha.setRepeatCount(1); set.addAnimation(alpha); return this; } public AnimUtils addScale(float fromX, float toX, float fromY, float toY, float pivotX, float pivotY) { ScaleAnimation scale = new ScaleAnimation(fromX, toX, fromY, toY, Animation.RELATIVE_TO_SELF, pivotX, Animation.RELATIVE_TO_SELF, pivotY); scale.setDuration(default_duration); set.addAnimation(scale); return this; } public AnimUtils addScale(float fromX, float toX, float fromY, float toY, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue, long offset, long duration, Interpolator interpolator) { ScaleAnimation scale = new ScaleAnimation(fromX, toX, fromY, toY, pivotXType, pivotXValue, pivotYType, pivotYValue); scale.setDuration(duration); scale.setStartOffset(offset); scale.setInterpolator(interpolator); set.addAnimation(scale); return this; } public AnimUtils addTranslate(float fromXDelta, float toXdelta, float fromYdelta, float toYDelta) { TranslateAnimation translate = new TranslateAnimation(fromXDelta, toXdelta, fromYdelta, toYDelta); translate.setDuration(default_duration); set.addAnimation(translate); return this; } public AnimUtils addTranslate(float fromXDelta, float toXdelta, float fromYdelta, float toYDelta, long offset, long duration, Interpolator interpolator) { TranslateAnimation translate = new TranslateAnimation(fromXDelta, toXdelta, fromYdelta, toYDelta); translate.setDuration(duration); translate.setStartOffset(offset); translate.setInterpolator(interpolator); set.addAnimation(translate); return this; } public AnimUtils addTranslate(int fromXType, float fromXValue, int toXType, float toXValue, int fromYType, float fromYValue, int toYType, float toYValue, long offset, long duration, Interpolator interpolator) { TranslateAnimation translate = new TranslateAnimation(fromXType, fromXValue, toXType, toXValue, fromYType, fromYValue, toYType, toYValue); translate.setDuration(duration); translate.setStartOffset(offset); translate.setInterpolator(interpolator); set.addAnimation(translate); return this; } public AnimUtils addRotate(float fromDegrees, float toDegrees, float pivotX, float pivotY) { RotateAnimation rotate = new RotateAnimation(fromDegrees, toDegrees, Animation.RELATIVE_TO_SELF, pivotX, Animation.RELATIVE_TO_SELF, pivotY); rotate.setDuration(default_duration); set.addAnimation(rotate); return this; } public AnimUtils addRotate(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue, long offset, long duration, Interpolator interpolator) { RotateAnimation rotate = new RotateAnimation(fromDegrees, toDegrees, pivotXType, pivotXValue, pivotYType, pivotYValue); rotate.setDuration(duration); rotate.setStartOffset(offset); rotate.setInterpolator(interpolator); set.addAnimation(rotate); return this; } public AnimationSet create() { return set; } public static AnimationSet cearteAlpha(float fromAlpha,float toAlpha){ return AnimUtils.init().addAlpha(fromAlpha, toAlpha).create(); } }
链式写法 可以连续点的。 使用方法
AnimUtils.init().add *** .add *** .create(); 就可以了
然后调用 view.startAnimation(animation);
add 四种动画都有重载, 可以自己配置 。 比如
AnimUtils.init()
.addAlpha(1f, 0.2f, 200, 200,new LinearInterpolator(), Animation.REVERSE)
.create()
表示 0.2秒钟后 view 透明度用0.2秒时间从100%到20%紧接着再从20%变回100%
大家慢慢玩~