GameMenuDialog.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. package com.xugame.gameconsole.dialog.gamemenu;
  2. import android.content.Context;
  3. import android.graphics.Color;
  4. import android.view.KeyEvent;
  5. import android.view.View;
  6. import android.view.Window;
  7. import android.view.WindowManager;
  8. import android.widget.Button;
  9. import android.widget.CompoundButton;
  10. import android.widget.LinearLayout;
  11. import android.widget.RadioButton;
  12. import android.widget.RadioGroup;
  13. import android.widget.TextView;
  14. import android.widget.Toast;
  15. import androidx.annotation.NonNull;
  16. import com.xugame.gameconsole.R;
  17. import com.xugame.gameconsole.dialog.BaseDialog;
  18. import com.xugame.gameconsole.emulator.ScreenType;
  19. import com.xugame.gameconsole.util.DebugUtil;
  20. import java.util.HashMap;
  21. public class GameMenuDialog extends BaseDialog
  22. implements RadioGroup.OnCheckedChangeListener,
  23. View.OnClickListener {
  24. private static final String TAG = "GameMenuDialogTAG";
  25. private RadioGroup mRadioGroup;
  26. GameMenuDialogListener mListener;
  27. ScreenType mType = ScreenType.NORMAL;
  28. private TextView[] archiveTexts;
  29. private TextView[] readArchiveTexts;
  30. private Context mContext;
  31. private int mReadArchiveIndex = 0;//读取存档下标
  32. private LinearLayout mKeySettingBg;
  33. private Button mCommit;
  34. //UP/DOWN/LEFT/RIGHT/A/B/X/Y/L1/R1/L2/R2
  35. private String[] KEYNAMES = {
  36. "A",
  37. "X",
  38. "SELECT",
  39. "START",
  40. "UP",
  41. "DOWN",
  42. "LEFT",
  43. "RIGHT",
  44. "B",
  45. "Y",
  46. "L1",
  47. "R1",
  48. };
  49. private int[] KEYS = {
  50. KeyEvent.KEYCODE_J,
  51. KeyEvent.KEYCODE_L,
  52. KeyEvent.KEYCODE_3,
  53. KeyEvent.KEYCODE_1,
  54. KeyEvent.KEYCODE_W,
  55. KeyEvent.KEYCODE_S,
  56. KeyEvent.KEYCODE_A,
  57. KeyEvent.KEYCODE_D,
  58. KeyEvent.KEYCODE_K,
  59. KeyEvent.KEYCODE_U,
  60. KeyEvent.KEYCODE_I,
  61. KeyEvent.KEYCODE_O,
  62. };
  63. private Button mKeySwitch;
  64. private boolean isKeySettingRunning = false;
  65. private int keySettingIndex = 0;
  66. private RadioButton[] mKeyNumText;
  67. private TextView mKeyName;
  68. private RadioGroup mKeyRadioGroup;
  69. public GameMenuDialog(Context context, GameMenuDialogListener listener) {
  70. super(context, R.style.DialogNoPadding);
  71. this.mListener = listener;
  72. this.mContext = context;
  73. setContentView(R.layout.dialog_gamemenu_layout);
  74. Window window = this.getWindow();
  75. WindowManager.LayoutParams wLp = window.getAttributes();
  76. wLp.width = 1200;
  77. wLp.height = 832;
  78. wLp.dimAmount = 0.6f;//透明度
  79. window.setAttributes(wLp);
  80. this.initView();
  81. }
  82. private void initView() {
  83. mRadioGroup = findViewById(R.id.radio_gp_screen);
  84. mRadioGroup.setOnCheckedChangeListener(this);
  85. archiveTexts = new TextView[5];
  86. readArchiveTexts = new TextView[5];
  87. archiveTexts[0] = findViewById(R.id.archive_1);
  88. archiveTexts[1] = findViewById(R.id.archive_2);
  89. archiveTexts[2] = findViewById(R.id.archive_3);
  90. archiveTexts[3] = findViewById(R.id.archive_4);
  91. archiveTexts[4] = findViewById(R.id.archive_5);
  92. readArchiveTexts[0] = findViewById(R.id.read_archive_1);
  93. readArchiveTexts[1] = findViewById(R.id.read_archive_2);
  94. readArchiveTexts[2] = findViewById(R.id.read_archive_3);
  95. readArchiveTexts[3] = findViewById(R.id.read_archive_4);
  96. readArchiveTexts[4] = findViewById(R.id.read_archive_5);
  97. mKeySettingBg = findViewById(R.id.key_setting_bg);
  98. mKeySwitch = findViewById(R.id.key_setting_switch);
  99. mKeyName = findViewById(R.id.keyName);
  100. mCommit = findViewById(R.id.key_setting_commit);
  101. mKeyRadioGroup = findViewById(R.id.key_radio_grop);
  102. mKeySwitch.setOnClickListener(this);
  103. mKeyNumText = new RadioButton[KEYS.length];
  104. for (int i = 0; i < KEYS.length; i++) {
  105. RadioButton radioButton = new RadioButton(mContext);
  106. radioButton.setText(KEYNAMES[i]);
  107. radioButton.setTextColor(Color.BLACK);
  108. RadioGroup.LayoutParams llp = new RadioGroup.LayoutParams(RadioGroup.LayoutParams.WRAP_CONTENT,
  109. RadioGroup.LayoutParams.WRAP_CONTENT);
  110. llp.leftMargin = 10;
  111. mKeyRadioGroup.addView(radioButton, llp);
  112. final int index = i;
  113. radioButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
  114. @Override
  115. public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
  116. if (b) {
  117. keySettingIndex = index;
  118. radioButton.setBackgroundColor(Color.GRAY);
  119. isKeySettingRunning = true;
  120. } else {
  121. radioButton.setBackgroundColor(Color.WHITE);
  122. }
  123. }
  124. });
  125. mKeyNumText[i] = radioButton;
  126. }
  127. //点击确定,上报新的按键
  128. mCommit.setOnClickListener(new View.OnClickListener() {
  129. @Override
  130. public void onClick(View view) {
  131. DebugUtil.i(TAG, "click commit");
  132. if (isKeySettingRunning) {
  133. Toast.makeText(mContext, "当前处于编辑状态", Toast.LENGTH_SHORT).show();
  134. return;
  135. } else {
  136. if (mListener != null)
  137. mListener.onKeySettingNums(KEYS);
  138. }
  139. }
  140. });
  141. for (int i = 0; i < archiveTexts.length; i++) {
  142. final int tempIndex = i;
  143. archiveTexts[i].setOnClickListener(new View.OnClickListener() {
  144. @Override
  145. public void onClick(View view) {
  146. if (mListener != null && mListener.onSaveState(tempIndex))
  147. // todo: save state error handler
  148. ;
  149. dismiss();
  150. }
  151. });
  152. }
  153. for (int i = 0; i < readArchiveTexts.length; i++) {
  154. final int tempIndex = i;
  155. readArchiveTexts[i].setOnClickListener(new View.OnClickListener() {
  156. @Override
  157. public void onClick(View view) {
  158. mReadArchiveIndex = tempIndex;
  159. if (mListener != null && mListener.onLoadState(tempIndex))
  160. // todo: load state error handler
  161. ;
  162. dismiss();
  163. }
  164. });
  165. }
  166. findViewById(R.id.ratioCoreButton).setOnClickListener(new View.OnClickListener() {
  167. @Override
  168. public void onClick(View v) {
  169. if (mListener != null)
  170. mListener.onSetRatio(0);
  171. dismiss();
  172. }
  173. });
  174. findViewById(R.id.ratioFullscreenButton).setOnClickListener(new View.OnClickListener() {
  175. @Override
  176. public void onClick(View v) {
  177. if (mListener != null)
  178. mListener.onSetRatio(1);
  179. dismiss();
  180. }
  181. });
  182. findViewById(R.id.ratioCustomButton).setOnClickListener(new View.OnClickListener() {
  183. @Override
  184. public void onClick(View v) {
  185. if (mListener != null)
  186. mListener.onSetRatio(2);
  187. dismiss();
  188. }
  189. });
  190. findViewById(R.id.resume_game).setOnClickListener(new View.OnClickListener() {
  191. @Override
  192. public void onClick(View view) {
  193. if (mListener != null)
  194. mListener.onResumeGame(mType, mReadArchiveIndex);
  195. dismiss();
  196. }
  197. });
  198. findViewById(R.id.stop_game).setOnClickListener(new View.OnClickListener() {
  199. @Override
  200. public void onClick(View view) {
  201. if (mListener != null)
  202. mListener.onExitGame();
  203. dismiss();
  204. }
  205. });
  206. }
  207. @Override
  208. public void onCheckedChanged(RadioGroup radioGroup, int i) {
  209. if (radioGroup.getCheckedRadioButtonId() == R.id.normal) {
  210. mType = ScreenType.NORMAL;
  211. } else if (radioGroup.getCheckedRadioButtonId() == R.id.sai_2x) {
  212. mType = ScreenType.SAI_2X;
  213. } else if (radioGroup.getCheckedRadioButtonId() == R.id.scanline_game) {
  214. mType = ScreenType.SCANLINE;
  215. }
  216. }
  217. @Override
  218. public boolean dispatchKeyEvent(@NonNull KeyEvent event) {
  219. if (isKeySettingRunning) {
  220. if (event.getAction() == KeyEvent.ACTION_DOWN) {
  221. int devicesID = event.getDeviceId();
  222. String devicesName = event.getDevice().getName();
  223. int keyCode = event.getKeyCode();
  224. mKeyName.setText("按键ID:" + devicesID + " 设备名:" + devicesName + " keycode:" + keyCode);
  225. if (keySettingIndex < KEYS.length) {
  226. boolean isSwap = false;//是否交换键值
  227. mKeyNumText[keySettingIndex].setBackgroundColor(Color.WHITE);
  228. for (int i = 0; i < KEYS.length; i++) {
  229. if (keyCode == KEYS[i] && keySettingIndex != i) {
  230. int temp = KEYS[keySettingIndex];
  231. KEYS[i] = temp;
  232. KEYS[keySettingIndex] = keyCode;
  233. isSwap = true;
  234. }
  235. }
  236. if (!isSwap)//没有相同键值则直接赋值
  237. KEYS[keySettingIndex] = keyCode;
  238. }
  239. isKeySettingRunning = false;
  240. String tempKeyStr = "";
  241. for (int i=0;i<KEYS.length;i++) {
  242. tempKeyStr += KEYS[i] + "-";
  243. }
  244. DebugUtil.i(TAG, "key=" + tempKeyStr);
  245. }
  246. return super.dispatchKeyEvent(event);
  247. } else {
  248. return super.dispatchKeyEvent(event);
  249. }
  250. }
  251. @Override
  252. public void dismiss() {
  253. if(mListener!=null){
  254. mListener.onResumeGame(mType, mReadArchiveIndex);
  255. }
  256. super.dismiss();
  257. }
  258. @Override
  259. public void onClick(View view) {
  260. if (view == mKeySwitch) {
  261. isKeySettingRunning = !isKeySettingRunning;
  262. mKeySwitch.setText((isKeySettingRunning != true ? "开始设置按键" : "停止设置按键"));
  263. }
  264. }
  265. }