现在的手机应用基本上都有一个欢迎页面,一个好的欢迎页面往往能赢得客户的青睐,那么如何添加这个欢迎页面呢?
手机的欢迎页面一般有两种形式:一种是:ViewPager类型的滑屏效果,通过展示几张精心设计好的图片来展示手机的功能,另一种是单张图片的动画演示,如微信的欢迎页面。
这两种欢迎页面都是可以轻松实现的,下面我用代码实现微信效果的那种单张图片的动画效果。
-
给应用写个欢迎页的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="match_parent"
android:background="#fff"
android:orientation="vertical" >
<ImageView
android:id="@+id/imageView_welcome"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/welcome" />
</LinearLayout>
-
需要写个Activity来加载这个欢迎页面
public class WelcomeActivity extends Activity implements AnimationListener {
private ImageView imageView = null;
private Animation alphaAnimation = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.welcome);
imageView = (ImageView)findViewById(R.id.imageView_welcome);
alphaAnimation = AnimationUtils.loadAnimation(this, R.anim.welcome_alpha);
alphaAnimation.setFillEnabled(true); //启动Fill保持
alphaAnimation.setFillAfter(true); //设置动画的最后一帧是保持在View上面
imageView.setAnimation(alphaAnimation);
alphaAnimation.setAnimationListener(this); //为动画设置监听
}
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationEnd(Animation animation) {
//动画结束时结束欢迎界面并转到软件的主界面
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
this.finish();
}
@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
//在欢迎界面屏蔽BACK键,在退出的时候就不会返回这个欢迎页
if(keyCode==KeyEvent.KEYCODE_BACK) {
return false;
}
return false;
}
}
-
给欢迎页添加动画,动画的种类有很多种,自己可以随意设计。注意:添加动画时需要在res目录下新建文件夹:anim,动画的文件放在这里面。
<?xml version="1.0" encoding="utf-8"?>
<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="500"
/>
<alpha
android:fromAlpha="1.0"
android:toAlpha="0.2"
android:startOffset="1000"
android:duration="300"
/>
</set>
========================== Android图形图像与动画之AnimationListener简介
就像Button控件有监听器一样,动画效果也有监听器,只需要实现AnimationListener就可以实现对动画效果的监听,其中需要重载三个函数,就是下面的这几个函数:
private
class
MyListenr
implements
AnimationListener{
@Override
|
public void onAnimationEnd(Animation arg0) {
|
// TODO Auto-generated method stub
|
}
|
@Override
|
public void onAnimationRepeat(Animation arg0) {
|
// TODO Auto-generated method stub
|
}
|
@Override
|
public void onAnimationStart(Animation arg0) {
|
// TODO Auto-generated method stub
|
}
|
|
}
其中第一个函数的意思是在动画执行完之后需要开发者做什么,第二个函数的意思是在动画重复执行的过程中应该做什么,第三个函数的意思是当动画开始执行时有什么动作发生。
=========== Android数据存取 getSharedPreferences
getSharedPreferences(String name, int mode)
得到名为‘name’的偏好文件。同时你可以更改和返回他的值。任何调用者在调用同样名字的偏好文件时只有一个实例返回,这就意味着这些调用者都可以看到其他调用者做出的更改。
name为本组件的配置文件名( 自己定义,也就是一个文件名),当这个文件不存在时,直接创建,如果已经存在,则直接使用,
mode为操作模式,默认的模式为0或MODE_PRIVATE,还可以使用MODE_WORLD_READABLE和MODE_WORLD_WRITEABLEmode指定为MODE_PRIVATE,则该配置文件只能被自己的应用程序访问。mode指定为MODE_WORLD_READABLE,则该配置文件除了自己访问外还可以被其它应该程序读取。mode指定为MODE_WORLD_WRITEABLE,则该配置文件除了自己访问外还可以被其它应该程序读取和写入
SharedPreferences是一个轻量级的存储类,特别适合用于保存软件配置参数。使用SharedPreferences保存数据,其背后是用xml文件存放数据,文件存放在/data/data/<package name>/shared_prefs目录下:
================ 实例
WelcomeActivity.java
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.WindowManager;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.AnimationSet;
import android.widget.FrameLayout;
import android.widget.ImageView;
public class WelcomeActivity extends Activity implements AnimationListener {
private SharedPreferences mConfig;
private String mFirst = "isfirst";
private FrameLayout mFrameLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_welcome);
mFrameLayout = (FrameLayout)findViewById(R.id.welcome_frame);
mConfig = this.getSharedPreferences(Util.CONFIG_FILE, MODE_PRIVATE);
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
if (mConfig.contains(mFirst)) {
if (mConfig.getBoolean(mFirst, false)) {
startIntroduce();
} else {
startWelcome();
}
}else{
startIntroduce();//进入图片动画简介
}
setIsFirst(false);
}
private void startWelcome(){
AnimationSet animationset = new AnimationSet(true);
AlphaAnimation alphaAnimation = new AlphaAnimation(1, 1);
alphaAnimation.setDuration(Util.SPLASH_DISPLAY_LENGHT);
animationset.addAnimation(alphaAnimation);
animationset.setAnimationListener(this);
mFrameLayout.startAnimation(animationset);
}
@Override
public void onAnimationEnd(Animation animation) {
// TODO Auto-generated method stub
mFrameLayout.setVisibility(View.INVISIBLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN, WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
startMain();
}
private void setIsFirst(boolean isFirst){
Editor edit = mConfig.edit();
edit.putBoolean(mFirst, isFirst);
edit.commit();
}
private void startMain() {
Intent mainIntent = new Intent(WelcomeActivity.this,
CpsMediaMainActivity.class);
startActivity(mainIntent);
finish();
overridePendingTransition(R.anim.news_dync_in_from_left,R.anim.news_dync_out_to_right);
}
private void startIntroduce() {
Intent mainIntent = new Intent(WelcomeActivity.this,
IntroduceActivity.class);
startActivity(mainIntent);
finish();
// overridePendingTransition(R.anim.news_dync_in_from_left,R.anim.news_dync_out_to_right);
}
@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onBackPressed() {
}
}
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/welcome_frame"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/welcome_a"
android:orientation="vertical" >
</FrameLayout>
IntroduceActivity.java
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
public class IntroduceActivity extends Activity implements OnPageChangeListener,OnClickListener {
private ViewPager mViewPager;
private ImageView mPageA;
private ImageView mPageB;
private ImageView mPageC;
private ImageView mPageD;
private List<View> mViewList;
private MyAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_introduce);
mViewPager = (ViewPager) findViewById(R.id.introduce_viewpager);
mPageA = (ImageView) findViewById(R.id.page_a);
mPageB = (ImageView) findViewById(R.id.page_b);
mPageC = (ImageView) findViewById(R.id.page_c);
mPageD = (ImageView) findViewById(R.id.page_d);
mViewPager.setOnPageChangeListener(this);
LayoutInflater li = LayoutInflater.from(this);
View viewA = li.inflate(R.layout.layout_introduce_a, null);
View viewB = li.inflate(R.layout.layout_introduce_b, null);
View viewC = li.inflate(R.layout.layout_introduce_c, null);
View viewD = li.inflate(R.layout.layout_introduce_d, null);
viewD.setOnClickListener(this);
mViewList = new ArrayList<View>();
mViewList.add(viewA);
mViewList.add(viewB);
mViewList.add(viewC);
mViewList.add(viewD);
mAdapter = new MyAdapter();
mViewPager.setAdapter(mAdapter);
}
class MyAdapter extends PagerAdapter{
@Override
public int getCount() {
// TODO Auto-generated method stub
return mViewList.size();
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
// TODO Auto-generated method stub
return arg0 == arg1;
}
@Override
public void destroyItem(View container, int position, Object object) {
((ViewPager)container).removeView(mViewList.get(position));
}
@Override
public Object instantiateItem(View container, int position) {
((ViewPager)container).addView(mViewList.get(position));
return mViewList.get(position);
}
}
@Override
public void onPageScrollStateChanged(int page) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrolled(int page, float arg1, int arg2) {
// TODO Auto-generated method stub
}
@Override
public void onPageSelected(int page) {
switch (page) {
case 0:
mPageA.setImageResource(R.drawable.page_now);
mPageB.setImageResource(R.drawable.page);
break;
case 1:
mPageA.setImageResource(R.drawable.page);
mPageB.setImageResource(R.drawable.page_now);
mPageC.setImageResource(R.drawable.page);
break;
case 2:
mPageB.setImageResource(R.drawable.page);
mPageC.setImageResource(R.drawable.page_now);
mPageD.setImageResource(R.drawable.page);
break;
case 3:
mPageC.setImageResource(R.drawable.page);
mPageD.setImageResource(R.drawable.page_now);
break;
default:
break;
}
}
@Override
public void onClick(View v) {
Intent mainIntent = new Intent(IntroduceActivity.this,
CpsMediaMainActivity.class);
startActivity(mainIntent);
finish();
}
}
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<android.support.v4.view.ViewPager
android:id="@+id/introduce_viewpager"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" >
</android.support.v4.view.ViewPager>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout_marginBottom="30dp"
android:gravity="center_horizontal" >
<ImageView
android:id="@+id/page_a"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="matrix"
android:src="@drawable/page_now" />
<ImageView
android:id="@+id/page_b"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:scaleType="matrix"
android:src="@drawable/page" />
<ImageView
android:id="@+id/page_c"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:scaleType="matrix"
android:src="@drawable/page" />
<ImageView
android:id="@+id/page_d"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:scaleType="matrix"
android:src="@drawable/page" />
</LinearLayout>
</FrameLayout>
相关推荐
- 当用户完成所有欢迎页面的浏览后,需要过渡到应用的主界面。可以监听`ViewPager`的滑动事件,当最后一个页面被浏览时启动主界面的`Activity`。 - 另一种常见做法是使用定时器,让欢迎界面在一段时间后自动跳转,...
本项目以"仿QQ登录,欢迎界面,注册添加信息,注册成功可登陆"为主题,旨在帮助开发者掌握用户认证系统的基本构建过程,同时提升用户体验设计能力。QQ作为中国最流行的即时通讯软件之一,其登录和注册功能具有高度的...
1. **顶部欢迎信息**:`<view class="top-box">` 包含了“Hi”和“欢迎使用!”的文本,用于向用户展示友好的问候。 2. **导航栏**:`<view class="nav">` 里有两个可点击的视图 `和 `<view class="right">`,分别...
它的应用程序框架允许开发者使用Java或Kotlin等编程语言进行开发,同时提供了丰富的API和库,以支持各种功能,如图形界面、网络通信、多媒体处理等。 Android应用的基础是Activity,它是用户与应用交互的入口点。...
- 在Splash Screen结束后,根据应用需求,自动跳转到主界面或其他登录界面。 - 使用`Intent`进行Activity之间的跳转,例如`startActivityForResult`或`startActivity`。 6. **初始化工作** - Splash Screen期间...
装饰网站手机站 功能模块 系统管理:基本信息设置,数据库备份,管理员管理 ...4.可根据需要生成APP手机应用,兼容安卓和苹果系统。 后台路径 : http://网址/admin/login.asp 账户 : admin 密码 : admin@888
用户可以通过添加皮肤或者重新设计整个界面的外观来定制他的手机。生产商也可以定制界面并且生产出面向不同用户的手机,运营商同样可以方便地实现界面个性化。 第二,内容更新简单。例如,从手机的根菜单中弹出新闻...
【标题】"手机安全卫士02——splash界面"涉及的是Android应用开发中启动界面(Splash Screen)的设计与实现。启动界面通常是一个应用程序在主功能界面加载前展示的简单画面,用于加载应用资源、初始化设置或者展示...
猎豹清理大师是一款广受欢迎的手机优化工具,它能够帮助用户清理手机中的垃圾文件、释放内存、管理应用等,以提高手机的运行速度和性能。在日常使用中,有时我们希望某些重要的应用程序不被清理或优化,这时就需要将...
应用分身,也称为多账号管理或双开功能,是现代智能手机上常见的一种特性,尤其受到商务用户和社交爱好者们的欢迎。它允许用户在同一设备上同时运行同一应用的两个或更多实例,从而实现不同账号的同时在线。在本...
layui是一款在中国广受欢迎的前端UI框架,以其简洁、优雅的样式和强大的功能深受开发者喜爱。在本项目中,“layui-用户登录界面响应式动画模板”是利用layui的组件和样式,构建了一个适应不同设备分辨率的登录界面,...
6. **最新排行展示**:系统会根据销售数据实时更新手机的销售排行榜,以直观展示哪些型号的手机最受欢迎。这需要实时查询数据库并进行排序,可能涉及到数据库查询优化和缓存策略。 7. **用户界面与交互**:良好的...
尤其是在使用3GP格式视频的早期智能手机时代,这个问题更为明显。3GP格式视频因体积小和兼容性良好而广泛流行,但随着技术的发展和新型手机的出现,这种格式开始面临支持度下降的问题。为了迎合这种需求变化,3gp...
9. **ARIA属性**:对于无障碍访问(Accessibility),可以通过ARIA属性来帮助屏幕阅读器理解页面上的元素功能,确保所有用户都能顺利使用登录页面。 10. **响应式图片**:使用`srcset`和`sizes`属性可以实现图片的...
LCalendar作为一款轻量级的时间选择工具,其易用性和可扩展性使得它在移动端应用开发中颇受欢迎。此次新增的回调函数特性进一步增强了其灵活性,开发者可以利用这个功能来实现更加复杂的应用场景,例如集成到表单...
手机信息管理系统是一款专门用于管理和维护手机相关数据的应用程序,它旨在提供一个高效、便捷的平台,帮助用户轻松处理与手机品牌、型号、功能等相关的信息。系统涵盖了从数据录入到数据分析的全过程,支持对手机...
《使用Delphi开发手机管理应用详解》 在IT领域,Delphi是一款强大的Windows应用程序开发工具,以其高效的编译器和直观的集成开发环境(IDE)而受到开发者喜爱。本项目名为“手机管理delphi源码”,它允许用户通过...
设计师可以利用这些元素创建欢迎页面的大海报或设计成界面按钮,增强用户在使用APP时的节日体验。 2. **色彩的应用**:红色是春节的代表色,象征着喜庆和热闹。在设计中,主要使用红色作为主色调,搭配黄色、青色等...
总的来说,“手机号码测吉凶”项目是一个结合了C#编程技术、数字命理学和用户界面设计的实例,展示了如何用编程语言来实现一种文化习俗或趣味性的应用。尽管其科学依据有限,但作为开发者,理解和实现这类程序有助于...
欢迎界面通常是应用程序首次启动时展示的短暂页面,它的主要目的是加载应用的核心资源和设置,同时给用户留下良好的第一印象。设计时应保持简洁,避免过多的动画和信息,以免延长加载时间。可以使用相对布局...