国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 系統(tǒng) > Android > 正文

android 添加隨意拖動(dòng)的桌面懸浮窗口

2020-04-11 12:40:36
字體:
供稿:網(wǎng)友
用過新版本android 360手機(jī)助手都人都對 360中只在桌面顯示一個(gè)小小懸浮窗口羨慕不已吧?
其實(shí)實(shí)現(xiàn)這種功能,主要有兩步:
1.判斷當(dāng)前顯示的是為桌面。這個(gè)內(nèi)容我在前面的帖子里面已經(jīng)有過介紹,如果還沒看過的趕快穩(wěn)步看一下哦。
2.使用windowManager往最頂層添加一個(gè)View
.這個(gè)知識點(diǎn)就是為本文主要講解的內(nèi)容哦。在本文的講解中,我們還會講到下面的知識點(diǎn):
a.如果獲取到狀態(tài)欄的高度
b.懸浮窗口的拖動(dòng)
c.懸浮窗口的點(diǎn)擊事件
有開始之前,我們先來看一下效果圖:
 
接下來我們來看看FloatView的代碼:
復(fù)制代碼 代碼如下:

public class FloatView extends ImageView{
private float mTouchX;
private float mTouchY;
private float x;
private float y;
private float mStartX;
private float mStartY;
private OnClickListener mClickListener;
private WindowManager windowManager = (WindowManager) getContext()
.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
// 此windowManagerParams變量為獲取的全局變量,用以保存懸浮窗口的屬性
private WindowManager.LayoutParams windowManagerParams = ((FloatApplication) getContext()
.getApplicationContext()).getWindowParams();
public FloatView(Context context) {
super(context);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
//獲取到狀態(tài)欄的高度
Rect frame = new Rect();
getWindowVisibleDisplayFrame(frame);
int statusBarHeight = frame.top;
System.out.println("statusBarHeight:"+statusBarHeight);
// 獲取相對屏幕的坐標(biāo),即以屏幕左上角為原點(diǎn)
x = event.getRawX();
y = event.getRawY() - statusBarHeight; // statusBarHeight是系統(tǒng)狀態(tài)欄的高度
Log.i("tag", "currX" + x + "====currY" + y);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: // 捕獲手指觸摸按下動(dòng)作
// 獲取相對View的坐標(biāo),即以此View左上角為原點(diǎn)
mTouchX = event.getX();
mTouchY = event.getY();
mStartX = x;
mStartY = y;
Log.i("tag", "startX" + mTouchX + "====startY"
+ mTouchY);
break;
case MotionEvent.ACTION_MOVE: // 捕獲手指觸摸移動(dòng)動(dòng)作
updateViewPosition();
break;
case MotionEvent.ACTION_UP: // 捕獲手指觸摸離開動(dòng)作
updateViewPosition();
mTouchX = mTouchY = 0;
if ((x - mStartX) < 5 && (y - mStartY) < 5) {
if(mClickListener!=null) {
mClickListener.onClick(this);
}
}
break;
}
return true;
}
@Override
public void setOnClickListener(OnClickListener l) {
this.mClickListener = l;
}
private void updateViewPosition() {
// 更新浮動(dòng)窗口位置參數(shù)
windowManagerParams.x = (int) (x - mTouchX);
windowManagerParams.y = (int) (y - mTouchY);
windowManager.updateViewLayout(this, windowManagerParams); // 刷新顯示
}
}

代碼解釋
int statusBarHeight = frame.top;
為獲取狀態(tài)欄的高度,為什么在event.getRawY()的時(shí)候減去狀態(tài)欄的高度呢?
因?yàn)槲覀兊膽腋〈翱诓豢赡茱@示到狀態(tài)欄中去,而后getRawY為獲取到屏幕原點(diǎn)的距離。當(dāng)我們屏幕處于全屏模式時(shí),獲取到的狀態(tài)欄高度會變成0
(x - mStartX) < 5 && (y - mStartY) < 5
如果我們在觸摸過程中,移動(dòng)距離少于5 ,則視為點(diǎn)擊,觸發(fā)點(diǎn)擊的回調(diào)。
另外我們需要自定義一個(gè)application:
復(fù)制代碼 代碼如下:

public class FloatApplication extends Application {
private WindowManager.LayoutParams windowParams = new WindowManager.LayoutParams();
public WindowManager.LayoutParams getWindowParams() {
return windowParams;
}
}

代碼解釋
自定義application的目的是為了保存windowParams的值 ,因?yàn)槲覀冊谕蟿?dòng)懸浮窗口的時(shí)候,如果每次都重新new一個(gè)layoutParams的話,在update
的時(shí)候會在異常發(fā)現(xiàn)。
windowParams的值也不一定非得在自定義application里面來保存,只要是全局的都行。
最后我們再來看看Activity中的實(shí)現(xiàn)。
復(fù)制代碼 代碼如下:

public class MainActivity extends Activity implements OnClickListener{
private WindowManager windowManager = null;
private WindowManager.LayoutParams windowManagerParams = null;
private FloatView floatView = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);//取消標(biāo)題欄
getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN ,
WindowManager.LayoutParams. FLAG_FULLSCREEN);//全屏
setContentView(R.layout.activity_main);
createView();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
public void onDestroy() {
super.onDestroy();
// 在程序退出(Activity銷毀)時(shí)銷毀懸浮窗口
windowManager.removeView(floatView);
}
private void createView() {
floatView = new FloatView(getApplicationContext());
floatView.setOnClickListener(this);
floatView.setImageResource(R.drawable.ic_launcher); // 這里簡單的用自帶的icon來做演示
// 獲取WindowManager
windowManager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
// 設(shè)置LayoutParams(全局變量)相關(guān)參數(shù)
windowManagerParams = ((FloatApplication) getApplication()).getWindowParams();
windowManagerParams.type = LayoutParams.TYPE_PHONE; // 設(shè)置window type
windowManagerParams.format = PixelFormat.RGBA_8888; // 設(shè)置圖片格式,效果為背景透明
// 設(shè)置Window flag
windowManagerParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL
| LayoutParams.FLAG_NOT_FOCUSABLE;
/*
* 注意,flag的值可以為:
* LayoutParams.FLAG_NOT_TOUCH_MODAL 不影響后面的事件
* LayoutParams.FLAG_NOT_FOCUSABLE 不可聚焦
* LayoutParams.FLAG_NOT_TOUCHABLE 不可觸摸
*/
// 調(diào)整懸浮窗口至左上角,便于調(diào)整坐標(biāo)
windowManagerParams.gravity = Gravity.LEFT | Gravity.TOP;
// 以屏幕左上角為原點(diǎn),設(shè)置x、y初始值
windowManagerParams.x = 0;
windowManagerParams.y = 0;
// 設(shè)置懸浮窗口長寬數(shù)據(jù)
windowManagerParams.width = LayoutParams.WRAP_CONTENT;
windowManagerParams.height = LayoutParams.WRAP_CONTENT;
// 顯示myFloatView圖像
windowManager.addView(floatView, windowManagerParams);
}
public void onClick(View v) {
Toast.makeText(this, "Clicked", Toast.LENGTH_SHORT).show();
}
}

代碼解釋
在activity中我們主要是添加懸浮窗,并且設(shè)置他的位置。另外需要注意flags的應(yīng)用:
LayoutParams.FLAG_NOT_TOUCH_MODAL 不影響后面的事件
LayoutParams.FLAG_NOT_FOCUSABLE 不可聚焦
LayoutParams.FLAG_NOT_TOUCHABLE 不可觸摸
最后我們在onDestroy()中移除到懸浮窗口。所以,我們測試的時(shí)候,記得按Home鍵來切換到桌面。
最后千萬記得,在androidManifest.xml中來申明我們需要用到的android.permission.SYSTEM_ALERT_WINDOW權(quán)限
并且記得申明我們自定義的application哦。
AndroidManifest.xml代碼如下
復(fù)制代碼 代碼如下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.krislq.floating"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" android:name="FloatApplication">
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
久草在线资源福利| 国产叼嘿网站免费观看不用充会员| 国产高清在线观看| 国产精品久久精品牛牛影视| 精品国产美女福利到在线不卡| 2019天天操夜夜操| 亚洲精品自拍区在线观看| 精品国产一区二区三区不卡在线| 在线中文资源天堂| wwwww亚洲| 国产色在线观看| 精品推荐蜜桃传媒| 免费av不卡在线观看| 国产精品一区二区婷婷| 国产成人精品综合网站| 日本久久国产| 国产精品被窝福利一区| 欧美色第一页| 中文av资源在线| 国产中文第一页| 夜色资源网av在先锋网站观看| 国内自拍视频在线看免费观看| 国产精品jvid在线观看| 天天干天天摸| 国产精品免费视频一区一| www.99av| av亚洲男人天堂| 国产精品秘入口| 二区中文字幕| 四虎精品视频| 一本免费视频| 亚洲欧美国产另类首页| 精品卡一卡卡2卡3网站| 国产精品久久久精品a级小说| 国产鲁鲁视频在线观看特色| 热99在线观看| 天天干天天操天天爽| 18激情网站| 国产a国产a国产a| 国产成人精品自线拍| 天天操天天射天天插| 人人干人人插| 欧美日韩在线中文字幕| 欧美精品一区二区三区免费| 思思99精品视频在线观看| 9色在线视频网站| 精品国产高清a毛片无毒不卡| 国产精彩视频在线观看免费蜜芽| 国产亚av手机在线观看| 国产特黄在线| 国产精品久久久久白浆| 国产寡妇树林野战在线播放| 国产黄网站在线观看| 国产二区在线播放| 精精国产xxxx视频在线中文版 | ·天天天天操| 91网页在线观看| 亚洲天堂视频在线观看免费| 亚洲精品一区中文字幕电影| 日本a级黄色| 中文字幕第一页av| 在线亚洲电影| 免费av不卡在线观看| 大香伊人中文字幕精品| 国产免费永久在线观看| 国产精品69xx| 美女av在线播放| 国产福利三区| 免费av不卡在线观看| 国产特黄在线| 免费99热在线观看| 国产精品久久久高清免费| 轻轻色免费在线视频| 国产黄色片在线观看| 免费女人毛片视频| 国产激情自拍| 天堂在线免费视频| 碰草在线视频| 亚洲电影先锋| 国产素人视频在线观看| 久热免费在线视频| 在线欧美一级视频| 国产野外战在线播放| baoyu777.永久免费视频| √天堂8资源中文在线| 日本黄色免费网址| 在线观看av的网站| 国产成人天天5g影院| 国产特级淫片免费看| 国产美女免费观看| 久久五月精品| 开心婷婷激情| 男人天堂99| а√最新版地址在线天堂| 国产精品视频白浆合集| 国产一区二区三区四区尤物| 高潮白浆视频| 国产又色又爽又黄刺激在线视频| 牛牛热在线视频| 波多野结衣久久高清免费| 在线观看视频污| 亚洲精品国自产拍在线观看| 亚洲精品少妇久久久久久| 精品久久九九| a视频在线观看| 日韩国产成人| 黄色毛片在线看| 最近中文字幕在线中文视频| 丁香六月婷婷| 天天av综合网| 精品推荐蜜桃传媒| 欧美日韩亚洲第一页| 九九99九九精彩| 国产特级淫片免费看| 精品无吗乱吗av国产爱色| 亚洲欧美精选| 成人超碰在线| 在线三级中文| 国产女人在线观看| 国产成人天天5g影院| 轻轻色免费在线视频| 丁香视频五月| 国产不卡一卡2卡三卡4卡5卡在线| 18av在线视频| 在线观看中文字幕的网站| 久久国产热视频| 国产福利在线看| 久久99精品久久久久久野外| 国产丝袜精品丝袜| 欧美性猛交p30| 91中文字幕| 国产麻豆一区二区三区精品| 99高清免费国产自产拍| 黄色网址在线免费播放| 国产porny蝌蚪视频| 九九热视频免费观看| 精品久久久久一区二区三区| 国产你懂的在线观看| 亚洲成人在线播放| 国产麻豆高清视频在线第一页| 国产成+人+亚洲+欧美+综合| 成人免费一区二区三区牛牛| 国产偷倩在线播放| www.中文字幕久久久| 国内精品免费一区二区三区| 国产美女福利在线| 亚洲一道本在线| 国产精品入口麻豆免费看| 欧美高清视频| 四虎国产精品永久地址998| 国产高潮又爽又无遮挡又免费| 麻豆国产视频| 热99re久久精品这里都是免费| 国产99re| 中文字幕欧美日韩在线不卡| 久草.com| 国产女人在线观看| 欧美精品久久久久久久小说| 中文在线官网天堂| 国产黄色在线观看| 国产偷激情在线| 最近中文字幕mv免费高清视频8 | www.91av| 四虎精品成人a在线观看| 国产天堂素人系列在线视频| 狠狠干天天爱| 国产一区二区三区不卡在线| 日本中文字幕视频| 99热在线免费观看| 国产一二三视频| 综合激情丁香| 国产高清一区二区三区视频| 在线中文字幕第一页| 中文乱码字幕高清在线观看| 中文在线官网天堂| 在线观看中文字幕的网站| 精品176二区| 欧美视频免费一区二区三区| 久久久久久五月天久久久久久久久| 欧美日韩性视频一区二区三区| 亚洲国产精华液| 天天操天天曰| 国产精品久久久久白浆| 一区二区三区四区在线免费视频| 免费三级毛片| 91精品国产91久久久久久青草| 日本国产在线| 91在线看片| 福利在线国产| 一本大道久久精品| 99视频免费在线观看| 亚洲网站一区| 国产三级视频在线看| 亚洲视频手机在线观看| 国产乱视频在线观看播放| 国产精品入口麻豆免费看| 开心激情五月婷婷| 999在线视频| 国产日韩欧美第一页| 毛片网站在线观看|