zoukankan      html  css  js  c++  java
  • 一个闪屏的Android示例程序z

    新文章移至 
    http://cffile.sinaapp.com/?p=45

        用过手机QQ的基本上都知道,刚启动程序时候会在一个界面停留一会,按任意键的就直接跳过,这就是所谓的闪屏。那么,在Android中怎样实现这样的效果呢?       1、新建一个Android项目,命名为SplashyDemo,结构如下所示

           

       

          2、 添加资源图片

               首先我们得有闪屏时候显示的图片资源文件,并将图片放在res/drawable目录下,命名为splash.jpg:

             

              这时候会在R类中自动添加资源文件对应的ID,如下所示:

                    

          

          3、编写闪屏的界面布局文件,放在res/layout目录下,如下图: 

              

               该布局内容如下所示:           


    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:gravity="center">
      
    <ImageView
         android:id="@+id/img1"
         android:src="@drawable/splash"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         
    >
      
    </ImageView>
    </LinearLayout>

     

            从上述代码中可以看出,界面布局采用的是线性布局(在后面会专门介绍Android中的各种界面布局的),并且子控件仅仅是ImageView用来显示图片。如果你在运行时发现图片偏左偏右或者被拉伸等问题,还请仔细参考下上面代码中的一些布局设置细节,如LinearLayout的gravity属性设置为center以及宽度和高度设置为撑满父容器的模式,ImageView控件的宽度与高度设置为适合子控件模式,并且其数据源通过src属性绑定到drawable

           

          4、编写闪屏界面的逻辑代码: 

                

            逻辑代码如下:        


    package cnblogs.com;

    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.KeyEvent;

    public class SplashyDemo extends Activity {

        
    private long m_dwSplashTime=3000;
        
    private boolean m_bPaused=false;
        
    private boolean m_bSplashActive=true;

        
    /** Called when the activity is first created. */
        @Override
        
    public void onCreate(Bundle savedInstanceState) {
            
    super.onCreate(savedInstanceState);
            setContentView(R.layout.splash);

            Thread splashTimer=new Thread()
            {
                
    public void run(){
                    
    try{
                        
    //wait loop
                        long ms=0;
                        
    while(m_bSplashActive && ms<m_dwSplashTime){
                            sleep(100);

                            
    if(!m_bPaused)
                                ms+=100;
                        }

                        startActivity(new Intent("com.google.app.splashy.CLEARSPLASH"));
                    }
                    
    catch(Exception ex){
                        Log.e("Splash",ex.getMessage());
                    }
                    
    finally{
                        finish();
                    }
                }
            };
            splashTimer.start();
        }

        @Override
        
    protected void onPause() {        
            
    super.onPause();
            m_bPaused=true;
        }

        @Override
        
    protected void onResume() {        
            
    super.onResume();
            m_bPaused=false;
        }

        @Override
        
    public boolean onKeyDown(int keyCode, KeyEvent event) {        
            
    super.onKeyDown(keyCode, event);
            
    switch(keyCode){
            
    case KeyEvent.KEYCODE_MENU:
                m_bSplashActive=false;
                
    break;
            
    case KeyEvent.KEYCODE_BACK:
                
    /*两种退出方法*/
                
    /* System.exit(0);*/
                
    /* android.os.Process.killProcess(android.os.Process.myPid());*/
                android.os.Process.killProcess(android.os.Process.myPid());
                
    break;
            
    default:
                
    break;
            }        
            
    return true;
        }
    }

     

          以上代码参看的是Android Essentials一书, 笔者看的是英文版,对于一些英语不太好的朋友,笔者觉的代为分析下这个示例还是有些意义的。

          1)变量解释:

    Ø  m_dwSplashTimelong 类型,为闪屏界面停留的时间,这儿设置为3000也就是3

    Ø  m_Paused: bool 类型,设置该变量可以使得程序暂停在闪屏界面

    Ø  m_bSplashActivebool类型,设置该变量可以跳过闪屏,从而快速竟如主程序界面

     

     2)程序结构解释:

    Ø  SplashyDemo继承自Activity,且是程序启动的第一个界面(查看),所以要实现闪屏,我们需要开启一个线程,以便在3秒钟之后进入主界面。这些主要有一个while循环来实现

    Ø  3秒钟结束或者用户选择跳过闪屏后,程序会调用startActivity函数来跳到主界面,传入该函数的参数是一个"com.google.app.splashy.CLEARSPLASH"intent对象。至于什么是Intent对象,这儿简单的介绍下。Intent对象主要是多个Activity对象之间传递信息、交流的一个对象。并且,当startActivity函数被

    调用的时候,Android会搜索所有的描述性文件(manifests文件)直到找到intent Action"com.google.app.splashy.CLEARSPLASH"的节点。如工程中AndroidManifest.xml文件中部分内容如下:

                   <activity android:name=".MainMenu"    android:label="@string/main_name">

                  <intent-filter>

                     <action android:name="com.google.app.splashy.CLEARSPLASH"></action>

                     <category android:name="android.intent.category.DEFAULT"></category>

                  </intent-filter>

                  </activity>

                   

             5 重写下SplashyDmeoOnPausedOnResume函数

       当程序Pause或者Resume的时候,再稍微做下处理:

    1) 当程序Pause时候,设置m_paused=true,从而使得程序暂停

    2) 当程序Resume的时候,要设置m_paused=false,从而使得程序恢复正常运行

     

       6、  键盘事件处理

            处理键盘事件只需重写下继承自Activity类的onKeyDown函数即可,从示例程序中可以看出,当我们按下Menu键的话,直接跳过闪屏进入主界面;若按           下Back键的话,则直接退出主程序。 

           

             7、运行效果   

               

             闪屏界面

     

             

             3秒过后进入主界面

  • 相关阅读:
    idea 中使用 svn
    [剑指offer] 40. 数组中只出现一次的数字
    [剑指offer] 39. 平衡二叉树
    [剑指offer] 38. 二叉树的深度
    [剑指offer] 37. 数字在排序数组中出现的次数
    [剑指offer] 36. 两个链表的第一个公共结点
    [剑指offer] 35. 数组中的逆序对
    vscode在win10 / linux下的.vscode文件夹的配置 (c++/c)
    [剑指offer] 34. 第一个只出现一次的字符
    [剑指offer] 33. 丑数
  • 原文地址:https://www.cnblogs.com/chenzhihong/p/2232224.html
Copyright © 2011-2022 走看看