市面上不管是android軟件還是Ios軟件,當你下載第一次使用的時候,往往很多界面會有那種半透明的高亮的知道界面,教你們如何的操作。
因爲我們所熟知的Android平臺是一個又一個的Activity組成的,每一個Activity有一個或者多個View構成。所以說,當我們想顯示一個界面的時候,我們首先想到的是建立一個Activity,然後所有的操作在Activity裏面實現,或者是一個Dialog或者Toast。這種方式固然簡單,但是在有些情況下,我們要求的只是簡單的顯示,用Activity顯然是多餘,這個時候,我們如何處理呢?
原來,整個Android的窗口機制是基於一個叫做 WindowManager,這個接口可以添加view到屏幕,也可以從屏幕刪除view。它面向的對象一端是屏幕,另一端就是View,直接忽略我們以前的Activity或者Dialog之類的東東。其實我們的Activity或者Diolog底層的實現也是通過WindowManager,這個 WindowManager是全局的,整個系統就是這個唯一的東東。它是顯示View的最底層了。
說了這麼多,那我先上一張效果圖:
那說說我們如何實現了,我在這裏把這個類封裝了下:
/**
* @類名: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
* @類描述:屏幕工具類
* @修改人:
* @修改時間:
* @修改備註:
* @版本:
*/
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;
}
}
然後在工程的anim文件中添加兩個動畫文件
一個是淡入的: fade_in.xml
一個是淡出的:fade_out.xml
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" />
最後,我們就在我們需要操作的界面進行操作了,代碼如下:
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,當我們點擊的時候,
就沒有效果了!不會再彈出了**/
guideUtil.setFirst(false);
guideUtil.initGuide(MainActivity.this, R.drawable.add_guide);
}
});
}
}
好的,最後這個引導界面的效果就完成了。謝謝。不喜勿噴。
由於個人沒什麼金幣,金幣比較少,所以特此掙兩個金幣。如果願意的話,你們可以下載該源碼,謝謝:
http://download.csdn.net/detail/u011993368/9065185