我学习Android都是结合源代码去学习,这样比较直观,非常清楚的看清效果,觉得很好,今天的学习源码是网上找的源码 百度搜就知道很多下载的地方 网上源码的名字叫:activity切换特效.zip我的博客写的比较乱,如果本篇文章没有看懂,
请先看上篇文章,地址:http://blog.csdn.net/u014737138/article/details/40861929
上篇文章我们学习了animation动画的四种情况,接下来就用这些情况实现一个activity切换的特效
先看小效果,然后在讲原理是怎么实现的:
一。这个应用程序中使用了一种下拉列表控件Spinner
选择样式输入框Spinner,用户不需要手动输入,而是选择 这节里面先不讲这个控件的知识点,关于这点请看我的下篇文章
1.在XML布局文件中定义这个控件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/bg"
android:orientation="vertical"
android:paddingTop="10dp" >
<Spinner
android:id="@+id/animation_sp"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#FF1493" >
</Spinner>
<Button
android:id="@+id/other_button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/open" >
</Button>
</LinearLayout>
2.需要预定订好各种动画效果,采用XML的方式
这里提供一个XML文件的code,具体的请看我上篇文章的讲解:
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator">
<alpha android:fromAlpha="0.0" android:toAlpha="1.0"
android:duration="2000" />
<scale android:fromXScale="0.5" android:toXScale="1.5"
android:fromYScale="0.5" android:toYScale="1.5" android:pivotX="50%"
android:pivotY="50%" android:duration="2000" />
<scale android:fromXScale="1.5" android:toXScale="1.0"
android:fromYScale="1.5" android:toYScale="1.0" android:pivotX="50%"
android:pivotY="50%" android:startOffset="200" android:duration="2000" />
</set>
3.下来列表中的数据需要存在在xml文件中 arrays.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="anim_type">
<item>淡入淡出效果</item>
<item>放大淡出效果</item>
<item>转动淡出效果1</item>
<item>转动淡出效果2</item>
<item>左上角展开淡出效果</item>
<item>压缩变小淡出效果</item>
<item>右往左推出效果</item>
<item>下往上推出效果</item>
<item>左右交错效果</item>
<item>放大淡出效果</item>
<item>缩小效果</item>
<item>上下交错效果</item>
</string-array>
</resources>
资源文件准备好之后接下来就是做代码的处理了;
二。activity的实现
1.找到下拉框控件和按钮控件
final Spinner mAnimSp = (Spinner) findViewById(R.id.animation_sp);
Button mButton=(Button) findViewById(R.id.other_button);
2.给下拉框控件填充内容:
// 通过资源文件获取Spinner填充内容
String[] ls = getResources().getStringArray(R.array.anim_type);
List<String> list = new ArrayList<String>();
// 把数组内容填充 到集合
for (int i = 0; i < ls.length; i++) {
list.add(ls[i]);
}
3.填充内容具体实现是需要一个ArrayAdapter适配器的
ArrayAdapter<String> animType = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, list);
这行代码的作用就是将list中的数据放在适配器上,接下来就是把这个适配器绑定在下拉列表控件Spinner上就好了
关于ArrayAdapter适配器将在下一篇文章中介绍,这里先忽略。
关于参数android.R.layout.simple_spinner_item表示是下拉列表的UI样式,这个属性值代表没有展开,就是一种文本的样式,android.R.layout.simple_spinner_dropdown_item属性代表是一种圆形的样式
与这样的形式对比下:
这两个参数的意思就讲明白了
4.绑定适配器:
mAnimSp.setAdapter(animType);
5.设置默认的显示:
mAnimSp.setSelection(0);
这样一来,初始化的工作基本完成了,接下来就是需要完成
当选中一个列表item的时候,该响应的事件了,这里我们是用一个按钮来处理这个响应事件
三。按钮的响应事件
mButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(MaiActivity.this, OtherActivity.class);
startActivity(intent);
switch (mAnimSp.getSelectedItemPosition()) {
case 0:
/*注意:此方法只能在startActivity和finish方法之后调用。
第一个参数为第一个Activity离开时的动画,第二参数为所进入的Activity的动画效果*/
overridePendingTransition(R.anim.fade, R.anim.hold);
break;
case 1:
overridePendingTransition(R.anim.my_scale_action,
R.anim.my_alpha_action);
break;
case 2:
overridePendingTransition(R.anim.scale_rotate,
R.anim.my_alpha_action);
break;
case 3:
overridePendingTransition(R.anim.scale_translate_rotate,
R.anim.my_alpha_action);
break;
case 4:
overridePendingTransition(R.anim.scale_translate,
R.anim.my_alpha_action);
break;
case 5:
overridePendingTransition(R.anim.hyperspace_in,
R.anim.hyperspace_out);
break;
case 6:
overridePendingTransition(R.anim.push_left_in,
R.anim.push_left_out);
break;
case 7:
overridePendingTransition(R.anim.push_up_in,
R.anim.push_up_out);
break;
case 8:
overridePendingTransition(R.anim.slide_left,
R.anim.slide_right);
break;
case 9:
overridePendingTransition(R.anim.wave_scale,
R.anim.my_alpha_action);
break;
case 10:
overridePendingTransition(R.anim.zoom_enter,
R.anim.zoom_exit);
break;
case 11:
overridePendingTransition(R.anim.slide_up_in,
R.anim.slide_down_out);
break;
}
}
});
处理方式是调用OnClickListener()接口的回调函数:
1.使用意图来控制activity直接的跳转:
Intent intent = new Intent();
intent.setClass(MaiActivity.this, OtherActivity.class);
startActivity(intent);
2.接下来就是处理下拉列表中的item被选中要处理的效果:
switch (mAnimSp.getSelectedItemPosition()) {
case 0:
/*注意:此方法只能在startActivity和finish方法之后调用。
第一个参数为第一个Activity离开时的动画,第二参数为所进入的Activity的动画效果*/
overridePendingTransition(R.anim.fade, R.anim.hold);
break;
case 1:
overridePendingTransition(R.anim.my_scale_action,
R.anim.my_alpha_action);
break;
解释中说的很清楚,这里的代码只能在startActivity()和finish()做完之后,系统才会处理被选择中了那个值
也就是说这里的执行顺序是严格规定的,
1)找出选中了那个item
mAnimSp.getSelectedItemPosition()
2)根据这个item做响应处理,这里主要就是activity切换的效果:
overridePendingTransition(R.anim.fade, R.anim.hold);
参数解释:
第一个参数为第一个Activity离开时的动画,第二参数为所进入的Activity的动画效果 跳转到另外一个activity类中,当返回键被触发的时候:又设定一种退出的效果
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
//如果按下的是返回键,并且没有重复
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
finish();
overridePendingTransition(R.anim.slide_up_in, R.anim.slide_down_out);
return false;
}
return false;
}
至此这个代码就说完了,接下来看看效果:左上角展开淡出效果