package jp.co.cybird.android.magicaldays;
import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Point;
import android.os.Build;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Display;
import android.view.KeyCharacterMap;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import com.opd2c.magicaldays.bs.R;
import java.lang.reflect.Method;
public class GameActivityNew implements Application.ActivityLifecycleCallbacks {
//游戏的根layout
private ViewGroup mRootLayout;
//游戏的根layout
private Activity mMainActivity;
//屏幕分辨率
private int screenWidth;
private int screenHeight;
private float mDisplayScreenAspectRatio;
private boolean mHasCheckAllScreen;
private boolean mIsAllScreenDevice;
//判断是否为游戏的主activity
private Boolean IsMainActivity(final Activity activity) {
String className = activity.getLocalClassName();
if (className.endsWith("GameActivity")){
mMainActivity = activity;
return true;
}
return false;
}
//判断是否是全面屏
private boolean IsFullScreenDevice(Activity context) {
if (mHasCheckAllScreen) {
return mIsAllScreenDevice;
}
mHasCheckAllScreen = true;
mIsAllScreenDevice = false;
// 低于 API 21的,都不会是全面屏。。。
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
return false;
}
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
if (windowManager != null) {
Display display = windowManager.getDefaultDisplay();
Point point = new Point();
display.getRealSize(point);
float width, height;
if (point.x < point.y) {
width = point.x;
height = point.y;
}
else{
width = point.y;
height = point.x;
}
if (height / width >= 1.97f) {
mIsAllScreenDevice = true;
}
}
Log.d("GameActivityNew","mIsAllScreenDevice:" + mIsAllScreenDevice);
return mIsAllScreenDevice;
}
//隐藏下方手机的导航栏
private void HideNavigationBar(Activity activity){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WindowManager.LayoutParams params =activity.getWindow().getAttributes();
params.systemUiVisibility = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_FULLSCREEN;
activity.getWindow().setAttributes(params);
}
}
//允许应用显示全面屏
private void AllowFullScreenDisplay(Activity activity){
// 隐藏标题
activity.requestWindowFeature(Window.FEATURE_NO_TITLE);
Window window = activity.getWindow();
// 如果需要设置全屏
window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN);
Log.d("GameActivityNew","JELLY_BEAN");
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
WindowManager.LayoutParams lp = window.getAttributes();
/**
* 官方Android 9 支持最新的全面屏, https://developer.android.com/about/versions/pie/android-9.0
* LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT 仅仅当系统提供的bar完全包含了刘海区时,才允许window扩展到刘海区,否则window不会和刘海区重叠
* LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES 允许window扩展到刘海区
* LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER 不允许window扩展到刘海区
*/
lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
window.setAttributes(lp);
Log.d("GameActivityNew","P");
}
}
//获取是否存在NavigationBar--导航栏
public boolean checkDeviceHasNavigationBar(Context context) {
boolean hasNavigationBar = false;
Resources rs = context.getResources();
int id = rs.getIdentifier("config_showNavigationBar", "bool", "android");
if (id > 0) {
hasNavigationBar = rs.getBoolean(id);
}
try {
Class systemPropertiesClass = Class.forName("android.os.SystemProperties");
Method m = systemPropertiesClass.getMethod("get", String.class);
String navBarOverride = (String) m.invoke(systemPropertiesClass, "qemu.hw.mainkeys");
if ("1".equals(navBarOverride)) {
hasNavigationBar = false;
} else if ("0".equals(navBarOverride)) {
hasNavigationBar = true;
}
} catch (Exception e) {
}
return hasNavigationBar;
}
//获取NavigationBar高度
public int getVirtualBarHeigh(Context context) {
int vh = 0;
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = windowManager.getDefaultDisplay();
DisplayMetrics dm = new DisplayMetrics();
try {
@SuppressWarnings("rawtypes")
Class c = Class.forName("android.view.Display");
@SuppressWarnings("unchecked")
Method method = c.getMethod("getRealMetrics", DisplayMetrics.class);
method.invoke(display, dm);
vh = dm.heightPixels - windowManager.getDefaultDisplay().getHeight();
} catch (Exception e) {
e.printStackTrace();
}
return vh;
}
//region 用于判断手机是否显示NavigationBar,只要主layout布局发生变化就会检测到
private boolean mLayoutComplete;// 用于判断布局是否初始化完成
private int mRootlayoutHeight =0;// 用于记录上一次屏幕的高度
private float mMagicalDaysCanvasAspectRatio = (float)1280/(float)720;
private int mAdaptationIconHeight = 250;
private void onNavigationBarStatusChanged() {
mRootLayout.post(new Runnable() {
@Override
public void run() {
// 布局完成
mLayoutComplete =true;
}
});
mRootLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (!mLayoutComplete) {
return;
}
onNavigationBarStatusChanged(mRootLayout);
}
});
}
public void onNavigationBarStatusChanged(ViewGroup rootlayout) {
int _rh = rootlayout.getHeight();// 当前屏幕高度
if (mRootlayoutHeight ==0) {
mRootlayoutHeight = _rh;// 记录首次变化的屏幕高度
Log.d("GameActivityNew","mRootlayoutHeight first changed," + mRootlayoutHeight);
//底部图片
AddViewToMainLayout("base5",screenHeight - (int)mDisplayScreenAspectRatio, 0, mRootLayout, mMainActivity);
}
// 如果为true,则说明NavigationBar显示或者隐藏
if (mRootlayoutHeight != _rh){
mRootlayoutHeight = _rh;// 将当前高度重新赋值为最新临时变量
Log.d("GameActivityNew","mRootlayoutHeight has changed," + mRootlayoutHeight);
//先删除底部图片,再重新绘制底图片,因为这个时候NavigationBar显示导致适配高度变化
RemoveBottomImgView();
AddViewToMainLayout("base5",screenHeight - (int)mDisplayScreenAspectRatio, 0, mRootLayout, mMainActivity);
}
}
//endregion
//添加view到主layout中
public void AddViewToMainLayout(String resName,int topMargins,int bottomMargins, ViewGroup mRootLayout, Activity activity){
ImageView img = new ImageView(activity);
//设置图片的长宽
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(screenWidth, 250);
img.setLayoutParams(layoutParams);
//设置图片的icon
AssetManager assetManager=activity.getAssets();
try {
InputStream in=assetManager.open("AdaptationIcon/"+ resName +".png");
Bitmap bmp=BitmapFactory.decodeStream(in);
img.setImageBitmap(bmp);
} catch (Exception e) {
// TODO: handle exception
Log.d("GameActivityNew","setImageBitmap Exception:"+e);
}
//创建MarginLayoutParams,参数就填imgView的LayoutParams就行(设置图片的偏移坐标)
ViewGroup.MarginLayoutParams margin = new ViewGroup.MarginLayoutParams(img.getLayoutParams());
/*
* 给这个MarginLayoutParams添加偏移参数 四个参数(一般只需要顶部和左边就能确定View的位置,后两个参数添0即可):
* left:第一个参数,是View距离屏幕左边的距离
* top:第二个参数,是Veiw距离屏幕顶部的距离
* right:第三个参数,是View距离屏幕右边的距离
* bottom: 第三个参数,是View距离屏幕底部的距离
* */
margin.setMargins(0, topMargins, 0, 0);
RelativeLayout.LayoutParams layoutParams3 = new RelativeLayout.LayoutParams(margin);
img.setLayoutParams(layoutParams3);
mRootLayout.addView(img);
}
//删除主layout中的适配底部填充viewImage
public void RemoveBottomImgView(){
mRootLayout.removeViewAt(2);
Log.d("GameActivityNew","RemoveBottomImgView");
}
@Override
public void onActivityCreated(final Activity activity, Bundle bundle) {
if (IsMainActivity(activity)) {
//必须放在这个,保证在最前面的activity中就隐藏掉导航栏,否则在下面的主activity中获取导航栏高度会有问题
HideNavigationBar(activity);
//判断设备是否是全面屏设备
if(IsFullScreenDevice(activity)){
//获取手机屏幕宽高
WindowManager wm = (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE);
Point point = new Point();
if (wm != null) {
wm.getDefaultDisplay().getRealSize(point);
screenWidth = point.x;
screenHeight = point.y;
Log.d("GameActivityNew", point.x + ":" + point.y);
}
//算出全面屏单边超出游戏画布的尺寸
mDisplayScreenAspectRatio = (screenHeight - mMagicalDaysCanvasAspectRatio*screenWidth)/2;
Log.d("GameActivityNew", "widthPixels=" + screenWidth);
Log.d("GameActivityNew", "heightPixels=" + screenHeight);
Log.d("GameActivityNew", "mDisplayScreenAspectRatio=" + mDisplayScreenAspectRatio);
//获取游戏主activity的根layout对象,方便在游戏在屏幕上下方绘制图片,做全面屏适配
mRootLayout = (ViewGroup)activity.getWindow().getDecorView();
//允许应用全屏显示(不加此代码,应用不会全屏显示)
AllowFullScreenDisplay(activity);
//用于判断手机是否显示NavigationBar,只要主layout显示高度发生变化就能检测到
onNavigationBarStatusChanged();
//顶部图片
AddViewToMainLayout("base4", (int)mDisplayScreenAspectRatio - mAdaptationIconHeight,0, mRootLayout, activity);
}
SdkJniHelper.init(null);
//talkingdataSdk xuhua
TalkingdataSdk.Init(activity);
SdkJniHelper.onSetClassLoaderFrom(activity);
SDKCore.getInstance().init(activity, getSDKConfigData());
SDKCore.getInstance().setSDKListener(new ISDKListener() {
@SuppressLint("ShowToast")
@Override
public void onResult(int arg0, String msg) {
Toast.makeText(SDKCore.getInstance().getContext(), msg, Toast.LENGTH_SHORT);
}
@SuppressLint("ShowToast")
@Override
public void onLogout() {
curLoginResult = null;
}
@SuppressLint("ShowToast")
@Override
public void onRestartGame(final String title) {
SDKCore.getInstance().runOnMainThread(new Runnable() {
@Override
public void run() {
new AlertDialog.Builder(SDKCore.getInstance().getContext())
.setMessage(title)
.setNeutralButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
Activity main = SDKCore.getInstance().getContext();
Intent restartIntent = new Intent(main, SplashActivity.class);
int pendingId = 1;
PendingIntent pendingIntent = PendingIntent.getActivity(main, pendingId, restartIntent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager mgr = (AlarmManager) main.getSystemService(Context.ALARM_SERVICE);
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 2000, pendingIntent);
android.os.Process.killProcess(android.os.Process.myPid());
}
})
.setCancelable(false).create().show();
}
});
}
@SuppressLint("ShowToast")
@Override
public void onLoginResult(LoginResult loginResult) {
// Toast.makeText(MainActivity.this, "登录成功,sid:" + loginResult.getAccessId(), Toast.LENGTH_SHORT);
isLogin = true;
if (curLoginResult != null && !curLoginResult.getAccessId().equals(loginResult.getAccessId())) {
onRepeatLogin();
} else {
curLoginResult = loginResult;
if (BuildConfig.MODULE_TYPE.equals("unity"))
SdkJniHelper.onLoginToUnity(BuildConfig.MSG_RECEIVER_NAME, loginResult);
else
SdkJniHelper.onLoginToCocos(loginResult);
}
// curLoginResult = loginResult;
// if (!SdkJniHelper.onLoginToCocos(loginResult)) {
// onRepeatLogin();
// }
}
@SuppressLint("ShowToast")
@Override
public void onGoToTitle()
{
SdkJniHelper.gameGoToTitle();
}
@SuppressLint("ShowToast")
@Override
public void onLoginResultNoCheck(LoginResult loginResult) {
// Toast.makeText(MainActivity.this, "登录成功,sid:" + loginResult.getAccessId(), Toast.LENGTH_SHORT);
isLogin = true;
curLoginResult = loginResult;
if (BuildConfig.MODULE_TYPE.equals("unity"))
SdkJniHelper.onLoginToUnity(BuildConfig.MSG_RECEIVER_NAME, loginResult);
else
SdkJniHelper.onLoginToCocos(loginResult);
}
@SuppressLint("ShowToast")
@Override
public void onSwithAccountResult(LoginResult loginResult) {
// Toast.makeText(MainActivity.this, "登录成功,sid:" + loginResult.getAccessId(), Toast.LENGTH_SHORT);
if (curLoginResult != null && !curLoginResult.getAccessId().equals(loginResult.getAccessId())) {
onRepeatLogin();
} else {
curLoginResult = loginResult;
if (BuildConfig.MODULE_TYPE.equals("unity"))
SdkJniHelper.onLoginToUnity(BuildConfig.MSG_RECEIVER_NAME, loginResult);
else
SdkJniHelper.onLoginToCocos(loginResult);
}
// if (isLogin) {
// onRepeatLogin();
// }
}
@SuppressLint("ShowToast")
@Override
public void onPayResult(PayResult payResult) {
// Toast.makeText(MainActivity.this, "登录成功,sid:" + loginResult.getAccessId(), Toast.LENGTH_SHORT);
if (BuildConfig.MODULE_TYPE.equals("unity"))
SdkJniHelper.onPayToUnity(BuildConfig.MSG_RECEIVER_NAME, payResult);
else
SdkJniHelper.onPayToCocos(payResult);
}
@SuppressLint("ShowToast")
@Override
public void onQuerySkuCurrencyResult(String var1) {
}
});
}
}
@Override
public void onActivityStarted(Activity activity){
Log.d("GameActivityNew", "onActivityStarted");
}
@Override
public void onActivityResumed(Activity activity){
Log.d("GameActivityNew", "onActivityResumed");
}
@Override
public void onActivityPaused(Activity activity){
Log.d("GameActivityNew", "onActivityPaused");
}
@Override
public void onActivityStopped(Activity activity){
Log.d("GameActivityNew", "onActivityStopped");
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState){
Log.d("GameActivityNew", "onActivitySaveInstanceState");
}
@Override
public void onActivityDestroyed(Activity activity){
Log.d("GameActivityNew", "onActivityDestroyed");
}
}
android手机全面屏适配
猜你喜欢
转载自blog.csdn.net/qq_41165567/article/details/108128581
今日推荐
周排行