游戏SDK应用内悬浮窗的实现(一)
注意:这是app应用内的悬浮窗,并非是应用外的。应用内的悬浮窗不需要添加权限的。
考虑到大多数游戏都是只有一个Activity,在游戏的Activity上添加一个可移动的ImageView即可,所以考虑的方案应该选用应用内弹窗。
最近在开发游戏SDK的悬浮窗,顺便记录下开发悬浮窗的过程,也在git上面找过很多的悬浮窗的例子,都是非常有用的。但是开发过程中难免遇到很多坑,所以为了避开这些麻烦, 把遇到的坑记录下来,集思广益。
首先从简单悬浮窗代码入手,仅需两个代码文件
1、创建一个FloatIconView,继承于RelativeLayout
package com.colin.gamefloatview;
import android.app.Activity;
import android.content.Context;
import android.graphics.PixelFormat;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.widget.RelativeLayout;
/**
* Date:2022-10-18
* Time:11:33
* author:colin
*/
public class FloatIconView extends RelativeLayout {
public FloatIconView(Activity activity){
super(activity);
init(activity);
}
public void init(Activity activity){
View view = LayoutInflater.from(activity).inflate(R.layout.activity_float_item, this);
DisplayMetrics dm = activity.getResources().getDisplayMetrics();
int widthPixels = dm.widthPixels;
int heightPixels = dm.heightPixels;
WindowManager wm = (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE);
//屏宽
int screenWidth = wm.getDefaultDisplay().getWidth();
//屏高
int screenHeight = wm.getDefaultDisplay().getHeight();
WindowManager.LayoutParams 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);
}
}
2、activity_float_item.xml
<?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">
<ImageView
android:id="@+id/floaticon_btn"
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@drawable/ic_launcher" />
</RelativeLayout>
3、MainActivity的使用
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FloatIconView floatIconView = new FloatIconView(this);
}
}
运行结果:
能看到右下角已经弹出了一个悬浮按钮了。 接下来就是实现悬浮窗的拖动,以及悬浮窗自动贴边的操作 游戏SDK应用内悬浮窗的实现(二)