最直观的讲一下安卓动画在四个最常用的地方的使用

 在安卓动画方面,网上的文章已经数不胜数,但是能感性认识动画,对很多入门的同学来说还是非常重要的;

 这里我们常用到动画地方大概有4个地方

1 dialog的显示和隐藏;

2 Activity之间的切换;

3 某个控件的显示和隐藏;

4 PopupWindow的显示和隐藏;


Dialog中的应用


上面的动画是一个很简单的dialog实现的。

public class MainDlg extends Dialog {

	private static int theme = R.style.ThemeDialog;

	public MainDlg(Context context) {
		super(context, theme);
		setContentView(R.layout.dialog_main);
		getWindow().setLayout(300, LayoutParams.MATCH_PARENT);
		getWindow().setGravity(Gravity.LEFT);
		getWindow().setWindowAnimations(R.style.AnimDlalog);
		setCanceledOnTouchOutside(true);
		findViewById(R.id.button).setOnClickListener(
				new View.OnClickListener() {
					@Override
					public void onClick(View v) {
						dismiss();
					}
				});
	}
}

其中使用到了ThemeDialog和动画AnimDialo为res/values/styles.xml

    <style name="ThemeDialog" parent="@android:style/Theme.Dialog">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowIsTranslucent">false</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:backgroundDimEnabled">true</item>
    </style>

    <style name="AnimDlalog">
        <item name="android:windowEnterAnimation">@anim/in_from_left</item>
        <item name="android:windowExitAnimation">@anim/out_to_left</item>
    </style>
增加了两个风格;

那么实现的动画左边进入以及左边退出是在res/anim/下:

in_from_left.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fromXDelta="-90%p"
    android:fromYDelta="0"
    android:toXDelta="0"
    android:toYDelta="0" />

out_to_left.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fromXDelta="0"
    android:fromYDelta="0"
    android:toXDelta="-100%p"
    android:toYDelta="0" />

这里用到的是平移动画;至于第一个动画为什么使用了-90%p值呢,因为-90%p响应更加快速的弹出而没有延迟;

下面来看一下缩放的动画情况,也是用Dialog的出来实现;


上面的缩放动画中同时集合了透明补间动画。

<style name="AnimDlalog">
<item name="android:windowEnterAnimation">@anim/in_set_scale_alpha</item>
<item name="android:windowExitAnimation">@anim/out_set_scale_alpha</item>
</style>

分别是:

in_set_scale_alpha.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <scale
        android:duration="2000"
        android:fillAfter="false"
        android:fromXScale="0.0"
        android:fromYScale="0.0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="1.0"
        android:toYScale="1.0" />

    <alpha
        android:duration="2000"
        android:fromAlpha="0.0"
        android:toAlpha="1.0" />

</set>

out_set_scale_alpha.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <scale
        android:duration="2000"
        android:fillAfter="false"
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="0.0"
        android:toYScale="0.0" />

    <alpha
        android:duration="2000"
        android:fromAlpha="1.0"
        android:toAlpha="0.0" />

</set>

这两种。那么如果把显示动画和消失动画其中的属性

android:pivotX="50%"
android:pivotY="50%"

改成

android:pivotX="0%"
android:pivotY="0%"

将会是从左上角开始慢慢扩大;


也可以为set集合动画中的缩放动画进行延时就能达到先播放透明到显示,再播放缩放效果;

延时属性:android:startOffset="2000"

那么这里的set标签也可以只包含一个动画。但是通常只有一个类型动画的话,只需要同上面的in_from_left.xml和out_to_left.xml包含一个标签即可;


Activity之间切换

下面来看一下Activity之间切换使用动画的情况;


那么这个是怎么实现的呢:

从FromActivity到ToActivity之间的切换:

public class FromActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity);
		((Button)findViewById(R.id.button)).setText("FromActivity");
		findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				startActivity(new Intent(FromActivity.this,ToActivity.class));
				overridePendingTransition(R.anim.in_from_right, R.anim.out_to_left);
			}
		});
	}
	
}

以及ToActivity.java

public class ToActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity);
		((Button)findViewById(R.id.button)).setText("ToActivity");
		findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				finish();
				overridePendingTransition(R.anim.in_from_bottom, R.anim.out_to_right);
			}
		});
	}
}

在Activity中使用切换动画,不需要使用了style 了,使用Activity类提供的切换动画接口即可

overridePendingTransition(int enterAnim, int exitAnim);

那么看一下这两个动画的代码:

in_from_right.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="500"
    android:fromXDelta="100%p"
    android:fromYDelta="0"
    android:toXDelta="0"
    android:toYDelta="0" />


  
  out_to_left.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fromXDelta="0"
    android:fromYDelta="0"
    android:toXDelta="-100%p"
    android:toYDelta="0" />




in_from_bottom.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fromXDelta="0"
    android:fromYDelta="10%p"
    android:toXDelta="0"
    android:toYDelta="0" />



out_to_right.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fromXDelta="0"
    android:fromYDelta="0"
    android:toXDelta="100%p"
    android:toYDelta="0" />


控件上使用动画

很多时候控件上使用动画也是非常常见的:


看到了吗,就是下面这个小android在动,其实它是一个ImageView来的,那么动画是怎么实现的呢;

in_from_bottom.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fromXDelta="0"
    android:fromYDelta="10%p"
    android:toXDelta="0"
    android:toYDelta="0" />


out_to_bottom.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fromXDelta="0"
    android:fromYDelta="0"
    android:toXDelta="0"
    android:toYDelta="10%p" />


public class MainActivity extends Activity {

	Context context;
	Button button2;
	MainDlg dlg;
	ImageView imageView1;
	private Animation animationIn;
	private Animation animationOut;
	boolean isanim = false;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		context = this;
		dlg = new MainDlg(context);
		button2 = (Button) findViewById(R.id.button2);
		imageView1 = (ImageView) findViewById(R.id.imageView1);
		imageView1.setVisibility(View.GONE);
		animationIn = AnimationUtils
				.loadAnimation(context, R.anim.in_from_bottom);
		animationOut = AnimationUtils.loadAnimation(context,
				R.anim.out_to_bottom);
		
		button2.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				if (isanim) {
					imageView1.clearAnimation();
					imageView1.startAnimation(animationOut);
					isanim = false;
				} else {
					imageView1.clearAnimation();
					imageView1.startAnimation(animationIn);
					imageView1.setVisibility(View.VISIBLE);
					isanim = true;
				}

			}
		});

		animationOut.setAnimationListener(new Animation.AnimationListener() {

			@Override
			public void onAnimationStart(Animation animation) {
			}

			@Override
			public void onAnimationRepeat(Animation animation) {
			}

			@Override
			public void onAnimationEnd(Animation animation) {
				imageView1.setVisibility(View.GONE);
			}
		});
	}
}

这里需要讲一下的是,当动画移动之后,View仍然是可以被点击的,所以为了按键不被点击到,在动画消失后(onAnimationEnd监听到)让View的属性设置gone,所以在显示的时候重新设为可见;


弹窗中使用

下面顺便提一下在PopupWindow中的动画使用,类似Dialog,也是需要定义一个style的;

 popupWindow.setAnimationStyle(R.style.AnimDlalog);


到此阶段性总结了我们最常用动画的地方;

CSDN原创,转载注明出处:http://blog.csdn.net/dreamintheworld/article/details/41291447




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值