Android ViewPager 打造炫酷欢迎页

ViewPager是Android扩展v4包中的类,这个类可以让用户切换当前的View。对于这个类的应用场景,稍加修改就可以应用到多个环境下。比如:App的欢迎页,App导航页设计,app的侧滑退出和app的侧边栏应用界面设计等都可以用ViewPager实现。

   

1. 关于欢迎页的导航设计

  • 设计思想:欢迎页的导航包括几个app说明(欢迎页),页面的下方有导航点,显示当前所在的页面数,自动跳转下一页,最后一页有进入的 登陆\注册 的按钮。或者有提示进入的按钮。或者有直接的登陆或者注册的输入框。输入完成后进入主界面。

  • 代码设计:创建包容欢迎页面的视图集合,包含指示当前第几页的“点”的集合,包含最后一页的跳转设计,包含用户当前不操作的自动跳转,包含用户销毁当前应用第二次进入的跳过欢迎页等设计。

2. 欢迎页的引导页设计

  • 1.引导类:

//建立Guide类继承自 AppCompatActivity,实现OnPageChangeListener 并实现OnPageChangeListener的onPageScrolled,onPageSelected,onPageScrollStateChanged类。

public class Guide extends AppCompatActivity implements ViewPager.OnPageChangeListener {
private ViewPager vp;
private ViewPagerAdapter vpAdapter; //创建ViewPager适配器
private List<View> views; //创建视图集合
private ImageView[] dots; //创建指示点集合 private int[] ids = {R.id.iv_bit1, R.id.iv_bit2, R.id.iv_bit3, R.id.iv_bit4}; //初始化指示点集合
private Button btn_start; //初始末页跳转按钮 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE); //欢迎页无标题设置
setContentView(R.layout.guide_layout);
initViews();
initDots();
} private void initViews() {
LayoutInflater inflater = LayoutInflater.from(this);
views = new ArrayList<View>();
views.add(inflater.inflate(R.layout.one, null));
views.add(inflater.inflate(R.layout.two, null));
views.add(inflater.inflate(R.layout.three, null));
views.add(inflater.inflate(R.layout.four, null)); vpAdapter = new ViewPagerAdapter(views, this);
vp = (ViewPager) findViewById(R.id.viewPager);
vp.setAdapter(vpAdapter);
//适配器适配页面 btn_start = (Button) views.get(3).findViewById(R.id.btn_start);
//到第四页点击按钮跳转 btn_start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(Guide.this,MainActivity.class);
//跳转到主Activity
startActivity(intent);
finish(); //销毁没有用的内存占用
}
}); vp.setOnPageChangeListener(this); } private void initDots() {
dots = new ImageView[views.size()];
for (int i = 0; i < views.size(); i++) {
dots[i] = (ImageView) findViewById(ids[i]);
//根据当前页面的views.size()来变化指示图标
}
} @Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } //指示点的变化函数
@Override
public void onPageSelected(int position) {
for (int i = 0; i < ids.length; i++) {
if (position == i) {
dots[i].setImageResource(R.drawable.login_point_selected);
} else {
dots[i].setImageResource(R.drawable.login_point);
} } } @Override
public void onPageScrollStateChanged(int state) { }
}
  • 2.引导视图:

位于页面最下方的四个点:第一个是默认被选中的点。

<?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"> <android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#00333333"
>
</android.support.v4.view.ViewPager> <LinearLayout
android:id="@+id/ll"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:orientation="horizontal"
android:gravity="center_horizontal" >
<ImageView
android:id="@+id/iv_bit1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/login_point_selected"
/>
<ImageView
android:id="@+id/iv_bit2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/login_point"
/>
<ImageView
android:id="@+id/iv_bit3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/login_point"
/>
<ImageView
android:id="@+id/iv_bit4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/login_point"
/>
</LinearLayout>
</RelativeLayout>
  • 3.打造视图适配器:

//建立ViewPagerAdapter继承自 PagerAdapter,并实现其destroyItem,instantiateItem,getCount,isViewFromObject方法。构造ViewPagerAdapter的内部类,创建View的数组类和联系上下文的Context。

public class ViewPagerAdapter extends PagerAdapter {

private List<View> views;
private Context context; public ViewPagerAdapter(List<View> views,Context context){
this.views = views;
this.context = context;
} @Override
public void destroyItem(View container, int position, Object object) {
((ViewPager)container).removeView(views.get(position));
} @Override
public Object instantiateItem(View container, int position) {
((ViewPager)container).addView(views.get(position));
return views.get(position);
} @Override
public int getCount() {
return views.size();
} @Override
public boolean isViewFromObject(View view, Object object) { return (view == object);
}
}
  • 4.分别实现四个欢迎视图:

第一个欢迎界面:

<?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:orientation="vertical">
<ImageView
android:id="@+id/iv_one"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/guide_one"
/>
</LinearLayout>

第四(末)个欢迎界面:

<?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:id="@+id/iv_four"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/guide_four"
/>
<LinearLayout
android:id="@+id/btn_welcome"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:gravity="center_horizontal"
android:orientation="horizontal"
>
<Button
android:id="@+id/btn_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="welcome"
/>
</LinearLayout>
</RelativeLayout>
  • 5.建立控制进入与跳转变化的类WelCome:

//用异步的方法来实现跳转的判断

public class Welcome extends AppCompatActivity {
private boolean isFirstIn = false; //设置第一次进入为false
private static final int TIME = 2300; //从logo界面到欢迎页的时间为2.3秒
private static final int GO_HOME = 1000; //到主页的时间
private static final int GO_GUIDE = 1001; //到欢迎页的时间多1来判断 private Handler mHandler = new Handler(){ //异步信息
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case GO_HOME:
goHome();
break;
case GO_GUIDE:
goGuide();
break; default:
break;
} }
}; @Override
protected void onCreate(Bundle savedInstanceState) {
final Intent intent = new Intent(Welcome.this,MainActivity.class);
super.onCreate(savedInstanceState);
setContentView(R.layout.welcome_layout);
init(); //自定义方法判断是否第一次开启App //设置自动跳转时间Timer 无响应后10秒自动跳转
Timer timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
startActivity(intent);
}
};
timer.schedule(task,1000*10);
finish(); } private void init(){
SharedPreferences preferences = getPreferences(MODE_PRIVATE);
isFirstIn = preferences.getBoolean("isFirstIn",true); if (!isFirstIn){
mHandler.sendEmptyMessageDelayed(GO_HOME,TIME);
}else {
mHandler.sendEmptyMessageDelayed(GO_GUIDE,TIME);
SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean("isFirstIn",false);
editor.commit();
} } private void goHome() {
Intent intent = new Intent(Welcome.this,MainActivity.class);
startActivity(intent);
finish();
} private void goGuide() {
Intent intent = new Intent(Welcome.this,Guide.class);
startActivity(intent);
finish();
}
}
  • 6.WelCome视图:

加入logo的ImageView视图:

<?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:orientation="vertical">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/welcome_android"
/>
</LinearLayout>
  • 7.修改AndroidManifest.xml 注册信息以及首选开启项:

修改主题为NoTitleBar,修改引导页为WelCome类:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.asdemot"> <application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen">
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
</activity>
<activity android:name="com.example.asdemot.Guide"> </activity>
<activity android:name="com.example.asdemot.Welcome">
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
  • 8.总结:

需要导入V4的jar包。至此,一个热气腾腾的欢迎页就完成了。

Android ViewPager 打造炫酷欢迎页的更多相关文章

  1. Android 教你打造炫酷的ViewPagerIndicator 不仅仅是高仿MIUI

    1.概述 哈,今天给大家带来一个ViewPagerIndicator的制作,相信大家在做tabIndicator的时候,大多数人都用过 TabPageIndicator,并且很多知名APP都使用过这个 ...

  2. JParticles 2.0 发布,打造炫酷的粒子特效

    JParticles 2.0 发布,打造炫酷的粒子特效.不好意思哈,在这么繁花似锦的世界里,标题不得不取得吸引眼球一点哈,不然...还是不啰嗦了,我们进入正题吧 简单介绍一下 JParticles 2 ...

  3. Android开发之炫酷MD风格

    文章转自:一点点征服的 http://www.cnblogs.com/ldq2016/p/5217590.html 安卓开发中非常炫的效果集合 这几天开发的时候,想做一些好看而且酷炫的特效,于是又开始 ...

  4. Photoshop和WPF双剑配合,打造炫酷个性的进度条控件

    现在如果想打造一款专业的App,UI的设计和操作的简便性相当重要.UI设计可以借助Photoshop或者AI等设计工具,之前了解到WPF设计工具Expression Blend可以直接导入PSD文件或 ...

  5. hexo的next主题个性化教程:打造炫酷网站

    看到有些next主题的网站很炫酷,那么是怎么配置的呢?接下来我会讲一讲如何实现一些炫酷的效果 主要有以下32种: 在右上角或者左上角实现fork me on github 添加RSS 添加动态背景 实 ...

  6. Android 自定义控件玩转字体变色 打造炫酷ViewPager指示器

    1.概述 本篇博客的产生呢,是因为,群里的哥们暖暖给我发了个效果图,然后问我该如何实现顶部ViewPager指示器的字体变色,该效果图是这样的: 大概是今天头条的app,神奇的地方就在于,切换View ...

  7. Android ViewPager打造3D画廊

    本文已授权微信公众号:鸿洋(hongyangAndroid)在微信公众号平台原创首发. 网上有很多关于使用Gallery来打造3D画廊的博客,但是在关于Gallery的官方说法中表明: This cl ...

  8. Android Viewpager+Fragment实现滑动标签页

    ViewPager 结合Fragment实现一个Activity里包含多个可滑动的标签页,每个标签页可以有独立的布局及响应. 主页布局 <?xml version="1.0" ...

  9. Linux进阶之使用Oh-My-Zsh打造炫酷终端

    Oh My Zsh是基于zsh命令行的一个扩展工具集,提供了丰富的扩展功能.除了功能增强之外,还提供非常丰富的主题.使用Oh-My-Zsh打造酷炫Shell终端的步骤(Deepin系统): 原始终端: ...

随机推荐

  1. DEDE更改版权信息

    DEDECMSV5.7版本出现后,在前台网页底部会出现织梦版权信息 “powered by  dedecms”,很多人都不知道怎么去掉 1. 方法一: 在include/dedesql.classs. ...

  2. ajax xmlhttprequest status

    status 0**:未被始化 status 1**:请求收到,继续处理 status 2**:操作成功收到,分析.接受 status 3**:完成此请求必须进一步处理 status 4**:请求包含 ...

  3. python学习第五天 List和tuple类型介绍及其List切片

    List 和tuple: python提供一种类似C语言数组的类型,但是使用起来确是相当的简洁.那就讲讲这神奇的python中list 和tuple吧. List类型: 1.直接贴代码: L = [' ...

  4. 在linux下实现UBOOT的TFTP下载功能

    一.环境 1.条件 软件:虚拟机下linux(本文涉及到的是Ubuntu12.0.4). linux下的串口助手(例如minicom)或windows下的串口助手(例如超级终端.SecureCRT) ...

  5. asp.net mvc 强类型视图中传入List 数据到控制器

    问题来源: 在和一位技术老师聊天时,老师问我一个mvc 表单提交的问题,问道:怎样在表单提交的时候,将 带有 List 属性的对象传入控制器? 这时,我有点呆了,以前一直都好像是 单一属性的表单提交, ...

  6. [转载]网络编辑必知常识:什么是PV、UV和PR值 zz

    1.什么是pv PV(page view),即页面浏览量,或点击量;通常是衡量一个网络新闻频道或网站甚至一条网络新闻的主要指标. 高手对pv的解释是,一个访问者在24小时(0点到24点)内到底看了你网 ...

  7. 解决maven仓库有jar包但是maven程序无法下载仓库jar包

    话说,这个问题困扰了我两个多月了已经~~~ 后来发现不知道被谁动了,把我的仓库没有放到仓库组里面~~~ 用admin登录进去,默认密码是admin123,然后看截图操作吧. (记得删除你本地报错说** ...

  8. Javascript 注意点

    prototype有助于减少function的冲突. 闭包有助于避免全部变量. this, prototype有助于实例化多个对象. 函数 函数表达式

  9. Frequent values

    poj3368:http://poj.org/problem?id=3368 题意:给你一个非下降的序列,然后查询[l,r]内出现最多数字的次数. 题解:首先,因为序列是非下降的,所以相同的数字出现在 ...

  10. cortex m0 lpc1114的NVIC中断如何使用

    LPC1114单片机的NVIC中断函数,有开中断.关中断.设置优先级.挂起等操作函数.这些函数位于core_cm0.h文件里面.比如开中断的函数如下: /** \brief Enable Extern ...