亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

android編程實現懸浮窗體的方法

2020-04-11 11:18:33
字體:
來源:轉載
供稿:網友

本文實例講述了android編程實現懸浮窗體的方法。分享給大家供大家參考,具體如下:

突然對懸浮窗體感興趣,查資料做了個小Demo,效果是點擊按鈕后,關閉當前Activity,顯示懸浮窗口,窗口可以拖動,雙擊后消失。效果圖如下:

它的使用原理很簡單,就是借用了WindowManager這個管理類來實現的。

1.首先在AndroidManifest.xml中添加使用權限:

復制代碼 代碼如下:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

2.懸浮窗口布局實現

public class DesktopLayout extends LinearLayout {  public DesktopLayout(Context context) {    super(context);    setOrientation(LinearLayout.VERTICAL);// 水平排列    //設置寬高    this.setLayoutParams( new LayoutParams(LayoutParams.WRAP_CONTENT,        LayoutParams.WRAP_CONTENT));    View view = LayoutInflater.from(context).inflate(         R.layout.desklayout, null);     this.addView(view);  }

3.在activity中讓它顯示出來。

// 取得系統窗體mWindowManager = (WindowManager) getApplicationContext()    .getSystemService("window");// 窗體的布局樣式mLayout = new WindowManager.LayoutParams();// 設置窗體顯示類型――TYPE_SYSTEM_ALERT(系統提示)mLayout.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;// 設置窗體焦點及觸摸:// FLAG_NOT_FOCUSABLE(不能獲得按鍵輸入焦點)mLayout.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;// 設置顯示的模式mLayout.format = PixelFormat.RGBA_8888;// 設置對齊的方法mLayout.gravity = Gravity.TOP | Gravity.LEFT;// 設置窗體寬度和高度mLayout.width = WindowManager.LayoutParams.WRAP_CONTENT;mLayout.height = WindowManager.LayoutParams.WRAP_CONTENT;

詳細 MainActivity 代碼如下:

package com.yc.yc_suspendingform;import android.app.Activity;import android.graphics.PixelFormat;import android.graphics.Rect;import android.os.Bundle;import android.util.Log;import android.view.Gravity;import android.view.MotionEvent;import android.view.View;import android.view.View.OnClickListener;import android.view.View.OnTouchListener;import android.view.WindowManager;import android.widget.Button;import com.yc.yc_floatingform.R;public class MainActivity extends Activity {  private WindowManager mWindowManager;  private WindowManager.LayoutParams mLayout;  private DesktopLayout mDesktopLayout;  private long startTime;  // 聲明屏幕的寬高  float x, y;  int top;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);        createWindowManager();    createDesktopLayout();    Button btn = (Button) findViewById(R.id.btn);    btn.setOnClickListener(new OnClickListener() {      public void onClick(View v) {        showDesk();      }    });  }  /**   * 創建懸浮窗體   */  private void createDesktopLayout() {    mDesktopLayout = new DesktopLayout(this);    mDesktopLayout.setOnTouchListener(new OnTouchListener() {      float mTouchStartX;      float mTouchStartY;      @Override      public boolean onTouch(View v, MotionEvent event) {        // 獲取相對屏幕的坐標,即以屏幕左上角為原點        x = event.getRawX();        y = event.getRawY() - top; // 25是系統狀態欄的高度        Log.i("startP", "startX" + mTouchStartX + "====startY"            + mTouchStartY);        switch (event.getAction()) {        case MotionEvent.ACTION_DOWN:          // 獲取相對View的坐標,即以此View左上角為原點          mTouchStartX = event.getX();          mTouchStartY = event.getY();          Log.i("startP", "startX" + mTouchStartX + "====startY"              + mTouchStartY);          long end = System.currentTimeMillis() - startTime;          // 雙擊的間隔在 300ms以下          if (end < 300) {            closeDesk();          }          startTime = System.currentTimeMillis();          break;        case MotionEvent.ACTION_MOVE:          // 更新浮動窗口位置參數          mLayout.x = (int) (x - mTouchStartX);          mLayout.y = (int) (y - mTouchStartY);          mWindowManager.updateViewLayout(v, mLayout);          break;        case MotionEvent.ACTION_UP:          // 更新浮動窗口位置參數          mLayout.x = (int) (x - mTouchStartX);          mLayout.y = (int) (y - mTouchStartY);          mWindowManager.updateViewLayout(v, mLayout);          // 可以在此記錄最后一次的位置          mTouchStartX = mTouchStartY = 0;          break;        }        return true;      }    });  }  @Override  public void onWindowFocusChanged(boolean hasFocus) {    super.onWindowFocusChanged(hasFocus);    Rect rect = new Rect();    // /取得整個視圖部分,注意,如果你要設置標題樣式,這個必須出現在標題樣式之后,否則會出錯    getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);    top = rect.top;//狀態欄的高度,所以rect.height,rect.width分別是系統的高度的寬度    Log.i("top",""+top);  }  /**   * 顯示DesktopLayout   */  private void showDesk() {    mWindowManager.addView(mDesktopLayout, mLayout);    finish();  }  /**   * 關閉DesktopLayout   */  private void closeDesk() {    mWindowManager.removeView(mDesktopLayout);    finish();  }  /**   * 設置WindowManager   */  private void createWindowManager() {    // 取得系統窗體    mWindowManager = (WindowManager) getApplicationContext()        .getSystemService("window");    // 窗體的布局樣式    mLayout = new WindowManager.LayoutParams();    // 設置窗體顯示類型――TYPE_SYSTEM_ALERT(系統提示)    mLayout.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;    // 設置窗體焦點及觸摸:    // FLAG_NOT_FOCUSABLE(不能獲得按鍵輸入焦點)    mLayout.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;    // 設置顯示的模式    mLayout.format = PixelFormat.RGBA_8888;    // 設置對齊的方法    mLayout.gravity = Gravity.TOP | Gravity.LEFT;    // 設置窗體寬度和高度    mLayout.width = WindowManager.LayoutParams.WRAP_CONTENT;    mLayout.height = WindowManager.LayoutParams.WRAP_CONTENT;  }}

完整實例代碼代碼點擊此處本站下載。

希望本文所述對大家Android程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品视频久久久| 中文字幕亚洲第一| 精品国产一区二区三区久久久| 久久视频在线视频| 国产精品99久久久久久久久久久久| 国产欧美一区二区白浆黑人| 亚洲精品白浆高清久久久久久| 国产福利精品av综合导导航| 日韩av在线资源| 亚洲999一在线观看www| 午夜精品一区二区三区在线视频| 国产成人精品av| 中文字幕日韩高清| 亚洲最大福利视频网| 91国自产精品中文字幕亚洲| 日韩在线观看免费高清| 全球成人中文在线| 久久精品在线视频| 亚洲美女视频网| 性色av一区二区三区在线观看| 国产裸体写真av一区二区| 国产成人久久久精品一区| 久久国内精品一国内精品| 欧美午夜精品久久久久久浪潮| 欧美床上激情在线观看| 正在播放欧美一区| 欧美极品美女视频网站在线观看免费| 色综合亚洲精品激情狠狠| 国产日韩欧美在线视频观看| 中文字幕亚洲欧美日韩2019| 日韩中文在线中文网在线观看| 国产精品高清网站| 激情懂色av一区av二区av| 久久久久久久999精品视频| 亚洲欧美一区二区激情| 欧美成人中文字幕| 亚洲大胆美女视频| 69视频在线免费观看| 精品久久中文字幕| 欧美成人黑人xx视频免费观看| 成人黄色生活片| 精品久久久久久亚洲精品| 久久精品视频免费播放| 亚洲欧美精品一区二区| 欧美福利在线观看| 国产精品三级美女白浆呻吟| 亚洲资源在线看| 亚洲视频在线播放| 在线激情影院一区| 国产精品∨欧美精品v日韩精品| 亚洲一区二区少妇| 国产精品成人观看视频国产奇米| 亚洲精品suv精品一区二区| 成人做爰www免费看视频网站| 国产成人精品免费久久久久| 久久中文字幕国产| 国产精品电影网| 91在线无精精品一区二区| 欧美午夜美女看片| 欧美电影在线观看完整版| 欧美综合国产精品久久丁香| 欧美最猛黑人xxxx黑人猛叫黄| 亚洲九九九在线观看| 国产精品尤物福利片在线观看| 一本色道久久综合亚洲精品小说| 欧美性一区二区三区| 国产精选久久久久久| 欧美激情亚洲精品| 欧美插天视频在线播放| 亚洲欧美日韩精品久久亚洲区| 色偷偷偷亚洲综合网另类| 日韩视频中文字幕| 国内精品久久久久影院 日本资源| 26uuu久久噜噜噜噜| 国产精品老女人视频| 日本乱人伦a精品| 亚洲日本欧美中文幕| 国产偷国产偷亚洲清高网站| 欧美日韩免费网站| 欧美在线影院在线视频| 精品亚洲va在线va天堂资源站| 91久久精品美女| 日韩av中文字幕在线播放| 亚洲性夜色噜噜噜7777| 最近中文字幕日韩精品| 亚洲无限乱码一二三四麻| 九九综合九九综合| 欧美中在线观看| 亚洲资源在线看| xxav国产精品美女主播| 国产成人极品视频| 福利微拍一区二区| 九九精品在线视频| 亚洲免费视频网站| 97超级碰在线看视频免费在线看| 国产欧美日韩中文| 成人免费观看a| 色偷偷偷亚洲综合网另类| 日韩一中文字幕| 国产亚洲视频在线| 国产在线不卡精品| 亚洲精品视频免费| 成人欧美一区二区三区在线湿哒哒| 中文字幕欧美专区| 色悠悠久久88| 日韩精品在线观看网站| 欧美精品999| 亲爱的老师9免费观看全集电视剧| 欧美成人午夜激情| 精品久久久久久久久久久久| 欧美日本中文字幕| 国产婷婷成人久久av免费高清| 欧美黑人一级爽快片淫片高清| 91久久中文字幕| 国产精品美女www爽爽爽视频| 欧美精品一区二区三区国产精品| 亚洲国产精品人人爽夜夜爽| 中文字幕久精品免费视频| 国产美女久久精品| 久久精品99久久久久久久久| 成人激情视频在线| 国产欧美精品一区二区| 九九精品视频在线| 午夜精品久久久久久久久久久久久| 欧美激情久久久久久| xxx一区二区| 欧美色videos| 亚洲成人免费在线视频| 国产精品电影观看| 久久色在线播放| 久久国产一区二区三区| 久久久久99精品久久久久| 91国偷自产一区二区三区的观看方式| 色噜噜狠狠狠综合曰曰曰88av| 最新69国产成人精品视频免费| 亚洲一区二区三区视频| 中文字幕在线成人| 欧美激情极品视频| 欧美一级片久久久久久久| zzijzzij亚洲日本成熟少妇| 国产欧美 在线欧美| 久久视频国产精品免费视频在线| 欧美精品在线观看| 亚洲精品国产福利| 欧美性xxxxxxxxx| 亚洲成人激情图| 日韩欧美大尺度| 欧美精品少妇videofree| 国产成人鲁鲁免费视频a| 最新国产精品拍自在线播放| 久久国产精品影视| 91丝袜美腿美女视频网站| 岛国视频午夜一区免费在线观看| 午夜精品久久久久久久男人的天堂| 亚洲视频第一页| 欧美日韩国产综合新一区| 欧美放荡办公室videos4k| 亚洲偷欧美偷国内偷| 97精品一区二区视频在线观看| 欧美激情视频网站| 91久久精品美女| 国产精品三级网站| 欧美激情视频免费观看| 欧美国产视频一区二区|