WindowManager.LayoutParams這個類用於提供懸浮窗所需的參數,其中有幾個經常會用到的變量:
type值用於確定懸浮窗的類型,壹般設為2002,表示在所有應用程序之上,但在狀態欄之下。
flags值用於確定懸浮窗的行為,比如說不可聚焦,非模態對話框等等,屬性非常多,大家可以查看文檔。
gravity值用於確定懸浮窗的對齊方式,壹般設為左上角對齊,這樣當拖動懸浮窗的時候方便計算坐標。
x值用於確定懸浮窗的位置,如果要橫向移動懸浮窗,就需要改變這個值。
y值用於確定懸浮窗的位置,如果要縱向移動懸浮窗,就需要改變這個值。
width值用於指定懸浮窗的寬度。
height值用於指定懸浮窗的高度。
創建懸浮窗這種窗體需要向用戶申請權限才可以的,因此還需要在AndroidManifest.xml中加入<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
原理介紹完了,下面我們開始用代碼實現。首先在Eclipse中新建壹個Android項目,項目名就叫做360FloatWindowDemo。然後寫壹下布局文件,布局文件非常簡單,只有壹個按鈕,打開或新建activity_main.xml,加入如下代碼:
[html] view plain copy
<RelativeLayout xmlns:android="/apk/res/android"
xmlns:tools="/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
tools:context=".MainActivity" >
<Button
android:id="@+id/start_float_window"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Start Float Window" >
</Button>
</RelativeLayout>
然後再新建壹個名為float_window_small.xml的布局文件,用於做為小懸浮窗的布局,在其中加入如下代碼:
[html] view plain copy
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout
xmlns:android="/apk/res/android"
android:id="@+id/small_window_layout"
android:layout_width="60dip"
android:layout_height="25dip"
android:background="@drawable/bg_small"
>
<TextView
android:id="@+id/percent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:textColor="#ffffff"
/>
</LinearLayout>
再新建壹個名為float_window_big.xml的布局文件,用於做為大懸浮窗的布局,在其中加入如下代碼:
[html] view plain copy
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout
xmlns:android="/apk/res/android"
android:id="@+id/big_window_layout"
android:layout_width="200dip"
android:layout_height="100dip"
android:background="@drawable/bg_big"
android:orientation="vertical"
>
<Button
android:id="@+id/close"
android:layout_width="100dip"
android:layout_height="40dip"
android:layout_gravity="center_horizontal"
android:layout_marginTop="12dip"
android:text="關閉懸浮窗"
/>
<Button
android:id="@+id/back"
android:layout_width="100dip"
android:layout_height="40dip"
android:layout_gravity="center_horizontal"
android:text="返回"
/>
</LinearLayout>
兩個懸浮窗布局文件中用到的圖片資源,大家可以隨便找點圖片來代替,同時我會給出源碼,大家也可以從源碼中取出。
然後打開或創建MainActivity,這是項目的主界面,在裏面加入如下代碼:
[java] view plain copy
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button startFloatWindow = (Button) findViewById(R.id.start_float_window);
startFloatWindow.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent intent = new Intent(MainActivity.this, FloatWindowService.class);
startService(intent);
finish();
}
});
}
}
這裏可以看到,MainActivity的代碼非窗簡單,就是對開啟懸浮窗的按鈕註冊了壹個點擊事件,用於打開壹個服務,然後關閉當前Activity。創建懸浮窗的邏輯都交給服務去做了。