启动篇
主要分为开机和功能导航俩部分来总结
先上部分截图图直观感受下
1、开机部分
开机图片比较简单,有个开机图片,图片放在了R.layout.start布局文件中,刚开始老是出现适配问题,后来索性放到LinearLayout的background属性中,然后使用Hnadler创建了一个子线程延时子线程加载后续的跳转Activity(第一次开机跳转功能导航,非第一次跳转主界面)开机的布局文件 R.layout.start(适配比较好)
[html] view plain copy
- <span style="font-family:Microsoft YaHei;font-size:14px;"><?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:baiduadsdk="http://schemas.android.com/apk/res/com.weimeijing.feigeshudi"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:background="@drawable/startlogo" >
- </LinearLayout></span>
开机的Activity文件StartActivity.Java
其中引导动画逻辑部分,这里采用SharedPreferences方式记录是否第一次启动,来判断是否进入引导画面开机
[java] view plain copy
- <span style="font-family:Microsoft YaHei;font-size:14px;">package com;
- import android.app.Activity;
- import android.content.Intent;
- import android.content.SharedPreferences;
- import android.os.Bundle;
- import android.os.Handler;
- import com.kaiji.Viewpage_Activity;
- import com.weimeijing.feigeshudi.R;
- public class StartActivity extends Activity {
- private final int SPLASH_DISPLAY_LENGHT = 2000; // 延迟二秒
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.start);//在这个显示开机图片
- // handler线程延时2秒执行run方法,显示开机图片效果
- new Handler().postDelayed(new Runnable() {
- @Override
- public void run() {
- // run方法中SharedPreference就是一个xml文件,里面通过键值对来存储相应的用户的设置及其状态。
- SharedPreferences setting = getSharedPreferences(
- "CitiGame.ini", 0);
- Boolean user_first = setting.getBoolean("FIRST", true);
- if (user_first) {
- //第一次加载跳转到功能导航界面
- <span style="color:#009900;">setting.edit().putBoolean("FIRST", false).commit()</span>;
- Intent intent = new Intent(StartActivity.this,
- Viewpage_Activity.class);
- StartActivity.this.startActivity(intent);
- StartActivity.this.finish();
- } else {
- //非第一次加载直接跳转主界面
- Intent mainIntent = new Intent(StartActivity.this,
- MainTabActivity.class);
- StartActivity.this.startActivity(mainIntent);
- StartActivity.this.finish();
- }
- }
- }, SPLASH_DISPLAY_LENGHT);
- }
- }
- </span>
1.1、知识点
代码注释的很清楚了,这里主要重点提一下
【1】SharedPreferences,它的本质其实就是xml,但是它可以通过键值对来存储用户相应的设置,算是一个轻量级的存储类,SharedPreferences类似过去Windows系统上的ini配置文件,但是它分为多种权限,可以全局共享访问。
getSharedPreferences(String name, int mode)
name为本组件的配置文件名( 自己定义,也就是一个文件名),当这个文件不存在时,直接创建,如果已经存在,则直接使用,
mode为操作模式,默认的模式为0或MODE_PRIVATE,还可以使用MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE
mode指定为MODE_PRIVATE,则该配置文件只能被自己的应用程序访问。
mode指定为MODE_WORLD_READABLE,则该配置文件除了自己访问外还可以被其它应该程序读取。
mode指定为MODE_WORLD_WRITEABLE,则该配置文件除了自己访问外还可以被其它应该程序读取和写入
【2】SharedPreferences使用
它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。 其存储位置在/data/data/<包名>/shared_prefs目录下。
SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现。
实现SharedPreferences存储的步骤如下:
一、根据Context获取SharedPreferences对象
二、利用edit()方法获取Editor对象。
三、通过Editor对象存储key-value键值对数据。
四、通过commit()方法提交数据。
【3】代码分析
在创建的SharedPreferences中第一次运行记录为true从而进入第一个if条件进入功能导航:
Boolean user_first = setting.getBoolean("FIRST", true);
然后进入第一个if判断立马将其修改为false:
setting.edit().putBoolean("FIRST", false).commit();
这样下次启动时就直接进入第二个if中直接跳转到主界面
【4】handler开启子线程的达到延时加载的效果
代码中已经表现的很详细了
2、功能导航部分
主要就是采用ViewPager+LayoutInflater (动态加载页面)来实现
主要分为以下2大部分:
2.1、初始化
主要是通过LayoutInflater动态加载导航页面,为了显示效果这里还加入了一些标记圆点,在上图可以看到,代码注释如下
[java] view plain copy
- // 用来获取整个View并返回
- LayoutInflater inflater = getLayoutInflater();
- pageViews = new ArrayList<View>();
- pageViews.add(inflater.inflate(R.layout.activity_viewpage1, null));
- pageViews.add(inflater.inflate(R.layout.activity_viewpage2, null));
- pageViews.add(inflater.inflate(R.layout.activity_viewpage3, null));
- pageViews.add(inflater.inflate(R.layout.activity_viewpage4, null));
- pageViews.add(inflater.inflate(R.layout.activity_viewpage5, null));
- pageViews.add(inflater.inflate(R.layout.activity_viewpage6, null));
- // 小圆点数大小是图片的个数
- imageViews = new ImageView[pageViews.size()];
- // 从指定xml文件中加载视图
- viewPictures = (ViewGroup) inflater.inflate(
- R.layout.activity_viewpagers, null);
- viewPager = (ViewPager) viewPictures.findViewById(R.id.guidePagers);
- viewPoints = (ViewGroup) viewPictures.findViewById(R.id.viewPoints);
- // 添加小圆点导航图片
- for (int i = 0; i < pageViews.size(); i++) {
- imageView = new ImageView(Viewpage_Activity.this);
- imageView.setLayoutParams(new LayoutParams(20, 20));
- imageView.setPadding(5, 0, 5, 0);
- // 把小圆点放进数组
- imageViews[i] = imageView;
- // 默认选中的是第一张图片,此时第一个小圆点是选中状态,其他不是
- if (i == 0)
- imageViews[i].setImageDrawable(getResources().getDrawable(
- R.drawable.page_indicator_focused));
- else
- imageViews[i].setImageDrawable(getResources().getDrawable(
- R.drawable.page_indicator_unfocused));
- // 将imageViews添加到小圆点视图组
- viewPoints.addView(imageViews[i]);
- }
2.2、PageAdapter——PageView的适配器
跟ListView一样这玩意也需要适配器
PageAdapter 必须重写的四个函数:
* boolean isViewFromObject(View arg0, Object arg1)
* int getCount()
* void destroyItem(ViewGroup Container, int position,Object object)
* Object instantiateItem(ViewGroup container, int position)
具体作用如下代码注释:
[java] view plain copy
- // 导航view的适配器
- class NavigationAdapter extends PagerAdapter {
- // 获取需要滑动view数目
- @Override
- public int getCount() {
- return pageViews.size();
- }
- @Override
- public boolean isViewFromObject(View arg0, Object arg1) {
- return arg0 == arg1;
- }
- // 2件事情,第一:将当前视图添加到container中,第二:返回当前View
- @Override
- public Object instantiateItem(View container, int position) {
- ((ViewPager) container).addView(pageViews.get(position));
- return pageViews.get(position);
- }
- // 销毁每个Item
- @Override
- public void destroyItem(View container, int position, Object object) {
- ((ViewPager) container).removeView(pageViews.get(position));
- }
- }
2.3、知识点
这个部分需要注意以下知识点
【1】ViewPager
ViewPager类提供了多界面切换的新效果,新效果有如下特征:
<1>当前显示一组界面中的其中一个界面;
<2>当用户通过左右滑动界面时,当前的屏幕显示当前界面和下一个界面的一部分;
<3>滑动结束后,界面自动跳转到当前选择的界面中
【2】LayoutInflater
动态加载页面,注意与findViewById()的区别
LayoutInflater其实是在res/layout/下找到xml布局文件,并且将其实例化,这个和findViewById()有点相似,后者是找xml布局文件下的具体widget控件(如Button、TextView等)
作用:
1、对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来载入;
2、对于一个已经载入的界面,就可以使用Activiyt.findViewById()方法来获得其中的界面元素。
转载:http://blog.csdn.net/xsf50717/article/details/47205259