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

首頁 > 系統 > Android > 正文

圣誕節,寫個程序練練手――――Android 全界面懸浮按鈕實現

2020-04-11 11:07:50
字體:
來源:轉載
供稿:網友

開始我以為懸浮窗口,可以用Android中得PopupWindow 來實現,雖然也實現了,但局限性非常大。比如PopupWindow必須要有載體View,也就是說,必須要指定在那個View的上面來實現。以該View為相對位置,來顯示PopupWindow。這就局限了其智能在用戶交互的窗口上,相對的顯示。而無法自由的拖動位置和在桌面顯示。

于是查閱了一些資料,有兩種實現方法。一種是自定義Toast,Toast是運行于所有界面之上的,也就是說沒有界面可以覆蓋它。另一種是Android中得CompatModeWrapper類,ConmpatModeWrapper是基類,實現大部分功能的是它的內部類WindowManagerImpl。該對象可以通過getApplication().getSystemService(Context.WINDOW_SERVICE)得到。(注:如果是通過activity.getSystemService(Context.WINDOW_SERVICE)得到的只是屬于Activity的LocalWindowManager)。

簡單的介紹之后,我們直接來看代碼實現,注釋已經寫在代碼中。

MainActivity.javapackage com.example.floatviewdemo;import com.example.floatviewdemo.service.FloatViewService;import android.app.Activity;import android.content.Intent;import android.os.Bundle;public class MainActivity extends Activity {  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);  }  @Override protected void onStart() {  Intent intent = new Intent(MainActivity.this, FloatViewService.class);      //啟動FloatViewService      startService(intent);  super.onStart(); }  @Override protected void onStop() { // 銷毀懸浮窗 Intent intent = new Intent(MainActivity.this, FloatViewService.class);     //終止FloatViewService     stopService(intent);     super.onStop(); }}

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:tools="http://schemas.android.com/tools"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:background="#fff"  android:paddingBottom="@dimen/activity_vertical_margin"  android:paddingLeft="@dimen/activity_horizontal_margin"  android:paddingRight="@dimen/activity_horizontal_margin"  android:paddingTop="@dimen/activity_vertical_margin"  tools:context="com.example.floatviewdemo.MainActivity" >  <TextView    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:text="@string/hello_world" /></RelativeLayout>

實現懸浮窗功能的service類

package com.example.floatviewdemo.service;import com.example.floatviewdemo.R;import android.annotation.SuppressLint;import android.app.Service;import android.content.Intent;import android.graphics.PixelFormat;import android.os.IBinder;import android.util.Log;import android.view.Gravity;import android.view.LayoutInflater;import android.view.MotionEvent;import android.view.View;import android.view.View.OnClickListener;import android.view.View.OnTouchListener;import android.view.WindowManager;import android.view.WindowManager.LayoutParams;import android.widget.ImageButton;import android.widget.LinearLayout;import android.widget.Toast;public class FloatViewService extends Service  {  private static final String TAG = "FloatViewService";   //定義浮動窗口布局   private LinearLayout mFloatLayout;   private WindowManager.LayoutParams wmParams;   //創建浮動窗口設置布局參數的對象   private WindowManager mWindowManager;   private ImageButton mFloatView;   @Override   public void onCreate()    {     super.onCreate();     Log.i(TAG, "onCreate");     createFloatView();      }   @SuppressWarnings("static-access") @SuppressLint("InflateParams") private void createFloatView()   {     wmParams = new WindowManager.LayoutParams();     //通過getApplication獲取的是WindowManagerImpl.CompatModeWrapper     mWindowManager = (WindowManager)getApplication().getSystemService(getApplication().WINDOW_SERVICE);     //設置window type     wmParams.type = LayoutParams.TYPE_PHONE;      //設置圖片格式,效果為背景透明     wmParams.format = PixelFormat.RGBA_8888;      //設置浮動窗口不可聚焦(實現操作除浮動窗口外的其他可見窗口的操作)     wmParams.flags = LayoutParams.FLAG_NOT_FOCUSABLE;        //調整懸浮窗顯示的停靠位置為左側置頂     wmParams.gravity = Gravity.LEFT | Gravity.TOP;         // 以屏幕左上角為原點,設置x、y初始值,相對于gravity     wmParams.x = 0;     wmParams.y = 152;     //設置懸浮窗口長寬數據      wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;     wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT;     LayoutInflater inflater = LayoutInflater.from(getApplication());     //獲取浮動窗口視圖所在布局     mFloatLayout = (LinearLayout) inflater.inflate(R.layout.alert_window_menu, null);     //添加mFloatLayout     mWindowManager.addView(mFloatLayout, wmParams);     //浮動窗口按鈕     mFloatView = (ImageButton) mFloatLayout.findViewById(R.id.alert_window_imagebtn);    mFloatLayout.measure(View.MeasureSpec.makeMeasureSpec(0,         View.MeasureSpec.UNSPECIFIED), View.MeasureSpec         .makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));     //設置監聽浮動窗口的觸摸移動     mFloatView.setOnTouchListener(new OnTouchListener()      {      boolean isClick;  @SuppressLint("ClickableViewAccessibility") @Override  public boolean onTouch(View v, MotionEvent event) {  switch (event.getAction()) {  case MotionEvent.ACTION_DOWN:   mFloatView.setBackgroundResource(R.drawable.circle_red);   isClick = false;   break;  case MotionEvent.ACTION_MOVE:   isClick = true;   // getRawX是觸摸位置相對于屏幕的坐標,getX是相對于按鈕的坐標   wmParams.x = (int) event.getRawX()    - mFloatView.getMeasuredWidth() / 2;   // 減25為狀態欄的高度   wmParams.y = (int) event.getRawY()    - mFloatView.getMeasuredHeight() / 2 - 75;   // 刷新   mWindowManager.updateViewLayout(mFloatLayout, wmParams);   return true;  case MotionEvent.ACTION_UP:   mFloatView.setBackgroundResource(R.drawable.circle_cyan);   return isClick;// 此處返回false則屬于移動事件,返回true則釋放事件,可以出發點擊否。  default:   break;  }  return false;  }    });      mFloatView.setOnClickListener(new OnClickListener()      {       @Override       public void onClick(View v)        {         Toast.makeText(FloatViewService.this, "一百塊都不給我!", Toast.LENGTH_SHORT).show();       }     });   }   @Override   public void onDestroy()    {     super.onDestroy();     if(mFloatLayout != null)     {       //移除懸浮窗口       mWindowManager.removeView(mFloatLayout);     }   } @Override public IBinder onBind(Intent intent) { return null; } }

懸浮窗的xml文件

alert_window_menu.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:orientation="vertical" >  <ImageButton    android:id="@+id/alert_window_imagebtn"     android:layout_width="50dp"    android:layout_height="50dp"    android:background="@drawable/float_window_menu"    android:contentDescription="@null"    /></LinearLayout>

以上內容是實現Android 全界面懸浮按鈕的全部敘述,希望大家喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲免费视频在线观看| 亚洲欧美激情四射在线日| 日韩在线视频免费观看| 98精品国产自产在线观看| 日韩视频永久免费观看| 91国产高清在线| 久久精品视频免费播放| 欧美精品少妇videofree| 26uuu亚洲伊人春色| 欧美疯狂做受xxxx高潮| 国产精品日日做人人爱| 欧美大片在线免费观看| 日韩国产一区三区| 亚洲成人av在线播放| 国产亚洲精品久久久久久777| 久久亚洲国产精品成人av秋霞| 国产免费一区二区三区在线能观看| 亚洲人成网站免费播放| 欧美一区三区三区高中清蜜桃| 欧日韩在线观看| 国产成人精品电影| 国外色69视频在线观看| 国产精品大陆在线观看| 欧美高跟鞋交xxxxxhd| 亚洲综合日韩中文字幕v在线| 波霸ol色综合久久| y97精品国产97久久久久久| 久久国产精品首页| 国产主播喷水一区二区| 国产精品久久电影观看| 亚洲欧美精品一区| 欧美激情高清视频| 日本sm极度另类视频| 日韩精品中文字幕久久臀| 欧美一级视频免费在线观看| 高清日韩电视剧大全免费播放在线观看| 日韩资源在线观看| 亚洲女同性videos| 国产精品视频免费在线观看| 亚洲自拍小视频免费观看| 欧美性猛交xxxx乱大交蜜桃| 欧美另类老肥妇| 欧美大片在线影院| 九色成人免费视频| 日韩精品免费在线播放| 在线播放日韩精品| 国产精品美女网站| 久久6免费高清热精品| 亚洲欧美精品一区| 狠狠综合久久av一区二区小说| 国产一区二区三区在线视频| 国产精品户外野外| 亚洲精品第一页| 亚洲国产一区二区三区四区| 一区二区国产精品视频| 日韩在线观看电影| 亚洲精品二三区| 亚洲精品aⅴ中文字幕乱码| 国产午夜精品理论片a级探花| 这里只有视频精品| 国产精品都在这里| 国产精品色午夜在线观看| 久久久国产精品免费| 亚洲资源在线看| 青青久久aⅴ北条麻妃| 国产精品∨欧美精品v日韩精品| 日韩中文字幕在线播放| 国精产品一区一区三区有限在线| 国产偷亚洲偷欧美偷精品| 国产精品久久久久久av福利软件| 午夜精品久久17c| 日韩h在线观看| 精品久久香蕉国产线看观看亚洲| 国产精品com| 日韩极品精品视频免费观看| 成人免费福利视频| 欧美精品xxx| 91天堂在线视频| 成人激情视频在线| 日本道色综合久久影院| 成人亚洲欧美一区二区三区| 九九热99久久久国产盗摄| 亚洲欧美另类在线观看| 欧美性jizz18性欧美| 亚洲一区二区久久久| 中文字幕一精品亚洲无线一区| 久久久久国色av免费观看性色| 亚洲国产精品嫩草影院久久| 国产成人精品最新| 亚洲欧美国产日韩天堂区| 亚洲欧美一区二区三区在线| 国产xxx69麻豆国语对白| 成人精品久久一区二区三区| 欧美成人黑人xx视频免费观看| 亚洲高清色综合| 26uuu国产精品视频| 91久久精品视频| 精品国产一区二区三区久久久狼| 国产精品扒开腿做爽爽爽的视频| 久久av中文字幕| 欧美精品18videosex性欧美| 色偷偷偷综合中文字幕;dd| 亚洲黄一区二区| 久久精品久久久久久| 97视频国产在线| yellow中文字幕久久| 国产成人jvid在线播放| 51精品在线观看| 日日摸夜夜添一区| 久久久久久久爱| 97精品一区二区三区| 亚洲精品一区二区久| 欧美日韩国产91| 国内精品视频一区| 精品在线小视频| 精品国内自产拍在线观看| 92裸体在线视频网站| 亚洲a在线观看| 亚洲直播在线一区| 91精品美女在线| 欧洲亚洲在线视频| 成人久久18免费网站图片| 成人做爰www免费看视频网站| 日韩av高清不卡| 欧洲亚洲免费在线| 欧美日韩福利视频| 成人a级免费视频| 亚洲欧洲高清在线| 国产98色在线| 96pao国产成视频永久免费| 2019中文在线观看| 国产精品一区二区性色av| 欧美日韩精品在线观看| 亚洲精品www久久久久久广东| 欧美劲爆第一页| 91精品视频播放| 欧美在线一区二区视频| 在线亚洲男人天堂| 国产精品嫩草影院一区二区| 欧美极品少妇xxxxx| 午夜精品福利视频| 亚洲欧美另类自拍| 欧美资源在线观看| 国产精品av电影| 色老头一区二区三区| 一区二区三区视频免费| 国产噜噜噜噜久久久久久久久| 国产视频在线观看一区二区| 国产精品青草久久久久福利99| 欧美中文字幕在线| 亚洲日韩中文字幕| 中文字幕亚洲无线码在线一区| 亚洲电影免费观看高清完整版| 欧美成人免费va影院高清| 亚洲图片欧美日产| 亚洲aⅴ男人的天堂在线观看| 国产精品精品久久久久久| 久久久av亚洲男天堂| 亚洲午夜av久久乱码| 中文字幕欧美日韩va免费视频| 久久久av免费| 91精品国产91久久久久| 亚洲国产精品高清久久久| 成人高清视频观看www|