我们知道,很多软件有时候需要首先显示的就是welcome界面,比如UC浏览器,淘宝,今日头条等等,
一开软件,首先看到的就是欢迎界面,几秒钟之后才正式进入软件的主界面
我这里用今日头条看看怎么实现这个功能:
1.在layout里面创建一个welcome.xml资源文件,
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scaleType="fitXY"
android:src="@drawable/splash" />
</RelativeLayout>
这个布局上只放一个ImageView控件就可以,就是放一张图片,这个图片的地址是:在drawable文件夹下面的名称叫做splash的图片
注意:
1)这里我们首先就是需要熟悉drawable文件代表啥意思,这个文件就是放图片的,但是我们经常看到很多带有后缀的drawable文件,这是啥意思呢?如下图:
像上面的:-hdpi,-ldpi,-mdpi,-xhdpi 它们说的是一个分辨率的问题,其实系统在这里很智能的,它可以自动根据你的模拟器或者你的手机
分别到这几个文件夹里面去找对应的图片。
如果各个分辨率文件里面没有找到与之相匹配的图片的,那么系统就去drawable文件夹下面找。
** 要注意一点,drawable文件夹里面的图片命名是不能大写的
2)android:scaleType是控制图片如何resized/moved来匹对ImageView的size
在ImageView里面我们都是设置它的size为填充父窗体
FIT_XY / fitXY 把图片不按比例扩大/缩小到View的大小显示
2.创建好布局文件之后,我们需要去写activity类了,这个类名就叫做:Welcome.java
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
public class Welcome extends Activity {
private AlphaAnimation start_anima;
View view;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
view = View.inflate(this, R.layout.welcome, null);
setContentView(view);
initView();
initData();
}
private void initData() {
// TODO Auto-generated method stub
start_anima = new AlphaAnimation(0.3f, 1.0f);
start_anima.setDuration(2000);
view.startAnimation(start_anima);
start_anima.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationEnd(Animation animation) {
// TODO Auto-generated method stub
redirectTo();
}
});
}
protected void redirectTo() {
// TODO Auto-generated method stub
startActivity(new Intent(getApplicationContext(), Hello.class));
finish();
}
private void initView() {
// TODO Auto-generated method stub
}
}
1)定义一个AlphaAnimation 动画 对象,private AlphaAnimation start_anima;
窗口的动画效果,淡入淡出什么的,有些游戏的欢迎动画,logo的淡入淡出效果就使用AlphaAnimation
2)定义一个View对象 View view;
3)加载布局:
view = View.inflate(this, R.layout.welcome, null);//inflate 就是填充的意思,这个函数就是实例化view对象
setContentView(view);
//上面的两行代码可以写成一行:setContentView(R.layout.welcome);
4)初始化视图,初始化动画
initView();
initData();
5)初始化动画的处理
首先看这三行代码:
start_anima = new AlphaAnimation(0.3f, 1.0f);
// new出来一个AlphaAnimation类,实例化start_anima对象,在我们的成员变量声明的时候最好不要立马就new出来,只有用到的时候
// 才去new,这将可以节省内存的开销。
start_anima.setDuration(2000);// 设置动画的时间,android工程里面好像所有的控件时间设置都是Duration属性,单位是毫秒
view.startAnimation(start_anima);// 把这个动画类放到view视图上面
接下来就是动画对象start_anima对象的监听事件了:
start_anima.setAnimationListener(new AnimationListener() {
// 有时候我们不知道我们想要的监听事件件什么名字,可以打出start_anima,然后按快捷键alt+/,就会出来很多,这个时候我们去找
// 相应的静态方法,如果我们不知道这个方法是怎么用的,我们可以去说明文档里面 查看他们的用法
// 这里面监听事件里面是用内部类实现的,实现重载函数
// 其实下面的三个重载函数,就是这个AnimationListener的生命周期,start repeat end,我们需要做的就是在end的时候跳到第二个
// activity界面去,所有我们这里就只需要在onAnimationEnd(Animation animation)增加代码即可
// 要想进一步弄清楚这三个生命周期的具体情况,我们可以在各个函数里面加个System.out.println();然后从logcat里面可以看到他们
// 运行的顺序,这里我不去展示了
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationEnd(Animation animation) {
// TODO Auto-generated method stub
redirectTo();// 2秒之后跳转到主界面
}
});
6)跳转函数的处理
protected void redirectTo() {
// TODO Auto-generated method stub
// 在这个函数里面,我们调用 意图 去实现activity之间的通信
// Intent(getApplicationContext(), Hello.class),它的构造方法一个参数是上下文,一个是哪个activity类,这里上下文最好不要写this
startActivity(new Intent(getApplicationContext(), Hello.class));
finish();//介绍当前的activity
}
注意:// finish是Activity的类,仅仅针对Activity,当调用finish()时,只是将活动推向后台,并没有立即释放内存,
活动的资源并没有被清理;当调用System.exit(0)时,杀死了整个进程,这时候活动所占的资源也会被释放
private void initView() {
// TODO Auto-generated method stub
// 这个函数不需要做任何的处理
}
至此,activity就写好了,那么接下来就是清单文件的处理了:
3.配置清单文件
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".Welcome"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.wust.three.Hello" >
</activity>
</application>
1)我们加了两个activity节点,一个welcome的activity,一个hello的activity,其中welcome的activity加了<intent-filter>子节点,它表示的意思就是:在手机上生成一个图标
而hello的节点的activity是不需要这个<intent-filter>子节点的属性的。
经过上面的三个步骤,整个需求也就写完了,欢迎界面成功搞定:把整个项目clean一把,然后run as 测试结果:
2秒之后跳转:
跳转的主界面我还没有处理,目前就输出一个hello作为演示而用。
这里面还需要去关注两个个知识点:
1)就是动画类
android中提供了4中动画:
AlphaAnimation 透明度动画效果
ScaleAnimation 缩放动画效果
TranslateAnimation 位移动画效果
RotateAnimation 旋转动画效果
大家有时间可以去看看他们的用法!
2)finish()和exit()两种结束方法
要想弄清楚他们,我觉得最好放在生命周期里面是查看效果是最好的,
下次有机会去实现下他们,搞懂这里面的机制。
如有问题,请指出,感激不尽!!!