亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android懸浮球及全局返回功能的實現(xiàn)示例

 更新時間:2017年04月21日 10:19:07   作者:CSU_IceLee  
這篇文章主要介紹了Android懸浮球及全局返回功能的實現(xiàn)示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下。

先來一發(fā)效果圖:

前面是返回效果,最后一下是實現(xiàn)home鍵的效果


前言

很久之前,就想做一個懸浮球了,畢竟是程序猿嘛,有想要的功能的時候總是想自己嘗試一下,于是興致勃勃的找了好久,都沒有找到全局返回功能該如何實現(xiàn)!最后也無疾而終,就在前兩天,又想到了這個功能,今天硬是花了好久,從一個同類軟件獲得了一點靈感,有一個關(guān)鍵的地方被我察覺到了,順著這個思路找了很多資料,便實現(xiàn)了全局返回功能。

思路

廢話不多說了,說說主要的思路吧,關(guān)鍵的一個類就是:AccessibilityService,官方文檔地址,這個類與手機里面的一個功能密切相關(guān):輔助功能-服務(wù)。官方文檔來看,這個功能是為了方便有障礙的人士更好的使用手機。我們這里就不展開介紹里面的API了,為了實現(xiàn)我們的全局返回功能,我們只需要使用一個函數(shù)即可:boolean performGlobalAction (int action),官方解釋如下:

Performs a global action. Such an action can be performed at any moment regardless of the current application or user location in that application. For example going back, going home, opening recents, etc.

翻譯過來就是:

執(zhí)行全局動作。無論該應(yīng)用程序中的當(dāng)前應(yīng)用程序或用戶位置如何,都可以隨時執(zhí)行此類操作。例如執(zhí)行HOME鍵,BACK鍵,任務(wù)鍵等

其中可以傳入的參數(shù)有四個:

  1. GLOBAL_ACTION_BACK
  2. GLOBAL_ACTION_HOME
  3. GLOBAL_ACTION_NOTIFICATIONS
  4. GLOBAL_ACTION_RECENTS

從字面就可以理解,我們返回功能需要的就是GLOBAL_ACTION_BACK。所以我們只需要開啟服務(wù),調(diào)用函數(shù)就可以實現(xiàn)全局返回功能了。

編寫代碼

最重要的服務(wù)類

我們要新建一個類去繼承自上面那個類:

public class MyAccessibilityService extends AccessibilityService {
 public static final int BACK = 1;
 public static final int HOME = 2;
 private static final String TAG = "ICE";

 @Override
 public void onCreate() {
 super.onCreate();
 //使用EventBus代替廣播
 EventBus.getDefault().register(this);
 }

 @Override
 public void onAccessibilityEvent(AccessibilityEvent event) { }

 @Override
 public void onInterrupt() {}

 @Subscribe
 public void onReceive(Integer action){
 switch (action){
 case BACK:
 performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK);
 break;
 case HOME:
 performGlobalAction(AccessibilityService.GLOBAL_ACTION_HOME);
 break;
 }
 }

}

上面的onReceive方法是我們使用EventBus的訂閱函數(shù),當(dāng)其他地方發(fā)送消息之后,我們這里就可以收到,然后判斷是要執(zhí)行后退還是回到桌面。

然后我們在AndroiManifest里面要注冊我們的服務(wù),但是這個注冊的比較特殊:

首先加入權(quán)限聲明:

復(fù)制代碼 代碼如下:
<uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE"/>

然后注冊服務(wù):

<service
 android:name=".MyAccessibilityService"
 android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
 <intent-filter>
 <action android:name="android.accessibilityservice.AccessibilityService"/>
 </intent-filter>
 <meta-data
 android:name="android.accessibilityservice"
 android:resource="@xml/accessibilityservice"/>
</service>

其中resource中的內(nèi)容我們要在xml包中聲明,首先新建一個xml包,如下:

然后新建一個accessibilityservice.xml文件,內(nèi)容如下:

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:description="@string/start_floatingBall"/>

<!--我這里寫的是開啟懸浮球功能-->

里面還可以設(shè)置許多屬性,在這里就不介紹了,有興趣的可以在官方文檔里面查看。

到時候description的顯示效果如下:

好了,到現(xiàn)在就已經(jīng)完成了AccessibilityService服務(wù)的創(chuàng)建與注冊了,接下來在Activity中啟動服務(wù)就可以了: startService(new Intent(this,MyAccessibilityService.class));

使用EventBus傳遞事件即可實現(xiàn)返回:EventBus.getDefault().post(MyAccessibilityService.BACK);

但是要打開服務(wù)才行,簡單辦法是直接調(diào)用Intent跳到設(shè)置界面:startActivity(new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS));

或者手動進入設(shè)置->輔助功能->服務(wù)->找到自己的app,然后開啟服務(wù)即可。(不同的系統(tǒng)可能略有差異,小米就是在無障礙里面),界面如下:


懸浮球的簡單實現(xiàn)

1.自定義一個View,畫一個懸浮球:

public class FloatingView extends View {

 public int height = 150;
 public int width = 150;
 private Paint paint;


 public FloatingView(Context context){
 super(context);
 paint = new Paint();
 }

 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
 super.onMeasure(widthMeasureSpec, heightMeasureSpec);
 setMeasuredDimension(height,width);
 }

 @Override
 protected void onDraw(Canvas canvas) {
 super.onDraw(canvas);
 //畫大圓
 paint.setStyle(Paint.Style.FILL);
 paint.setAntiAlias(true);
 paint.setColor(getResources().getColor(R.color.state_one));
 canvas.drawCircle(width/2,width/2,width/2,paint);
 //畫小圓圈
 paint.setStyle(Paint.Style.STROKE);
 paint.setColor(Color.WHITE);
 canvas.drawCircle(width/2,width/2, (float) (width*1.0/4),paint);

 }

代碼很簡單,是畫了一個大圓,然后一個小點的圓圈。

接下來,把這個view展示在桌面:

public class ViewManager {
 FloatingView floatBall;
 WindowManager windowManager;
 public static ViewManager manager;
 Context context;
 private WindowManager.LayoutParams floatBallParams;

 private ViewManager(Context context) {
 this.context = context;
 }

 public static ViewManager getInstance(Context context) {
 if (manager == null) {
 manager = new ViewManager(context);
 }
 return manager;
 }
 public void showFloatBall() {
 floatBall = new FloatingView(context);
 windowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
 if (floatBallParams == null) {
 floatBallParams = new WindowManager.LayoutParams();
 floatBallParams.width = floatBall.width;
 floatBallParams.height = floatBall.height;
 floatBallParams.gravity = Gravity.TOP | Gravity.LEFT;
 floatBallParams.type = WindowManager.LayoutParams.TYPE_TOAST;
 floatBallParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
 floatBallParams.format = PixelFormat.RGBA_8888;
 }

 windowManager.addView(floatBall, floatBallParams);

 floatBall.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
 EventBus.getDefault().post(MyAccessibilityService.BACK);
 Toast.makeText(context, "點擊了懸浮球 執(zhí)行后退操作", Toast.LENGTH_SHORT).show();
 }
 });

 floatBall.setOnLongClickListener(new View.OnLongClickListener() {
 @Override
 public boolean onLongClick(View v) {
 EventBus.getDefault().post(MyAccessibilityService.HOME);
 Toast.makeText(context, "長按了懸浮球 執(zhí)行返回桌面", Toast.LENGTH_SHORT).show();
 return false;
 }
 });

 }

 public int getScreenWidth() {
 return windowManager.getDefaultDisplay().getWidth();
 }

}

為了簡單起見,就沒有貼上拖動懸浮窗的代碼了,如有需要,可以在文章末尾查看源碼。

上面代碼把view加入到window中,并給view設(shè)置了點擊事件,以及長按事件,向AccessibilityService傳遞消息,執(zhí)行相應(yīng)的事件。

要顯示懸浮窗,要聲明權(quán)限:

復(fù)制代碼 代碼如下:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

然后手動開啟權(quán)限!不然無法顯示懸浮窗。

最后我們在Activity中開啟我們自定義的懸浮窗即可:

ViewManager.getInstance(MainActivity.this).showFloatBall();

結(jié)束語

現(xiàn)在看來,實現(xiàn)一個全局返回功能真的非常簡單,但是當(dāng)初就真的找了非常久,怎么找,怎么試都沒法實現(xiàn)這個功能,于是嘗試著去學(xué)學(xué)別的懸浮窗的代碼,但是沒辦法,加殼了,反編譯后沒法看。但是我注意到了一個細(xì)節(jié),它要我打開服務(wù)才能使用懸浮窗的功能,所以就從這里下手,慢慢找到了實現(xiàn)全局返回的方法。

源碼地址:https://github.com/CHNicelee/FloatingBall

demo下載地址:FloatingBall_jb51.rar

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Kotlin掛起函數(shù)原理示例剖析

    Kotlin掛起函數(shù)原理示例剖析

    這篇文章主要為大家介紹了Kotlin掛起函數(shù)的原理示例剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Android開發(fā)之AAR文件的生成與使用步驟

    Android開發(fā)之AAR文件的生成與使用步驟

    Android中的aar主要是針對于Android Library而言的,可以簡單的理解為是對Android Library的打包,這個包的格式為.aar,下面這篇文章主要給大家介紹了關(guān)于Android開發(fā)之AAR文件的生成與使用步驟的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • Android啟動屏實現(xiàn)左右滑動切換查看功能

    Android啟動屏實現(xiàn)左右滑動切換查看功能

    這篇文章主要介紹了Android啟動屏實現(xiàn)左右滑動切換查看功能的相關(guān)資料,針對新功能屬性介紹和啟動屏進行詳細(xì)講解,感興趣的小伙伴們可以參考一下
    2016-01-01
  • Android實現(xiàn)向Launcher添加快捷方式的方法

    Android實現(xiàn)向Launcher添加快捷方式的方法

    這篇文章主要介紹了Android實現(xiàn)向Launcher添加快捷方式的方法,涉及Android添加快捷方式的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09
  • Android編程之利用服務(wù)實現(xiàn)電話監(jiān)聽的方法

    Android編程之利用服務(wù)實現(xiàn)電話監(jiān)聽的方法

    這篇文章主要介紹了Android編程之利用服務(wù)實現(xiàn)電話監(jiān)聽的方法,較為詳細(xì)的分析了Android基于服務(wù)實現(xiàn)針對電話監(jiān)聽的具體步驟與相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2015-11-11
  • android MediaRecorder實現(xiàn)錄屏?xí)r帶錄音功能

    android MediaRecorder實現(xiàn)錄屏?xí)r帶錄音功能

    這篇文章主要介紹了android MediaRecorder錄屏?xí)r帶錄音功能實現(xiàn)代碼,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • Kotlin中協(xié)程的創(chuàng)建過程詳析

    Kotlin中協(xié)程的創(chuàng)建過程詳析

    使用協(xié)程的專業(yè)開發(fā)者中有超過 50% 的人反映使用協(xié)程提高了工作效率,下面這篇文章主要給大家介紹了關(guān)于Kotlin中協(xié)程創(chuàng)建過程的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-01-01
  • Android 應(yīng)用指定瀏覽器開發(fā)實例

    Android 應(yīng)用指定瀏覽器開發(fā)實例

    這篇文章主要介紹了Android 應(yīng)用指定瀏覽器開發(fā)實例的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • Android中圖片占用內(nèi)存的深入分析

    Android中圖片占用內(nèi)存的深入分析

    我們在日常開發(fā)中應(yīng)該經(jīng)常思考這些問題,圖片占用內(nèi)存跟哪些東西有關(guān)?跟手機有關(guān)系么?這篇文章主要給大家介紹了關(guān)于Android中圖片占用內(nèi)存的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • Android NDK開發(fā)的環(huán)境搭建與簡單示例

    Android NDK開發(fā)的環(huán)境搭建與簡單示例

    本文主要介紹Android NDK的知識,這里整理了相關(guān)資料,來說明如何搭建相應(yīng)環(huán)境和簡單實例,幫助大家理解,有興趣的小伙伴可以參考下
    2016-09-09

最新評論