android實現App第一次進入時的引導學習界面

轉載:http://blog.csdn.net/u011993368/article/details/43764737前端

由於咱們所熟知的Android平臺是一個又一個的Activity組成的,每個Activity有一個或者多個View構成。因此說,當咱們想顯示一個界面的時候,咱們首先想到的是創建一個Activity,而後全部的操做在Activity裏面實現,或者是一個Dialog或者Toast。這種方式當然簡單,可是在有些狀況下,咱們要求的只是簡單的顯示,用Activity顯然是多餘,這個時候,咱們如何處理呢?java

原來,整個Android的窗口機制是基於一個叫作 WindowManager,這個接口能夠添加view到屏幕,也能夠從屏幕刪除view。android

其實咱們的Activity或者Diolog底層的實現也是經過WindowManager,這個 WindowManager是全局的,在整個系統是惟一的。它是顯示View的最底層了。web

效果圖:

點擊屏幕任何一個位置,引導界面消失設計模式

這裏寫圖片描述

源碼分析

  • 兩個類:GuideUtil,ScreenUtilsapp

  • 兩個動畫文件:fade_in.xml ,fade_out.xmleclipse

  • 一個在主activity:MainActivityide

先看看MainActivity 中如何使用這兩個類,再深刻其中看看這兩個類怎麼工做工具

一、MainActivity

 public class MainActivity extends Activity {
    private GuideUtil guideUtil = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /**獲取引導界面工具類的實例**/
        guideUtil = GuideUtil.getInstance();
        /**顯示引導界面,程序一啓動就會顯示引導界面**/
        guideUtil.initGuide(this, R.drawable.add_guide);
        findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                /**若是引導界面消失了,可點擊這個按鈕,顯示引導界面**/
                guideUtil.initGuide(MainActivity.this, R.drawable.add_guide);
            }
        });
        findViewById(R.id.button2).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                /**實際程序中,若是不是第一次,那不會顯示引導界面。
                在setFirst中設置false,模擬這個效果。
                點擊上面的按鈕,不會再彈出引導界面**/
                //是不是第一次進入app
                guideUtil.setFirst(false);
                guideUtil.initGuide(MainActivity.this, R.drawable.add_guide);
            }
        });
    }
}

二、GuideUtil

初始化引導圖層,並設置一個事件。oop

/**
 * @類名:GuideUtil
 * @類描述:引導工具界面
 * @修改人:
 * @修改時間:
 * @修改備註:
 * @版本:
 */
public class GuideUtil {
    private Context context;
    private ImageView imgView;
    private WindowManager windowManager;
    private static GuideUtil instance = null;
    /** 是否第一次進入該程序 **/
    private boolean isFirst = true;
    /**採用私有的方式,只保證這種經過單例來引用,同時保證這個對象不會存在多個**/
    private GuideUtil() {
    }
    /**採用單例的設計模式,同時用了同步鎖**/
    public static GuideUtil getInstance() {
        synchronized (GuideUtil.class) {
            if (null == instance) {
                instance = new GuideUtil();
            }
        }
        return instance;
    }
    private Handler handler = new Handler(Looper.getMainLooper()) {
        public void handleMessage(android.os.Message msg) {
            switch (msg.what) {
            case 1:
                // 設置LayoutParams參數
                final LayoutParams params = new WindowManager.LayoutParams();
                // 設置顯示的類型,TYPE_PHONE指的是來電話的時候會被覆蓋,其餘時候會在最前端,顯示位置在stateBar下面,其餘更多的值請查閱文檔
                params.type = WindowManager.LayoutParams.TYPE_PHONE;
                // 設置顯示格式
                params.format = PixelFormat.RGBA_8888;
                // 設置對齊方式
                params.gravity = Gravity.LEFT | Gravity.TOP;
                // 設置寬高
                params.width = ScreenUtils.getScreenWidth(context);
                params.height = ScreenUtils.getScreenHeight(context);
                // 設置動畫
                params.windowAnimations = R.style.view_anim;
                // 添加到當前的窗口上
                windowManager.addView(imgView, params);
                break;
            }
        };
    };
/**
     * @方法說明:初始化
     * @方法名稱:initGuide
     * @param context
     * @param drawableRourcesId:引導圖片的資源Id
     * @返回值:void
     */
    public void initGuide(Activity context, int drawableRourcesId) {
        /**若是不是第一次進入該界面**/
        if (!isFirst) {
            return;
        }
        this.context = context;
        windowManager = context.getWindowManager();
        /** 動態初始化圖層**/
        imgView = new ImageView(context);
        imgView.setLayoutParams(new LayoutParams(
                android.view.ViewGroup.LayoutParams.MATCH_PARENT,
                android.view.ViewGroup.LayoutParams.MATCH_PARENT));
        imgView.setScaleType(ScaleType.FIT_XY);
        imgView.setImageResource(drawableRourcesId);
        /**這裏我特地用了一個handler延遲顯示界面,主要是爲了進入界面後,你能看到它淡入得動畫效果,否則的話,引導界面就直接顯示出來**/
        handler.sendEmptyMessageDelayed(1, 1000);
        imgView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                /** 點擊圖層以後,將圖層移除**/
                windowManager.removeView(imgView);
            }
        });
    }
    public boolean isFirst() {
        return isFirst;
    }
/**
     * @方法說明:設置是否第一次進入該程序
     * @方法名稱:setFirst
     * @param isFirst
     * @返回值:void
     */
    public void setFirst(boolean isFirst) {
        this.isFirst = isFirst;
    }
}

三、ScreenUtils

這個類主要獲取屏幕的寬度和高度

ScreenUtils類,在只有44 和45 兩個地方有用到

 /**
 * @類名:ScreenUtils
 * @類描述:屏幕工具類
 * @修改人:
 * @修改時間:
 * @修改備註:
 * @版本:
 */
public class ScreenUtils {
    /**
     * @方法說明:獲取DisplayMetrics對象
     * @方法名稱:getDisPlayMetrics
     * @param context
     * @return
     * @返回值:DisplayMetrics
     */
    public static DisplayMetrics getDisPlayMetrics(Context context) {
        DisplayMetrics metric = new DisplayMetrics();
        if (null != context) {
            ((Activity) context).getWindowManager().getDefaultDisplay()
                    .getMetrics(metric);
        }
        return metric;
    }
    /**
     * @方法說明:獲取屏幕的寬度(像素)
     * @方法名稱:getScreenWidth
     * @param context
     * @return
     * @返回值:int
     */
    public static int getScreenWidth(Context context) {
        int width = getDisPlayMetrics(context).widthPixels;
        return width;
    }
    /**
     * @方法說明:獲取屏幕的高(像素)
     * @方法名稱:getScreenHeight
     * @param context
     * @return
     * @返回值:int
     */
    public static int getScreenHeight(Context context) {
        int height = getDisPlayMetrics(context).heightPixels;
        return height;
    }
    /**
     * @方法說明:屏幕密度(0.75 / 1.0 / 1.5)
     * @方法名稱:getDensity
     * @param context
     * @return
     * @返回 float
     */
    public static float getDensity(Context context) {
        float density = getDisPlayMetrics(context).density;
        return density;
    }
    /**
     * @方法說明:屏幕密度DPI(120 / 160 / 240)
     * @方法名稱:getDensityDpi
     * @param context
     * @return
     * @返回 int
     */
    public static int getDensityDpi(Context context) {
        int densityDpi = getDisPlayMetrics(context).densityDpi;
        return densityDpi;
    }
}

四、兩個動畫文件

fade_in.xml

 <?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fromAlpha="0.0"
    android:toAlpha="1.0" />

fade_out.xml

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fromAlpha="1.0"
    android:toAlpha="0.0" />

源碼下載:

原做者想賺點資源分,提供了eclipse項目代碼,若是手頭分數還算寬裕,去原做者那裏下載

若是沒有分的而且不會轉化爲AS項目的,我提供了這個下載地址

相關文章
相關標籤/搜索