游戏SDK应用内悬浮窗的实现(四)
生活随笔
收集整理的這篇文章主要介紹了
游戏SDK应用内悬浮窗的实现(四)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
游戲SDK應用內懸浮窗的實現(一)
游戲SDK應用內懸浮窗的實現(二)
游戲SDK應用內懸浮窗的實現(三)
游戲SDK應用內懸浮窗的實現(四)
繼上一篇的完成懸浮窗自動貼邊吸附功能后,本篇繼續開發讓懸浮窗自動隱藏自身的一半,啟動一個計時器,隱藏掉自生寬度一半即可。
項目依然是只需要用到兩個文件即可FloatIconView與MainActivity
在編寫代碼之前請先去掉狀態欄,這個就不用贅述了
1、MainActivity與之前一樣
import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);FloatIconView floatIconView = new FloatIconView(this);} }2、activity_float_item.xml 也是和之前一樣,(這里ImageView可以做消息提示紅點拓展等,自行拓展)
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"><ImageViewandroid:id="@+id/floaticon_btn"android:layout_width="100dp"android:layout_height="100dp"android:src="@drawable/ic_launcher" /> </RelativeLayout>3、依然是FloatIconView,新增了倒計時代碼,自動貼邊后進行倒計時,數秒后隱藏原來懸浮窗的一半。
import android.app.Activity; import android.content.Context; import android.graphics.PixelFormat; import android.os.CountDownTimer; import android.util.DisplayMetrics; import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.WindowManager; import android.widget.RelativeLayout; import android.widget.Toast;/*** Date:2022-10-18* Time:11:33* author:colin*/ public class FloatIconView extends RelativeLayout {private int millisInFuture = 3;//半隱藏懸浮球倒計時 秒private CountDownTimer countDownTimer;//倒計時 半隱藏懸浮球logo定時器private final static int LEFT = 0;private final static int RIGHT = 1;private int defPosition = RIGHT; //可變參數,隨著吸附左右改變private WindowManager.LayoutParams wmParams;private WindowManager wm;private int screenHeight;private int screenWidth;private float mTouchStartX, mTouchStartY;private float x,y;private boolean isScroll;private int dpi;private Activity activity;private View view;public FloatIconView(Activity activity) {super(activity);this.activity = activity;init(activity);initTimer();}public void init(Activity activity) {view = LayoutInflater.from(activity).inflate(R.layout.activity_float_item, this);DisplayMetrics dm = activity.getResources().getDisplayMetrics();int widthPixels = dm.widthPixels;int heightPixels = dm.heightPixels;wm = (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE);//屏寬screenWidth = wm.getDefaultDisplay().getWidth();//屏高screenHeight = wm.getDefaultDisplay().getHeight();//通過像素密度來設置按鈕的大小dpi = dpi(dm.densityDpi);wmParams = new WindowManager.LayoutParams();wmParams.type = WindowManager.LayoutParams.TYPE_APPLICATION;wmParams.format = PixelFormat.RGBA_8888;//設置背景圖片wmParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;//wmParams.gravity = Gravity.LEFT | Gravity.TOP;//wmParams.x = widthPixels; //設置位置像素wmParams.y = heightPixels;wmParams.width = 150; //設置圖片大小wmParams.height = 150;wm.addView(view, wmParams);}@Overridepublic boolean onTouchEvent(MotionEvent event) {// 獲取相對屏幕的坐標, 以屏幕左上角為原點x = event.getRawX();y = event.getRawY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:// 獲取相對View的坐標,即以此View左上角為原點mTouchStartX = event.getX();mTouchStartY = event.getY();//無論懸浮窗是否處于隱藏狀態,點擊以后讓懸浮窗顯示出來即可view.setScrollX(0);break;case MotionEvent.ACTION_MOVE:if (isScroll) {updateViewPosition();} else { // 當前不處于連續滑動狀態 則滑動小于圖標1/3則不滑動if (Math.abs(mTouchStartX - event.getX()) > dpi / 3|| Math.abs(mTouchStartY - event.getY()) > dpi / 3) {updateViewPosition();} else {break;}}isScroll = true;break;case MotionEvent.ACTION_UP:// 拖動if (isScroll) {//自動貼邊代碼增加在此處autoView();//倒計時自動半隱藏countDownTimer.start();} else {//點擊懸浮窗clickView();}isScroll = false;mTouchStartX = mTouchStartY = 0;break;}return true;}/*** 自動移動位置*/private void autoView() {// 得到view在屏幕中的位置int[] location = new int[2];getLocationOnScreen(location);//左側if (location[0] < screenWidth / 2 - getWidth() / 2) {updateViewPosition(LEFT);} else {updateViewPosition(RIGHT);}}/***更新浮動窗口位置參數*/private void updateViewPosition() {wmParams.x = (int) (x - mTouchStartX);// 不設置為全屏(狀態欄存在) 標題欄是屏幕的1/25wmParams.y = (int) (y - mTouchStartY - screenHeight / 25);wm.updateViewLayout(this, wmParams);}/*** 手指釋放更新懸浮窗位置*/private void updateViewPosition(int l) {switch (l) {case LEFT:defPosition = LEFT;//吸附后開啟倒計時,倒計時結束后縮小圖標wmParams.x = 0;break;case RIGHT:defPosition = RIGHT;int x = screenWidth - dpi ;wmParams.x = x;break;}wm.updateViewLayout(this, wmParams);}/*** 根據密度選擇控件大小*/private int dpi(int densityDpi) {if (densityDpi <= 120) {return 36;} else if (densityDpi <= 160) {return 48;} else if (densityDpi <= 240) {return 72;} else if (densityDpi <= 320) {return 96;}return 108;}private void initTimer() {countDownTimer = new CountDownTimer(millisInFuture * 1000, 1000) {@Overridepublic void onTick(long millisUntilFinished) {if (isScroll) {timeCancel();}}@Overridepublic void onFinish() {System.out.println("倒計時完成");if (!isScroll) {if (defPosition == LEFT) {view.setScrollX(view.getWidth() / 2);} else {view.setScrollX(- view.getWidth() / 2);}wm.updateViewLayout(view, wmParams);} else {timeCancel();}}};countDownTimer.start();}/*** 取消倒計時*/private void timeCancel() {countDownTimer.cancel();}//當懸浮按鈕被點擊public void clickView(){Toast.makeText(activity,"懸浮按鈕被點擊!",Toast.LENGTH_SHORT).show();} }最終效果:
好了,這是懸浮窗的第四篇開發過程,由簡單到復雜,不過總體來說也還是兩個文件,所以使用起來不算復雜。
一般游戲SDK的懸浮按鈕能夠通過拖動到指定位置完全隱藏起來,隱藏后確實找不到了,只能重新打開游戲,當然有更好的方式就是通過手機搖一搖來再次顯示懸浮窗簾。這一塊就請自行摸索一下了
接下來,就是點擊彈出用戶界面的功能,用戶界面可以切換或者注銷功能,還有設置功能。
附上最后的資源鏈接
https://download.csdn.net/download/gsrkuang/86812918
積分不夠的話可以聯系我拿285184329
總結
以上是生活随笔為你收集整理的游戏SDK应用内悬浮窗的实现(四)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#使用GDI+绘制高质量图和字体
- 下一篇: 兄弟连下载学习视频网