Commit 88049212 authored by fallenstardust's avatar fallenstardust

精准点击事件

parent 9b5de90a
......@@ -749,9 +749,9 @@ void toggleGlobalIME(ANDROID_APP app, bool pShow) {
app->activity->vm->DetachCurrentThread();
}
core::position2di initJavaBridge(ANDROID_APP app, void* handle) {
void initJavaBridge(ANDROID_APP app, void* handle) {
if (!app || !app->activity || !app->activity->vm)
return core::position2di(0, 0);
return;
JNIEnv* jni = nullptr;
app->activity->vm->AttachCurrentThread(&jni, NULL);
jobject lNativeActivity = app->activity->clazz;
......@@ -760,18 +760,9 @@ core::position2di initJavaBridge(ANDROID_APP app, void* handle) {
"setNativeHandle", "(J)V");
jlong code = (jlong) handle;
jni->CallVoidMethod(lNativeActivity, MethodSetHandle, code);
jmethodID methodX = jni->GetMethodID(ClassNativeActivity,
"getPositionX", "()I");
jint posX = jni->CallIntMethod(lNativeActivity, methodX);
jmethodID methodY = jni->GetMethodID(ClassNativeActivity,
"getPositionY", "()I");
jint posY = jni->CallIntMethod(lNativeActivity, methodY);
jni->DeleteLocalRef(ClassNativeActivity);
app->activity->vm->DetachCurrentThread();
__android_log_print(ANDROID_LOG_INFO, "ygo", "Android command initJavaBridge posX=%d, posY=%d", posX, posY);
return core::position2di((int)posX, (int)posY);
__android_log_print(ANDROID_LOG_INFO, "ygo", "Android command initJavaBridge");
}
InitOptions* getInitOptions(ANDROID_APP app) {
......@@ -807,7 +798,7 @@ int getLocalAddr(ANDROID_APP app) {
return addr;
}
void OnShareFile(ANDROID_APP app, const char* title, const char* ext){
void OnShareFile(ANDROID_APP app, const char* _type, const char* name){
if (!app || !app->activity || !app->activity->vm)
return;
JNIEnv* jni = nullptr;
......@@ -817,8 +808,8 @@ void OnShareFile(ANDROID_APP app, const char* title, const char* ext){
jobject lNativeActivity = app->activity->clazz;
jclass ClassNativeActivity = jni->GetObjectClass(lNativeActivity);
jmethodID methodId = jni->GetMethodID(ClassNativeActivity, "shareFile", "(Ljava/lang/String;Ljava/lang/String;)V");
jstring s_title = jni->NewStringUTF(title);
jstring s_ext = jni->NewStringUTF(ext);
jstring s_title = jni->NewStringUTF(_type);
jstring s_ext = jni->NewStringUTF(name);
jni->CallVoidMethod(lNativeActivity, methodId, s_title, s_ext);
if (s_title) {
//不需要用ReleaseStringUTFChars,因为是c变量,函数外面自己释放
......@@ -869,30 +860,6 @@ void toggleOverlayView(ANDROID_APP app, bool pShow) {
app->activity->vm->DetachCurrentThread();
}
void process_input(ANDROID_APP app,
struct android_poll_source* source) {
AInputEvent* event = NULL;
if (AInputQueue_getEvent(app->inputQueue, &event) >= 0) {
int type = AInputEvent_getType(event);
bool skip_predispatch = AInputEvent_getType(event)
== AINPUT_EVENT_TYPE_KEY
&& AKeyEvent_getKeyCode(event) == AKEYCODE_BACK;
// skip predispatch (all it does is send to the IME)
if (!skip_predispatch
&& AInputQueue_preDispatchEvent(app->inputQueue, event)) {
return;
}
int32_t handled = 0;
if (app->onInputEvent != NULL)
handled = app->onInputEvent(app, event);
AInputQueue_finishEvent(app->inputQueue, event, handled);
} else {
// LOGE("Failure reading next input event: %s\n", strerror(errno));
}
}
void onGameExit(ANDROID_APP app){
if (!app || !app->activity || !app->activity->vm)
return;
......
......@@ -6,24 +6,20 @@
*/
package cn.garymb.ygomobile;
import android.app.NativeActivity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.res.Resources;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.PowerManager;
import android.os.Process;
import android.util.Log;
import android.util.Size;
import android.view.Gravity;
import android.view.HapticFeedbackConstants;
import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.widget.Toast;
......@@ -33,6 +29,7 @@ import java.util.Arrays;
import cn.garymb.ygodata.YGOGameOptions;
import cn.garymb.ygomobile.controller.NetworkController;
import cn.garymb.ygomobile.core.GameActivity;
import cn.garymb.ygomobile.core.IrrlichtBridge;
import cn.garymb.ygomobile.lib.R;
import cn.garymb.ygomobile.utils.FullScreenUtils;
......@@ -47,7 +44,7 @@ import static cn.garymb.ygomobile.core.IrrlichtBridge.ACTION_SHARE_FILE;
/**
* @author mabin
*/
public class YGOMobileActivity extends NativeActivity implements
public class YGOMobileActivity extends GameActivity implements
IrrlichtBridge.IrrlichtHost,
View.OnClickListener,
PopupWindow.OnDismissListener,
......@@ -59,13 +56,11 @@ public class YGOMobileActivity extends NativeActivity implements
private static final int CHAIN_CONTROL_PANEL_Y_REVERT_POSITION = 100;
private static final int MAX_REFRESH = 30 * 1000;
protected final int windowsFlags =
Build.VERSION.SDK_INT >= 19 ? (
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) :
View.SYSTEM_UI_FLAG_LOW_PROFILE;
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
protected View mContentView;
protected ComboBoxCompat mGlobalComboBox;
protected EditWindowCompat mGlobalEditText;
......@@ -75,20 +70,14 @@ public class YGOMobileActivity extends NativeActivity implements
private NetworkController mNetController;
private volatile boolean mOverlayShowRequest = false;
private volatile int mCompatGUIMode;
private static int sChainControlXPostion = -1;
private static int sChainControlYPostion = -1;
// private static int sChainControlXPostion = -1;
// private static int sChainControlYPostion = -1;
private GameApplication mApp;
private Handler handler = new Handler();
private FullScreenUtils mFullScreenUtils;
private volatile int mPositionX, mPositionY;
private FrameLayout mLayout;
private SurfaceView mSurfaceView;
private boolean replaced = false;
private static boolean USE_SURFACE = true;
private String[] mArgV;
private boolean onGameExiting;
// public static int notchHeight;
private GameApplication app() {
if (mApp == null) {
......@@ -105,23 +94,22 @@ public class YGOMobileActivity extends NativeActivity implements
return mApp;
}
@SuppressWarnings("WrongConstant")
@Override
protected void onCreate(Bundle savedInstanceState) {
if (USE_SURFACE) {
mSurfaceView = new SurfaceView(this);
}
protected void initBeforeOnCreate() {
mFullScreenUtils = new FullScreenUtils(this, app().isImmerSiveMode());
mFullScreenUtils.fullscreen();
mFullScreenUtils.onCreate();
//argv
mArgV = IrrlichtBridge.getArgs(getIntent());
//
super.onCreate(savedInstanceState);
Log.e("YGOStarter", "跳转完成" + System.currentTimeMillis());
if (sChainControlXPostion < 0) {
initPostion();
}
@Override
protected void initAfterOnCreate() {
Log.e("YGOStarter", "跳转完成" + System.currentTimeMillis());
// if (sChainControlXPostion < 0) {
// initPostion();
// }
if (app().isLockSreenOrientation()) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
......@@ -168,14 +156,14 @@ public class YGOMobileActivity extends NativeActivity implements
}
private void initPostion() {
final Resources res = getResources();
sChainControlXPostion = (int) (CHAIN_CONTROL_PANEL_X_POSITION_LEFT_EDGE * app()
.getXScale());
sChainControlYPostion = (int) (app().getSmallerSize()
- CHAIN_CONTROL_PANEL_Y_REVERT_POSITION
* app().getYScale() - (res
.getDimensionPixelSize(R.dimen.chain_control_button_height) * 2 + res
.getDimensionPixelSize(R.dimen.chain_control_margin)));
// final Resources res = getResources();
// sChainControlXPostion = (int) (CHAIN_CONTROL_PANEL_X_POSITION_LEFT_EDGE * app()
// .getXScale());
// sChainControlYPostion = (int) (app().getSmallerSize()
// - CHAIN_CONTROL_PANEL_Y_REVERT_POSITION
// * app().getYScale() - (res
// .getDimensionPixelSize(R.dimen.chain_control_button_height) * 2 + res
// .getDimensionPixelSize(R.dimen.chain_control_margin)));
}
@Override
......@@ -184,11 +172,6 @@ public class YGOMobileActivity extends NativeActivity implements
handleExternalCommand(intent);
}
@Override
protected void onDestroy() {
super.onDestroy();
}
private void handleExternalCommand(Intent intent) {
YGOGameOptions options = intent
.getParcelableExtra(YGOGameOptions.YGO_GAME_OPTIONS_BUNDLE_KEY);
......@@ -210,85 +193,47 @@ public class YGOMobileActivity extends NativeActivity implements
}
private void fullscreen() {
//如果是沉浸模式
if (app().isImmerSiveMode()) {
mFullScreenUtils.fullscreen();
app().attachGame(this);
if (USE_SURFACE) {
changeGameSize();
}
}
}
private int[] getGameSize() {
@Override
protected Size getGameWindowSize() {
//调整padding
float xScale = app().getXScale();
float yScale = app().getYScale();
float sw = app().getScreenWidth();
float sh = app().getScreenHeight();
int w = (int) (app().getGameWidth() * xScale);
int h = (int) (app().getGameHeight() * yScale);
Log.i("kk", "w1=" + app().getGameWidth() + ",h1=" + app().getGameHeight() + ",w2=" + w + ",h2=" + h + ",xScale=" + xScale + ",yScale=" + yScale);
return new int[]{w, h};
}
@Override
public int getPositionX() {
synchronized (this) {
return mPositionX;
}
}
@Override
public int getPositionY() {
synchronized (this) {
return mPositionY;
}
Log.i(IrrlichtBridge.TAG, "game size=" + app().getGameWidth() + "x" + app().getGameHeight()
+ ", surface=" + w + "x" + h
+ ", screen=" + sw + "x" + sh
+ ", xScale=" + xScale + ",yScale=" + yScale);
return new Size(w, h);
}
@Override
public void setContentView(View view) {
int[] size = getGameSize();
int w = size[0];
int h = size[1];
mLayout = new FrameLayout(this);
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(w, h);
lp.gravity = Gravity.CENTER;
if (USE_SURFACE) {
mLayout.addView(mSurfaceView, lp);
mLayout.addView(view, lp);
super.setContentView(mLayout);
super.setContentView(view);
app().attachGame(this);
changeGameSize();
getWindow().takeSurface(null);
replaced = true;
mSurfaceView.getHolder().addCallback(this);
mSurfaceView.requestFocus();
getWindow().setGravity(Gravity.CENTER);
} else {
mLayout.addView(view, lp);
getWindow().setGravity(Gravity.CENTER);
super.setContentView(mLayout);
}
}
private void changeGameSize() {
//游戏大小
int[] size = getGameSize();
int w = (int) app().getScreenHeight();
int h = (int) app().getScreenWidth();
int spX = (int) ((w - size[0]) / 2.0f);
int spY = (int) ((h - size[1]) / 2.0f);
boolean update = false;
synchronized (this) {
if (spX != mPositionX || spY != mPositionY) {
mPositionX = spX;
mPositionY = spY;
update = true;
}
}
if (update) {
IrrlichtBridge.setInputFix(mPositionX, mPositionY);
}
//可以通过mLayout.addView添加view,增加功能
//test code
// int size = (int) (getResources().getDisplayMetrics().density * 100);
// FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(size, size);
// lp.gravity = Gravity.RIGHT|Gravity.BOTTOM;
// ImageView imageView = new ImageView(this);
// imageView.setImageResource(android.R.drawable.sym_def_app_icon);
// imageView.setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View v) {
// refreshTextures();
// }
// });
// mLayout.addView(imageView, lp);
}
private void initExtraView() {
......@@ -382,7 +327,7 @@ public class YGOMobileActivity extends NativeActivity implements
@Override
public void toggleOverlayView(final boolean isShow) {
if (mOverlayShowRequest != isShow) {
handler.post(new Runnable() {
runOnUiThread(new Runnable() {
@Override
public void run() {
mOverlayShowRequest = isShow;
......@@ -409,7 +354,7 @@ public class YGOMobileActivity extends NativeActivity implements
@Override
public void toggleIME(final String hint, final boolean isShow) {
handler.post(new Runnable() {
runOnUiThread(new Runnable() {
@Override
public void run() {
if (isShow) {
......@@ -429,7 +374,7 @@ public class YGOMobileActivity extends NativeActivity implements
@Override
public void showComboBoxCompat(final String[] items, final boolean isShow, final int mode) {
handler.post(new Runnable() {
runOnUiThread(new Runnable() {
@Override
public void run() {
mCompatGUIMode = mode;
......@@ -446,7 +391,7 @@ public class YGOMobileActivity extends NativeActivity implements
@Override
public void performHapticFeedback() {
handler.post(new Runnable() {
runOnUiThread(new Runnable() {
@Override
public void run() {
mContentView.performHapticFeedback(
......@@ -471,46 +416,6 @@ public class YGOMobileActivity extends NativeActivity implements
IrrlichtBridge.sNativeHandle = nativeHandle;
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
if (USE_SURFACE) {
if (!replaced) {
return;
}
}
super.surfaceCreated(holder);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
if (USE_SURFACE) {
if (!replaced) {
return;
}
}
super.surfaceChanged(holder, format, width, height);
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (USE_SURFACE) {
if (!replaced) {
return;
}
}
super.surfaceDestroyed(holder);
}
@Override
public void surfaceRedrawNeeded(SurfaceHolder holder) {
if (USE_SURFACE) {
if (!replaced) {
return;
}
}
super.surfaceRedrawNeeded(holder);
}
@Override
public void shareFile(final String type, final String name) {
//TODO 分享文件
......@@ -532,9 +437,38 @@ public class YGOMobileActivity extends NativeActivity implements
});
}
private long lasttime;
@Override
public void onBackPressed() {
if (mGlobalComboBox != null && mGlobalComboBox.isShowing()) {
mGlobalComboBox.dismiss();
return;
}
if (mGlobalEditText != null && mGlobalEditText.isShowing()) {
mGlobalEditText.dismiss();
return;
}
if (lasttime == 0 || (System.currentTimeMillis() - lasttime) > 1000) {
lasttime = System.currentTimeMillis();
Toast.makeText(this, R.string.tip_exit_game, Toast.LENGTH_SHORT).show();
return;
}
onGameExit();
}
@Override
protected void onSurfaceTouch(View v, MotionEvent event) {
if (event.getPointerCount() > 1) {
//多指操作不处理
return;
}
super.onSurfaceTouch(v, event);
}
@Override
public void onGameExit() {
if(onGameExiting){
if (onGameExiting) {
return;
}
onGameExiting = true;
......@@ -558,7 +492,7 @@ public class YGOMobileActivity extends NativeActivity implements
}
boolean isRoot = isTaskRoot();
Log.d(IrrlichtBridge.TAG, "isRoot=" + isRoot + ",kill:" + Process.myPid());
if(isRoot) {
if (isRoot) {
finishAndRemoveTask();
} else {
finish();
......
package cn.garymb.ygomobile.controller;
import android.os.Looper;
import android.util.Log;
import android.view.InputEvent;
import android.view.InputQueue;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import cn.garymb.ygomobile.utils.AndroidHideApi;
/**
* 仅测试安卓7-11
*/
public class InputQueueCompat implements InvocationHandler {
private static final String TAG = "kk-java";
private static Constructor<InputQueue> InputQueue_ctr;
private static Method getNativePtr_method;
private static Class<?> FinishedInputEventCallback_class;
//sendInputEvent(InputEvent e, Object token, boolean predispatch,
// FinishedInputEventCallback callback)
private static Method sendInputEvent_method;
private FinishedInputEventCallbackCompat finishedInputEventCallbackCompat;
static {
AndroidHideApi.enableHideApi();
try {
Looper.getMainLooper();
InputQueue_ctr = InputQueue.class.getDeclaredConstructor();
// InputQueue_ctr.setAccessible(true);
getNativePtr_method = InputQueue.class.getMethod("getNativePtr");
// getNativePtr_method.setAccessible(true);
FinishedInputEventCallback_class = Class.forName(InputQueue.class.getName() + "$FinishedInputEventCallback");
sendInputEvent_method = InputQueue.class.getMethod("sendInputEvent", InputEvent.class, Object.class, boolean.class,
FinishedInputEventCallback_class);
} catch (Throwable e) {
Log.e(TAG, "InputQueueCompat init", e);
}
}
private final InputQueue inputQueue;
private final Object callback;
public InputQueueCompat(InputQueue inputQueue) {
this.inputQueue = inputQueue;
if(inputQueue != null) {
callback = Proxy.newProxyInstance(InputQueue.class.getClassLoader(), new Class[]{FinishedInputEventCallback_class},
this);
} else {
callback = null;
}
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) {
//void onFinishedInputEvent(Object token, boolean handled);
if ("onFinishedInputEvent".equals(method.getName())) {
Object token = args[0];
boolean handled = (boolean) args[1];
onFinishedInputEvent(token, handled);
return 0;
}
return 0;
}
public InputQueueCompat() {
this(create());
}
public void setFinishedInputEventCallback(FinishedInputEventCallbackCompat finishedInputEventCallbackCompat) {
this.finishedInputEventCallbackCompat = finishedInputEventCallbackCompat;
}
public boolean isValid() {
return inputQueue != null && sendInputEvent_method != null && getNativePtr_method != null;
}
private static InputQueue create() {
try {
return InputQueue_ctr.newInstance();
} catch (Throwable e) {
Log.w(TAG, "InputQueue<init>", e);
return null;
}
}
public long getNativePtr() {
if (getNativePtr_method == null || inputQueue == null) {
return 0;
}
try {
Long ret = (Long) getNativePtr_method.invoke(inputQueue);
if (ret == null) {
return 0;
}
return ret;
} catch (Throwable e) {
Log.w(TAG, "getNativePtr", e);
return 0;
}
}
public InputQueue getInputQueue() {
return inputQueue;
}
public void sendInputEvent(InputEvent e, Object token, boolean predispatch) {
if (sendInputEvent_method == null) {
return;
}
try {
Log.d(TAG, "inputQueue:sendInputEvent:" + e);
sendInputEvent_method.invoke(inputQueue, e, token, predispatch, callback);
} catch (Throwable ex) {
Log.w(TAG, "inputQueue:sendInputEvent", ex);
}
}
public void onFinishedInputEvent(Object token, boolean handled) {
//TODO
Log.d(TAG, "onFinishedInputEvent:" + token + ", handled=" + handled);
if(this.finishedInputEventCallbackCompat != null){
finishedInputEventCallbackCompat.onFinishedInputEvent(token, handled);
}
}
public interface FinishedInputEventCallbackCompat{
void onFinishedInputEvent(Object token, boolean handled);
}
}
package cn.garymb.ygomobile.utils;
import android.os.Build;
import java.lang.reflect.Method;
public class AndroidHideApi {
private static boolean sBypassedP = false;
public static void enableHideApi() {
if (sBypassedP) {
return;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
try {
Method forNameMethod = Class.class.getDeclaredMethod("forName", String.class);
Class<?> clazz = (Class<?>) forNameMethod.invoke(null, "dalvik.system.VMRuntime");
Method getMethodMethod = Class.class.getDeclaredMethod("getDeclaredMethod", String.class, Class[].class);
Method getRuntime = (Method) getMethodMethod.invoke(clazz, "getRuntime", new Class[0]);
Method setHiddenApiExemptions = (Method) getMethodMethod.invoke(clazz, "setHiddenApiExemptions", new Class[]{String[].class});
Object runtime = getRuntime.invoke(null);
setHiddenApiExemptions.invoke(runtime, new Object[]{
new String[]{
"Landroid/",
"Lcom/android/",
"Ljava/lang/",
"Ldalvik/system/",
"Llibcore/io/",
"Lhuawei/"
}
});
} catch (Throwable e) {
e.printStackTrace();
}
}
sBypassedP = true;
}
}
......@@ -64,6 +64,16 @@ public class App extends GameApplication {
public float getYScale() {
return AppsSettings.get().getYScale(getGameWidth(), getGameHeight());
}
//
// @Override
// public int getGameHeight() {
// return 720;
// }
//
// @Override
// public int getGameWidth() {
// return 1280;
// }
@Override
public String getCardImagePath() {
......
......@@ -3,6 +3,7 @@ package cn.garymb.ygomobile;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Point;
import android.os.ParcelFileDescriptor;
import android.text.TextUtils;
import android.util.Log;
import android.view.WindowManager;
......@@ -18,9 +19,11 @@ import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import cn.garymb.ygomobile.core.IrrlichtBridge;
import cn.garymb.ygomobile.lite.R;
import cn.garymb.ygomobile.ui.preference.PreferenceFragmentPlus;
import cn.garymb.ygomobile.utils.DeckUtil;
import cn.garymb.ygomobile.utils.DensityUtils;
import cn.garymb.ygomobile.utils.IOUtils;
import static cn.garymb.ygomobile.Constants.CORE_DECK_PATH;
......@@ -33,6 +36,7 @@ import static cn.garymb.ygomobile.Constants.DEF_PREF_KEEP_SCALE;
import static cn.garymb.ygomobile.Constants.DEF_PREF_NOTCH_HEIGHT;
import static cn.garymb.ygomobile.Constants.DEF_PREF_ONLY_GAME;
import static cn.garymb.ygomobile.Constants.DEF_PREF_READ_EX;
import static cn.garymb.ygomobile.Constants.DEF_PREF_WINDOW_TOP_BOTTOM;
import static cn.garymb.ygomobile.Constants.PREF_DEF_IMMERSIVE_MODE;
import static cn.garymb.ygomobile.Constants.PREF_DEF_SENSOR_REFRESH;
import static cn.garymb.ygomobile.Constants.PREF_FONT_SIZE;
......@@ -43,6 +47,7 @@ import static cn.garymb.ygomobile.Constants.PREF_NOTCH_HEIGHT;
import static cn.garymb.ygomobile.Constants.PREF_ONLY_GAME;
import static cn.garymb.ygomobile.Constants.PREF_READ_EX;
import static cn.garymb.ygomobile.Constants.PREF_SENSOR_REFRESH;
import static cn.garymb.ygomobile.Constants.PREF_WINDOW_TOP_BOTTOM;
import static cn.garymb.ygomobile.Constants.WINDBOT_DECK_PATH;
import static cn.garymb.ygomobile.Constants.WINDBOT_PATH;
import static cn.garymb.ygomobile.Constants.YDK_FILE_EX;
......@@ -53,8 +58,8 @@ public class AppsSettings {
private static AppsSettings sAppsSettings;
private final Point mScreenSize = new Point();
private final Point mRealScreenSize = new Point();
private Context context;
private PreferenceFragmentPlus.SharedPreferencesPlus mSharedPreferences;
private final Context context;
private final PreferenceFragmentPlus.SharedPreferencesPlus mSharedPreferences;
private float mDensity;
private AppsSettings(Context context) {
......@@ -134,6 +139,7 @@ public class AppsSettings {
}
public float getXScale(int w, int h) {
//曲面屏
if (isKeepScale()) {
float sx = getScreenHeight() / w;
float sy = getScreenWidth() / h;
......@@ -156,6 +162,15 @@ public class AppsSettings {
return mSharedPreferences.getBoolean(PREF_KEEP_SCALE, DEF_PREF_KEEP_SCALE);
}
public int getScreenPadding() {
//ListPreference都是string
String str = mSharedPreferences.getString(PREF_WINDOW_TOP_BOTTOM, null);
if (!TextUtils.isEmpty(str) && TextUtils.isDigitsOnly(str)) {
return Integer.parseInt(str);
}
return 0;
}
public float getScreenWidth() {
int w, h;
if (isImmerSiveMode()) {
......@@ -165,7 +180,11 @@ public class AppsSettings {
w = mScreenSize.x;
h = mScreenSize.y;
}
return Math.min(w, h);
int ret = Math.min(w, h);
//测试代码,曲面屏左右2变需要留空白,但是游戏画面比例不对,需要修改c那边代码
int fix_h = DensityUtils.dp2px(context, getScreenPadding());
Log.d(IrrlichtBridge.TAG, "screen padding=" + fix_h);
return ret - fix_h * 2;
}
public float getScreenHeight() {
......@@ -518,7 +537,8 @@ public class AppsSettings {
}
//获得最后卡组绝对路径
public @Nullable String getLastDeckPath() {
public @Nullable
String getLastDeckPath() {
String path;
if (TextUtils.equals(context.getString(R.string.category_pack), getLastCategory())) {
path = getResourcePath() + "/" + CORE_PACK_PATH + "/" + getLastDeckName() + YDK_FILE_EX;
......@@ -680,6 +700,6 @@ public class AppsSettings {
@Deprecated
//获取收藏文件
public File getFavoriteFile() {
return new File(getResourcePath(), CORE_SYSTEM_PATH);
return new File(getResourcePath(), "/favorite.txt");
}
}
......@@ -117,6 +117,10 @@ public interface Constants {
String PREF_KEEP_SCALE = "pref_settings_keep_scale";
boolean DEF_PREF_KEEP_SCALE = false;
//dp单位,游戏高度减少,留空白
String PREF_WINDOW_TOP_BOTTOM = "pref_settings_window_top_bottom";
int DEF_PREF_WINDOW_TOP_BOTTOM = 0;
int REQUEST_CUT_IMG = 0x1000 + 0x10;
int REQUEST_CHOOSE_FILE = 0x1000 + 0x20;
int REQUEST_CHOOSE_IMG = 0x1000 + 0x21;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment