天天看点

掌上快递之开机启动篇

启动篇

主要分为开机和功能导航俩部分来总结

先上部分截图图直观感受下

掌上快递之开机启动篇

1、开机部分

开机图片比较简单,有个开机图片,图片放在了r.layout.start布局文件中,刚开始老是出现适配问题,后来索性放到linearlayout的background属性中,然后使用hnadler创建了一个子线程延时子线程加载后续的跳转activity(第一次开机跳转功能导航,非第一次跳转主界面)开机的布局文件 r.layout.start(适配比较好)

<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>  

其中引导动画逻辑部分,这里采用sharedpreferences方式记录是否第一次启动,来判断是否进入引导画面开机

<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);  

                }  

            }  

        }, 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动态加载导航页面,为了显示效果这里还加入了一些标记圆点,在上图可以看到,代码注释如下

// 用来获取整个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  

                        r.drawable.page_indicator_unfocused));  

            // 将imageviews添加到小圆点视图组  

            viewpoints.addview(imageviews[i]);  

        }  

2.2、pageadapter——pageview的适配器

跟listview一样这玩意也需要适配器

pageadapter 必须重写的四个函数:

    * boolean isviewfromobject(view arg0, object arg1)

    * int getcount() 

    * object instantiateitem(viewgroup container, int position)

具体作用如下代码注释:

// 导航view的适配器  

    class navigationadapter extends pageradapter {  

        // 获取需要滑动view数目  

        @override  

        public int getcount() {  

            return pageviews.size();  

        public boolean isviewfromobject(view arg0, object arg1) {  

            return arg0 == arg1;  

        // 2件事情,第一:将当前视图添加到container中,第二:返回当前view  

        public object instantiateitem(view container, int position) {  

            ((viewpager) container).addview(pageviews.get(position));  

            return pageviews.get(position);  

        // 销毁每个item  

        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

继续阅读