日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android 悬浮窗的实现(类似于360加速球)

發布時間:2023/12/10 Android 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android 悬浮窗的实现(类似于360加速球) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? ? ? ? ??創建一個Window是很簡單的事,只需要通過WindowManager即可完成。WindowManager是外界訪問Window的入口。使用WindowManager可以在其他應用最上層,甚至手機桌面最上層顯示窗口。通過(WindowManager)getApplicationContext().getSystemService(Context.WINDOW_SERVICE); 即可獲得WindowManager對象,調用的是WindowManager繼承自基類的addView方法和removeView方法來顯示和隱藏窗口。


? ? ?


? ? ? 下面是Android Window懸浮窗的一個小例子,類似于360手機桌面加速球,該加速球可以在桌面拖動,點擊后開始轉動(此時可以進行如清理垃圾的操作)。


package com.hongri.recyclerview.activity;import android.animation.Animator; import android.animation.AnimatorInflater; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.provider.Settings; import android.view.Gravity; import android.view.WindowManager; import android.widget.ImageView; import android.widget.Toast;import com.hongri.recyclerview.MyApplication; import com.hongri.recyclerview.R; import com.hongri.recyclerview.fragment.HomeFragment; import com.hongri.recyclerview.utils.Logger; import com.hongri.recyclerview.widget.FloatView;/*** @author:zhongyao * @description:主界面Activity*/ public class MainActivity extends BaseActivity {private WindowManager mWindowManager;private WindowManager.LayoutParams param;private ImageView mLayout;private Handler mHandler = new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what){case FloatView.CLICK:Logger.d("收到click,開始清理垃圾");//屬性動畫--旋轉Animator animator = AnimatorInflater.loadAnimator(MainActivity.this,R.animator.property_animator);animator.setTarget(mLayout);animator.start();break;}}};@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Logger.d("MainActivity--onCreate()");setContentView(R.layout.activity_main);/***Android6.0以上系統增加了權限管理,所以需要添加如下代碼,來讓用戶選擇打開桌面浮窗的權限*/if (Build.VERSION.SDK_INT >= 23) {if (! Settings.canDrawOverlays(MainActivity.this)) {Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,Uri.parse("package:" + getPackageName()));startActivityForResult(intent,10);}}showView();}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {if (requestCode == 10) {if (Build.VERSION.SDK_INT >= 23) {if (!Settings.canDrawOverlays(this)) {// SYSTEM_ALERT_WINDOW permission not granted...Toast.makeText(MainActivity.this, "not granted", Toast.LENGTH_SHORT);}}}}private void showView(){mLayout=new FloatView(getApplicationContext(),mHandler);mLayout.setBackgroundResource(R.drawable.sun);//獲取WindowManagermWindowManager=(WindowManager)getApplicationContext().getSystemService(Context.WINDOW_SERVICE);//設置LayoutParams(全局變量)相關參數param = ((MyApplication)getApplication()).getMywmParams();param.type=WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;// 系統提示類型,重要(These windows are always on top of application windows)param.format=1;param.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; // 表示Window不需要獲取焦點param.flags = param.flags | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;//可以監聽MotionEvent的ACTION_OUTSIDE事件param.flags = param.flags | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS; // 排版限制--即允許在可見的屏幕之外param.alpha = 1.0f;param.gravity=Gravity.LEFT|Gravity.TOP; //調整懸浮窗口至左上角//以屏幕左上角為原點,設置x、y初始值param.x=0;param.y=0;//設置懸浮窗口長寬數據param.width=140;param.height=140;//顯示myFloatView圖像mWindowManager.addView(mLayout, param);}@Overridepublic void onDestroy(){super.onDestroy();//在程序退出(Activity銷毀)時銷毀懸浮窗口mWindowManager.removeView(mLayout);} }
package com.hongri.recyclerview.widget;import android.content.Context; import android.os.Handler; import android.os.Message; import android.view.MotionEvent; import android.view.WindowManager; import android.widget.ImageView;import com.hongri.recyclerview.MyApplication; import com.hongri.recyclerview.utils.Logger;/*** 自定義桌面懸浮image,添加拖動和點擊事件*/ public class FloatView extends ImageView {private float mTouchStartX;private float mTouchStartY;private float x;private float y;private float beginX,endX,beginY,endY;private WindowManager wm=(WindowManager)getContext().getApplicationContext().getSystemService(Context.WINDOW_SERVICE);private WindowManager.LayoutParams wmParams = ((MyApplication)getContext().getApplicationContext()).getMywmParams();private Context context;private Handler mHandler;public static final int CLICK = 1;public FloatView(Context context, Handler mHandler) {super(context);this.context = context;this.mHandler = mHandler;}@Overridepublic boolean onTouchEvent(MotionEvent event) {//獲取相對屏幕的坐標,即以屏幕左上角為原點x = event.getRawX();y = event.getRawY()/*-25*/; //25是系統狀態欄的高度switch (event.getAction()) {case MotionEvent.ACTION_DOWN://獲取相對View的坐標,即以此View左上角為原點beginX = endX = mTouchStartX = event.getX();beginY = endY = mTouchStartY = event.getY();Logger.d("ACTION_DOWN");break;case MotionEvent.ACTION_MOVE:updateViewPosition();Logger.d("ACTION_MOVE");break;case MotionEvent.ACTION_UP: // updateViewPosition();Logger.d("ACTION_UP");endX = event.getX();endY = event.getY();if (endX - beginX == 0 && endY - beginY == 0){//點擊事件Logger.d("點擊事件");Message msg = Message.obtain();msg.what = CLICK;msg.obj = "點擊事件";mHandler.sendMessage(msg);}else {//發生了拖拽Logger.d("發生了拖拽");}mTouchStartX=mTouchStartY=0;break;case MotionEvent.ACTION_OUTSIDE:Logger.d("ACTION_OUTSIDE");break;}return true;}private void updateViewPosition(){//更新浮動窗口位置參數wmParams.x=(int)( x-mTouchStartX);wmParams.y=(int) (y-mTouchStartY);Logger.d("x:"+x+" y:"+y);Logger.d("mTouchStartX:"+mTouchStartX+" mTouchStartY:"+mTouchStartY);wm.updateViewLayout(this, wmParams);}}
public class MyApplication extends Application {private WindowManager.LayoutParams wmParams=new WindowManager.LayoutParams();public WindowManager.LayoutParams getMywmParams(){return wmParams;}}
res/animator文件下的property_animator.xml(屬性動畫--旋轉):

<set xmlns:android="http://schemas.android.com/apk/res/android"android:ordering="sequentially"><set android:ordering="together"><objectAnimatorandroid:duration="800"android:propertyName="rotation"android:valueFrom="0"android:valueTo="1080"android:valueType="floatType"> </objectAnimator></set></set>


最后在AndroidManifest.xml文件中記得加上如下權限:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
還有一點需要注意的是在6.0以上的系統中需要用戶自己打開“顯示懸浮窗”權限才能展示該應用的懸浮窗。

總結

以上是生活随笔為你收集整理的Android 悬浮窗的实现(类似于360加速球)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。