轉載: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 中如何使用這兩個類,再深刻其中看看這兩個類怎麼工做工具
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); } }); } }
初始化引導圖層,並設置一個事件。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類,在只有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項目的,我提供了這個下載地址。