Android 悬浮窗的实现(类似于360加速球)
生活随笔
收集整理的這篇文章主要介紹了
Android 悬浮窗的实现(类似于360加速球)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? ? ? ? ? ??創建一個Window是很簡單的事,只需要通過WindowManager即可完成。WindowManager是外界訪問Window的入口。使用WindowManager可以在其他應用最上層,甚至手機桌面最上層顯示窗口。通過(WindowManager)getApplicationContext().getSystemService(Context.WINDOW_SERVICE); 即可獲得WindowManager對象,調用的是WindowManager繼承自基類的addView方法和removeView方法來顯示和隱藏窗口。
? ? ?
? ? ? 下面是Android Window懸浮窗的一個小例子,類似于360手機桌面加速球,該加速球可以在桌面拖動,點擊后開始轉動(此時可以進行如清理垃圾的操作)。
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>
還有一點需要注意的是在6.0以上的系統中需要用戶自己打開“顯示懸浮窗”權限才能展示該應用的懸浮窗。
總結
以上是生活随笔為你收集整理的Android 悬浮窗的实现(类似于360加速球)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html中内容超出显示省略号的方法
- 下一篇: 微信 Android design 代码