现在的位置: 首页 > 综合 > 正文

android animation demo (2014-12-11 封装为工具类)

2018年05月21日 ⁄ 综合 ⁄ 共 13757字 ⁄ 字号 评论关闭


废话一句: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% 


大家慢慢玩~

抱歉!评论已关闭.