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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

游戏SDK应用内悬浮窗的实现(四)

發(fā)布時間:2024/3/26 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 游戏SDK应用内悬浮窗的实现(四) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

游戲SDK應(yīng)用內(nèi)懸浮窗的實(shí)現(xiàn)(一)
游戲SDK應(yīng)用內(nèi)懸浮窗的實(shí)現(xiàn)(二)
游戲SDK應(yīng)用內(nèi)懸浮窗的實(shí)現(xiàn)(三)
游戲SDK應(yīng)用內(nèi)懸浮窗的實(shí)現(xiàn)(四)

繼上一篇的完成懸浮窗自動貼邊吸附功能后,本篇繼續(xù)開發(fā)讓懸浮窗自動隱藏自身的一半,啟動一個計時器,隱藏掉自生寬度一半即可。

項目依然是只需要用到兩個文件即可FloatIconView與MainActivity


在編寫代碼之前請先去掉狀態(tài)欄,這個就不用贅述了

<activityandroid:name=".MainActivity"android:theme="@style/Theme.AppCompat.Light.NoActionBar"
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可以做消息提示紅點(diǎn)拓展等,自行拓展)
<?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,新增了倒計時代碼,自動貼邊后進(jìn)行倒計時,數(shù)秒后隱藏原來懸浮窗的一半。
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; //可變參數(shù),隨著吸附左右改變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();//通過像素密度來設(shè)置按鈕的大小dpi = dpi(dm.densityDpi);wmParams = new WindowManager.LayoutParams();wmParams.type = WindowManager.LayoutParams.TYPE_APPLICATION;wmParams.format = PixelFormat.RGBA_8888;//設(shè)置背景圖片wmParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;//wmParams.gravity = Gravity.LEFT | Gravity.TOP;//wmParams.x = widthPixels; //設(shè)置位置像素wmParams.y = heightPixels;wmParams.width = 150; //設(shè)置圖片大小wmParams.height = 150;wm.addView(view, wmParams);}@Overridepublic boolean onTouchEvent(MotionEvent event) {// 獲取相對屏幕的坐標(biāo), 以屏幕左上角為原點(diǎn)x = event.getRawX();y = event.getRawY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:// 獲取相對View的坐標(biāo),即以此View左上角為原點(diǎn)mTouchStartX = event.getX();mTouchStartY = event.getY();//無論懸浮窗是否處于隱藏狀態(tài),點(diǎn)擊以后讓懸浮窗顯示出來即可view.setScrollX(0);break;case MotionEvent.ACTION_MOVE:if (isScroll) {updateViewPosition();} else { // 當(dāng)前不處于連續(xù)滑動狀態(tài) 則滑動小于圖標(biāo)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 {//點(diǎn)擊懸浮窗clickView();}isScroll = false;mTouchStartX = mTouchStartY = 0;break;}return true;}/*** 自動移動位置*/private void autoView() {// 得到view在屏幕中的位置int[] location = new int[2];getLocationOnScreen(location);//左側(cè)if (location[0] < screenWidth / 2 - getWidth() / 2) {updateViewPosition(LEFT);} else {updateViewPosition(RIGHT);}}/***更新浮動窗口位置參數(shù)*/private void updateViewPosition() {wmParams.x = (int) (x - mTouchStartX);// 不設(shè)置為全屏(狀態(tài)欄存在) 標(biāo)題欄是屏幕的1/25wmParams.y = (int) (y - mTouchStartY - screenHeight / 25);wm.updateViewLayout(this, wmParams);}/*** 手指釋放更新懸浮窗位置*/private void updateViewPosition(int l) {switch (l) {case LEFT:defPosition = LEFT;//吸附后開啟倒計時,倒計時結(jié)束后縮小圖標(biāo)wmParams.x = 0;break;case RIGHT:defPosition = RIGHT;int x = screenWidth - dpi ;wmParams.x = x;break;}wm.updateViewLayout(this, wmParams);}/*** 根據(jù)密度選擇控件大小*/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();}//當(dāng)懸浮按鈕被點(diǎn)擊public void clickView(){Toast.makeText(activity,"懸浮按鈕被點(diǎn)擊!",Toast.LENGTH_SHORT).show();} }
最終效果:


好了,這是懸浮窗的第四篇開發(fā)過程,由簡單到復(fù)雜,不過總體來說也還是兩個文件,所以使用起來不算復(fù)雜。

一般游戲SDK的懸浮按鈕能夠通過拖動到指定位置完全隱藏起來,隱藏后確實(shí)找不到了,只能重新打開游戲,當(dāng)然有更好的方式就是通過手機(jī)搖一搖來再次顯示懸浮窗簾。這一塊就請自行摸索一下了

接下來,就是點(diǎn)擊彈出用戶界面的功能,用戶界面可以切換或者注銷功能,還有設(shè)置功能。

附上最后的資源鏈接
https://download.csdn.net/download/gsrkuang/86812918
積分不夠的話可以聯(lián)系我拿285184329

總結(jié)

以上是生活随笔為你收集整理的游戏SDK应用内悬浮窗的实现(四)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。