在安卓动画方面,网上的文章已经数不胜数,但是能感性认识动画,对很多入门的同学来说还是非常重要的;
这里我们常用到动画地方大概有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