搜索附件  
同能RPG制作大师 附件中心 同能RM技术讨论区 RPG Maker MV 讨论区 java+android创建摇杆(非任意位置点触..): d4.png

java+android创建摇杆(非任意位置点触..): d4.png

 

java+android创建摇杆(非任意位置点触..):
更新了简洁版
https://rpg.blue/forum.php?mod=viewthread&tid=487798&page=1&extra=#pid2936081

如果有android代码基础的话,我更推荐本篇的版本。
RPGMaker官方引擎制作的只有四个方向,这点对应使用摇杆操作体验还是有微小影响,思来想去,我最后只能是将左下、右下方向都指定为下方向,左上、右上都指定为上方向
前面发了贴请教关于存档问题,自己也去查了,结果还是无法突破 ...不过倒是对javascript和webview交互有了一点了解。
之前就想做个虚拟按键,可自己对javascript了解不深,就开始学习,前几天跟着大佬xjzsq(https://rpg.blue/?2631080)的教程学习完。非常感谢!!!由此产生此篇。
第一次写教程,有不妥的地方请尽情提建议。
有了点这些基础,我就想直接用android层做虚拟键,只要去调用javascript事件就行了!然后我主要用得是java语言,编译器是AS,所以需要一点android开发基础...
如果完全不懂android开发估计不好看明白,但你也可以尝试一下,多一门手艺也不是坏事...
上效果


下面说教程吧:

1、解压后 把
RockerViewtwo.java
文件添加到包内(原作者下载地址(应该?我发现了很多相似的O(∩_∩)O哈哈~)
https://download.csdn.net/download/weixin_39840650/11489681?utm_source=bbsseo
这个主要是绘制摇杆的自定义组件


2、将解压后的attr文件复制到value文件夹中,这个主要是用来设置摇杆样式的,如果有P好的摇杆图可以在这设置,然后在布局中调用,如果没有图片,那么就会参考颜色值来绘制摇杆


3、在布局文件中调用,就是在你创建webview组件的那个文件里创建摇杆view类,至于如何布局应该不用我说了吧




4、在MainActivity中添加代码 实例化view什么的大家应该都会,这里就展示需要添加的部分
JAVA 代码下载
  1. mRockerView.setOnShakeListener(DIRECTION_8, new RockerViewtwo.OnShakeListener(){
  2.             @Override
  3.             publicvoid onStart(){
  4.             }
  5.             @Override
  6.             publicvoid direction(RockerViewtwo.Direction direction){
  7.                 if(direction == RockerViewtwo.Direction.DIRECTION_CENTER){
  8.                     Log.e("_now9", "当前方向:中心");
  9.                     goiuout();
  10.                 }elseif(direction == RockerViewtwo.Direction.DIRECTION_DOWN){
  11.                     Log.e("_now8", "当前方向:下");
  12.                     goiuout();
  13.                     goiudown();
  14.                 }elseif(direction == RockerViewtwo.Direction.DIRECTION_LEFT){
  15.                     Log.e("_now7", "当前方向:左");
  16.                     goiuout();
  17.                     goiuleft();
  18.                 }elseif(direction == RockerViewtwo.Direction.DIRECTION_UP){
  19.                     Log.e("_now6", "当前方向:上");
  20.                     goiuout();
  21.                     goiuup();
  22.                 }elseif(direction == RockerViewtwo.Direction.DIRECTION_RIGHT){
  23.                     Log.e("_now5", "当前方向:右");
  24.                     goiuout();
  25.                     goiuright();
  26.                 }elseif(direction == RockerViewtwo.Direction.DIRECTION_DOWN_LEFT){
  27.                     Log.e("_now4", "当前方向:左下");
  28. //                    goiuleft();
  29.                     goiuout();
  30.                     goiudown();
  31.                 }elseif(direction == RockerViewtwo.Direction.DIRECTION_DOWN_RIGHT){
  32.                     Log.e("_now3", "当前方向:右下");
  33. //                    goiuright();
  34.                     goiuout();
  35.                     goiudown();
  36.                 }elseif(direction == RockerViewtwo.Direction.DIRECTION_UP_LEFT){
  37.                     Log.e("_now2", "当前方向:左上");
  38. //                    goiuleft();
  39.                     goiuout();
  40.                     goiuup();
  41.                 }elseif(direction == RockerViewtwo.Direction.DIRECTION_UP_RIGHT){
  42.                     Log.e("_now1", "当前方向:右上");
  43. //                    goiuright();
  44.                     goiuout();
  45.                     goiuup();
  46.                 }
  47.             }
  48.             @Override
  49.             publicvoid onFinish(){
  50.             }
  51.         });
  52.         mRockerView.setOnAngleChangeListener(new RockerViewtwo.OnAngleChangeListener(){
  53.             @Override
  54.             publicvoid onStart(){
  55.             }
  56.             @Override
  57.             publicvoid angle(double angle){
  58.                 Log.e("_now10", "当前角度:" + angle);
  59.             }
  60.             @Override
  61.             publicvoid onFinish(){
  62.             }
  63.         });
  64.         mRockerView.setOnDistanceLevelListener(new RockerViewtwo.OnDistanceLevelListener(){
  65.             @Override
  66.             publicvoid onDistanceLevel(int level){
  67.                 Log.e("_now11", "当前距离级别:" + level);
  68.             }
  69.         });
  70. ublic staticvoid goiuout(){
  71.         gameWebView.loadUrl("javascript:downgetout()");
  72.     }
  73.     publicstaticvoid goiuleft(){
  74.         gameWebView.loadUrl("javascript:downleft()");
  75.     }
  76.     publicstaticvoid goiuup(){
  77.         gameWebView.loadUrl("javascript:downup()");
  78.     }
  79.     publicstaticvoid goiudown(){
  80.         gameWebView.loadUrl("javascript:downdrow()");
  81.     }
  82.     publicstaticvoid goiuright(){
  83.         gameWebView.loadUrl("javascript:downright()");
  84.     }
  85.     publicstaticvoid goiuok(){
  86.         gameWebView.loadUrl("javascript:downok()");
  87.     }
  88.     publicstaticvoid goiuesc(){
  89.         gameWebView.loadUrl("javascript:downesc()");
  90.     }
复制代码


5、既然是交互,下面就是在javascript上操作了
打开游戏文件index.html文件,在body标签内、插件引用最后处添加下面代码


JAVASCRIPT 代码下载
  1.         function downleft(){
  2.             Input._currentState['left']=true
  3.         }
  4.         function downright(){
  5.             Input._currentState['right']=true
  6.         }
  7.         function downup(){
  8.             Input._currentState['up']=true
  9.         }
  10.         function downdrow(){
  11.             Input._currentState['down']=true
  12.         }
  13.         function downok(){
  14.             Input._currentState['ok']=true
  15.         }
  16.         function downesc(){
  17.             Input._currentState['escape']=true
  18.         }
  19.         function downgetout(){
  20.             Input._currentState['up']=false
  21.             Input._currentState['right']=false
  22.             Input._currentState['down']=false
  23.             Input._currentState['left']=false
  24.             Input._currentState['ok']=false
  25.             Input._currentState['escape']=false
  26.         }
复制代码


补全一下MainActivity.java吧,方便对上面第四条出现的代码进行查询:
MainActivity.java:上面第四条是该文件的节选,其实摇杆核心就是第四条的代码
JAVA 代码下载
  1. package com.example.myhtmltwo;
  2. import static com.example.myhtmltwo.RockerViewtwo.DirectionMode.DIRECTION_8;
  3. import android.Manifest;
  4. import android.app.AlertDialog;
  5. import android.content.Context;
  6. import android.content.DialogInterface;
  7. import android.content.Intent;
  8. import android.content.pm.PackageManager;
  9. import android.content.res.Resources;
  10. import android.graphics.Bitmap;
  11. import android.graphics.BitmapFactory;
  12. import android.graphics.drawable.Drawable;
  13. import android.net.Uri;
  14. import android.os.Build;
  15. import android.os.Bundle;
  16. import android.os.Environment;
  17. import android.os.Handler;
  18. import android.os.Message;
  19. import android.provider.Settings;
  20. import android.util.Log;
  21. import android.view.KeyEvent;
  22. import android.view.MotionEvent;
  23. import android.view.View;
  24. import android.view.Window;
  25. import android.view.WindowManager;
  26. import android.webkit.WebChromeClient;
  27. import android.webkit.WebResourceRequest;
  28. import android.webkit.WebResourceResponse;
  29. import android.webkit.WebSettings;
  30. import android.webkit.WebView;
  31. import android.webkit.WebViewClient;
  32. import android.widget.Button;
  33. import android.widget.ImageView;
  34. import android.widget.LinearLayout;
  35. import android.widget.RelativeLayout;
  36. import android.widget.TextView;
  37. import androidx.annotation.NonNull;
  38. import androidx.annotation.RequiresApi;
  39. import androidx.appcompat.app.AppCompatActivity;
  40. import androidx.constraintlayout.widget.ConstraintLayout;
  41. import androidx.core.app.ActivityCompat;
  42. import androidx.webkit.WebViewAssetLoader;
  43. import java.io.InputStream;
  44. /**
  45. * @author HY
  46. */
  47. publicclass MainActivity extends AppCompatActivity {
  48.     /**
  49.      * 动画控件imgview
  50.      */
  51.     LinearLayout ani;
  52.     TextView loadtxt;
  53.     RockerViewtwo mRockerView;
  54.     /**
  55.      * game路径
  56.      */
  57.     String gameUrl;
  58.     /**
  59.      * 承载网页控件
  60.      */
  61.     publicstatic WebView gameWebView;
  62.     @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
  63.     @Override
  64.     protectedvoid onCreate(Bundle savedInstanceState){
  65.         super.onCreate(savedInstanceState);
  66.         /**
  67.          * 去除标题
  68.          */
  69.         supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
  70.         /**
  71.          * 去掉信息栏
  72.          */
  73.         this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
  74.         setContentView(R.layout.activity_main);
  75.         showCamera();
  76.         Bundle bundle = this.getIntent().getExtras();
  77.         gameUrl = bundle.getString("gamePath");
  78.         /**
  79.          * 实例化动画控件
  80.          */
  81.         ani = findViewById(R.id.imgview);
  82.         loadtxt = findViewById(R.id.loadtxt);
  83.         /**
  84.          * 加载网页
  85.          */
  86.         htmls();
  87.         /**
  88.          * 动画
  89.          */
  90.         loadAmi();
  91.     }
  92.     publicvoid showCamera(){
  93.         if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R){
  94.             if(!Environment.isExternalStorageManager()){
  95.                 androidx.appcompat.app.AlertDialog.Builder ad = new androidx.appcompat.app.AlertDialog.Builder(MainActivity.this);
  96.                 ad.setMessage("由于Android11及以上系统限制需要对软件进行授权,请开启权限")
  97.                         .setCancelable(false)
  98.                         .setPositiveButton("前往开启", new DialogInterface.OnClickListener(){
  99.                             @Override
  100.                             publicvoid onClick(DialogInterface dialogInterface, int i){
  101.                                 Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
  102.                                 intent.setData(Uri.parse("package:" + MainActivity.this.getPackageName()));
  103.                                 startActivityForResult(intent, 98);
  104.                             }
  105.                         })
  106.                         .setNegativeButton("取消", new DialogInterface.OnClickListener(){
  107.                             @Override
  108.                             publicvoid onClick(DialogInterface dialogInterface, int i){
  109.                             }
  110.                         }).show();
  111.             }
  112.         }
  113.         String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
  114.         ActivityCompat.requestPermissions(MainActivity.this, permissions, 520);
  115.     }
  116.     @Override
  117.     publicvoid onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults){
  118.         super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  119.         switch(requestCode){
  120.             case520:
  121.                 if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
  122.                     Log.e("申请:", "成功!!");
  123.                 }else{
  124.                     finish();
  125.                 }
  126.                 break;
  127.         }
  128.     }
  129.     /**
  130.      * 加载网页
  131.      */
  132.     RemoteSurfaceView remoteSurfaceView;
  133.     RelativeLayout.LayoutParams params;
  134.     @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
  135.     publicvoid htmls(){
  136.         /**
  137.          * 实例化WebView
  138.          */
  139.         mRockerView = (RockerViewtwo) findViewById(R.id.roview);
  140.         Button gsq = findViewById(R.id.gsq);
  141.         Button gsq2 = findViewById(R.id.gsq2);
  142.         gameWebView = findViewById(R.id.gameWebView);
  143.         Log.e("_now", "当前模式setOnShakeListener:方向有改变时回调;8个方向");
  144.         mRockerView.setOnShakeListener(DIRECTION_8, new RockerViewtwo.OnShakeListener(){
  145.             @Override
  146.             publicvoid onStart(){
  147.             }
  148.             @Override
  149.             publicvoid direction(RockerViewtwo.Direction direction){
  150.                 if(direction == RockerViewtwo.Direction.DIRECTION_CENTER){
  151.                     Log.e("_now9", "当前方向:中心");
  152.                     goiuout();
  153.                 }elseif(direction == RockerViewtwo.Direction.DIRECTION_DOWN){
  154.                     Log.e("_now8", "当前方向:下");
  155.                     goiuout();
  156.                     goiudown();
  157.                 }elseif(direction == RockerViewtwo.Direction.DIRECTION_LEFT){
  158.                     Log.e("_now7", "当前方向:左");
  159.                     goiuout();
  160.                     goiuleft();
  161.                 }elseif(direction == RockerViewtwo.Direction.DIRECTION_UP){
  162.                     Log.e("_now6", "当前方向:上");
  163.                     goiuout();
  164.                     goiuup();
  165.                 }elseif(direction == RockerViewtwo.Direction.DIRECTION_RIGHT){
  166.                     Log.e("_now5", "当前方向:右");
  167.                     goiuout();
  168.                     goiuright();
  169.                 }elseif(direction == RockerViewtwo.Direction.DIRECTION_DOWN_LEFT){
  170.                     Log.e("_now4", "当前方向:左下");
  171. //                    goiuleft();
  172.                     goiuout();
  173.                     goiudown();
  174.                 }elseif(direction == RockerViewtwo.Direction.DIRECTION_DOWN_RIGHT){
  175.                     Log.e("_now3", "当前方向:右下");
  176. //                    goiuright();
  177.                     goiuout();
  178.                     goiudown();
  179.                 }elseif(direction == RockerViewtwo.Direction.DIRECTION_UP_LEFT){
  180.                     Log.e("_now2", "当前方向:左上");
  181. //                    goiuleft();
  182.                     goiuout();
  183.                     goiuup();
  184.                 }elseif(direction == RockerViewtwo.Direction.DIRECTION_UP_RIGHT){
  185.                     Log.e("_now1", "当前方向:右上");
  186. //                    goiuright();
  187.                     goiuout();
  188.                     goiuup();
  189.                 }
  190.             }
  191.             @Override
  192.             publicvoid onFinish(){
  193.             }
  194.         });
  195.         mRockerView.setOnAngleChangeListener(new RockerViewtwo.OnAngleChangeListener(){
  196.             @Override
  197.             publicvoid onStart(){
  198.             }
  199.             @Override
  200.             publicvoid angle(double angle){
  201.                 Log.e("_now10", "当前角度:" + angle);
  202.             }
  203.             @Override
  204.             publicvoid onFinish(){
  205.             }
  206.         });
  207.         mRockerView.setOnDistanceLevelListener(new RockerViewtwo.OnDistanceLevelListener(){
  208.             @Override
  209.             publicvoid onDistanceLevel(int level){
  210.                 Log.e("_now11", "当前距离级别:" + level);
  211.             }
  212.         });
  213.         Resources resources = MainActivity.this.getResources();
  214.         Drawable qxrd = resources.getDrawable(R.drawable.qxrd);
  215.         Drawable qx = resources.getDrawable(R.drawable.qx);
  216.         Drawable qdrd = resources.getDrawable(R.drawable.qdrd);
  217.         Drawable qd = resources.getDrawable(R.drawable.qd);
  218.         gsq.setOnTouchListener(newView.OnTouchListener(){
  219.             @Override
  220.             publicboolean onTouch(View v, MotionEvent event){
  221.                 int action = event.getAction();
  222.                 if(action == MotionEvent.ACTION_DOWN){
  223.                     gsq.setBackground(qxrd);
  224.                     gameWebView.loadUrl("javascript:downesc()");
  225.                 }elseif(action == MotionEvent.ACTION_UP){
  226.                     gsq.setBackground(qx);
  227.                     gameWebView.loadUrl("javascript:downgetout()");
  228.                 }
  229.                 returnfalse;
  230.             }
  231.         });
  232.         gsq2.setOnTouchListener(newView.OnTouchListener(){
  233.             @Override
  234.             publicboolean onTouch(View v, MotionEvent event){
  235.                 int action = event.getAction();
  236.                 if(action == MotionEvent.ACTION_DOWN){
  237.                     gsq2.setBackground(qdrd);
  238.                     gameWebView.loadUrl("javascript:downok()");
  239.                 }elseif(action == MotionEvent.ACTION_UP){
  240.                     gsq2.setBackground(qd);
  241.                     gameWebView.loadUrl("javascript:downgetout()");
  242.                 }
  243.                 returnfalse;
  244.             }
  245.         });
  246. //        gsq2.setOnClickListener(v -> {
  247. //            gameWebView.loadUrl("javascript:downok()");
  248. //        });
  249.         /**
  250.          * 清除缓存
  251.          */
  252.         gameWebView.clearCache(true);
  253.         /**
  254.          * 实例化WebView配置管理类
  255.          */
  256.         WebSettings settings = gameWebView.getSettings();
  257.         /**
  258.          * 解决跨域
  259.          */
  260.         settings.setAllowFileAccessFromFileURLs(true);
  261.         /**
  262.          *启用Dom存储
  263.          */
  264.         settings.setDomStorageEnabled(true);
  265.         /**
  266.          *允许加载js文件
  267.          */
  268.         settings.setJavaScriptEnabled(true);
  269.         /**
  270.          * 支持缩放
  271.          */
  272.         settings.setSupportZoom(true);
  273.         /**
  274.          * 设置横屏
  275.          */
  276. //        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
  277.         /**
  278.          * 页面事件响应
  279.          */
  280.         gameWebView.setWebChromeClient(new WebChromeClient(){
  281.             @Override
  282.             publicvoid onProgressChanged(WebView view, int newProgress){
  283.                 super.onProgressChanged(view, newProgress);
  284.                 if(newProgress == 100){
  285. //                    loadtxt.setVisibility(View.GONE);
  286. //                    ani.setVisibility(View.GONE);
  287.                 }else{
  288.                     loadtxt.setVisibility(View.VISIBLE);
  289.                     ani.setVisibility(View.VISIBLE);
  290.                 }
  291.             }
  292.         });
  293.         /**
  294.          * 判断SDK版本
  295.          * SDK版本为21才可使用方法WebViewAssetLoader
  296.          * 否则
  297.          */
  298.         if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
  299.             final WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder()
  300.                     /**
  301.                      * html项目存放路径,一般是assets
  302.                      */
  303.                     .addPathHandler("/assets/", new WebViewAssetLoader.AssetsPathHandler(this))
  304.                     /**
  305.                      * html引用的资源文件路径 ,一般是跟随html存放于assets
  306.                      */
  307.                     .addPathHandler("/assets/", new WebViewAssetLoader.ResourcesPathHandler(this))
  308.                     .build();
  309.             /**
  310.              *与页面的交互
  311.              */
  312.             gameWebView.setWebViewClient(new WebViewClient(){
  313.                 @Override
  314.                 publicvoid onPageFinished(WebView view, String url){
  315.                     loadtxt.setVisibility(View.GONE);
  316.                     ani.setVisibility(View.GONE);
  317.                     super.onPageFinished(view, url);
  318.                 }
  319.                 @Override
  320.                 public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request){
  321.                     return assetLoader.shouldInterceptRequest(request.getUrl());
  322.                 }
  323.             });
  324.             gameWebView.addJavascriptInterface(new AndroidtoJs(this), "JH");
  325.             gameWebView.loadUrl("https://appassets.androidplatform.net/assets/" + gameUrl);
  326.         }else{
  327.             gameWebView.setWebViewClient(new WebViewClient(){
  328.                 @Override
  329.                 publicvoid onPageFinished(WebView view, String url){
  330.                     loadtxt.setVisibility(View.GONE);
  331.                     ani.setVisibility(View.GONE);
  332.                     super.onPageFinished(view, url);
  333.                 }
  334.             });
  335.             gameWebView.loadUrl("file:///android_asset/" + gameUrl);
  336.         }
  337.     }
  338.     publicstaticvoid goiuout(){
  339.         gameWebView.loadUrl("javascript:downgetout()");
  340.     }
  341.     publicstaticvoid goiuleft(){
  342.         gameWebView.loadUrl("javascript:downleft()");
  343.     }
  344.     publicstaticvoid goiuup(){
  345.         gameWebView.loadUrl("javascript:downup()");
  346.     }
  347.     publicstaticvoid goiudown(){
  348.         gameWebView.loadUrl("javascript:downdrow()");
  349.     }
  350.     publicstaticvoid goiuright(){
  351.         gameWebView.loadUrl("javascript:downright()");
  352.     }
  353.     publicstaticvoid goiuok(){
  354.         gameWebView.loadUrl("javascript:downok()");
  355.     }
  356.     publicstaticvoid goiuesc(){
  357.         gameWebView.loadUrl("javascript:downesc()");
  358.     }
  359.     private ImageView myImageView, myImageView2, myImageView3, myImageView4;
  360.     private Handler myHandler;//定义线程运行标识
  361.     privateBoolean iswalking = true;
  362.     class myThread extendsThread{
  363.         @Override
  364.         publicvoid run(){
  365.             int what = 1;
  366.             while(iswalking){
  367.                 myHandler.sendEmptyMessage((what++) % 4);//每次生成0-3间依次增加的的数字,用来充当图片数组的下标。
  368.                 try{
  369.                     Thread.sleep(250);//每250毫秒睡眠一次
  370.                 }catch(InterruptedException e){
  371.                     e.printStackTrace();
  372.                 }
  373.             }
  374.         }
  375.     }
  376.     public Bitmap BitmapClipBitmap(Bitmap bitmap, int x, int y, int w, int h){
  377.         return Bitmap.createBitmap(bitmap, x, y, w, h);
  378.     }
  379.     public Bitmap ReadBitmap(Context context, int resId){
  380.         BitmapFactory.Options opt = new BitmapFactory.Options();
  381.         opt.inPreferredConfig = Bitmap.Config.RGB_565;
  382.         opt.inPurgeable = true;
  383.         opt.inInputShareable = true;
  384. //图片的输入流
  385.         InputStream is = context.getResources().openRawResource(resId);
  386.         return BitmapFactory.decodeStream(is, null, opt);
  387.     }
  388.     /**
  389.      * 加载动画
  390.      */
  391.     publicvoid loadAmi(){
  392.         finalint ANIM_COUNT_X = 4, ANIM_COUNT_Y = 4, ANIM_DOWN = 0, ANIM_LEFT = 1, ANIM_RIGHT = 2, ANIM_UP = 3;
  393.         Context context = getApplicationContext();//获取Context
  394.         Bitmap testmap = ReadBitmap(context, R.drawable.girl);
  395.         final Bitmap[][] bitmap = new Bitmap[ANIM_COUNT_X][ANIM_COUNT_Y]; //建立4x4二维数组用来存储4个角度的图片
  396.         int tileWidth = testmap.getWidth() / ANIM_COUNT_X;
  397.         int tileHeight = testmap.getHeight() / ANIM_COUNT_Y;
  398.         int i = 0, x = 0, y = 0;
  399.         for(i = 0; i < ANIM_COUNT_Y; i++){
  400.             y = 0;
  401.             bitmap[ANIM_DOWN][i] = BitmapClipBitmap(testmap, x, y, tileWidth, tileHeight);
  402.             y += tileHeight;
  403.             bitmap[ANIM_LEFT][i] = BitmapClipBitmap(testmap, x, y, tileWidth, tileHeight);
  404.             y += tileHeight;
  405.             bitmap[ANIM_RIGHT][i] = BitmapClipBitmap(testmap, x, y, tileWidth, tileHeight);
  406.             y += tileHeight;
  407.             bitmap[ANIM_UP][i] = BitmapClipBitmap(testmap, x, y, tileWidth, tileHeight);
  408.             x += tileWidth;
  409. //            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
  410. //设置屏幕为横向
  411.             myImageView = (ImageView) findViewById(R.id.im1);
  412.             myImageView2 = (ImageView) findViewById(R.id.im2);
  413.             myImageView3 = (ImageView) findViewById(R.id.im3);
  414.             myImageView4 = (ImageView) findViewById(R.id.im4);
  415.             myHandler = new Handler(){//实例化Handler对象
  416.                 @Override
  417.                 publicvoid handleMessage(Message msg){//接收消息
  418.                     super.handleMessage(msg);
  419.                     myImageView.setImageBitmap(bitmap[ANIM_UP][msg.what]);//设置ImageView中所要加载的位图
  420.                     myImageView2.setImageBitmap(bitmap[ANIM_UP][msg.what]);
  421.                     myImageView3.setImageBitmap(bitmap[ANIM_RIGHT][msg.what]);
  422.                     myImageView4.setImageBitmap(bitmap[ANIM_RIGHT][msg.what]);
  423.                 }
  424.             };
  425.             new myThread().start();
  426.         }
  427.     }
  428.     @Override
  429.     protectedvoid onDestroy(){
  430.         super.onDestroy();
  431.     }
  432.     /**
  433.      * 退出
  434.      */
  435.     publicvoid exit(){
  436.         finish();//退出,但是进程仍在
  437.         android.os.Process.killProcess(android.os.Process.myPid());
  438.     }
  439.     /**
  440.      * 返回键按下时退出
  441.      *
  442.      * @param keyCode
  443.      * @param event
  444.      * @return
  445.      */
  446.     @Override
  447.     publicboolean onKeyDown(int keyCode, KeyEvent event){
  448.         if(keyCode == KeyEvent.KEYCODE_BACK){
  449.             AlertDialog.Builder builder = new AlertDialog.Builder(this);
  450.             builder.setMessage("是否退出应用?");
  451.             builder.setTitle("退出");
  452.             /**
  453.              * setIcon方法
  454.              * 必须设置了setTitleicon才有效
  455.              */
  456.             builder.setIcon(R.mipmap.ic_launcher);
  457.             builder.setPositiveButton("退出", new DialogInterface.OnClickListener(){
  458.                 @Override
  459.                 publicvoid onClick(DialogInterface arg0, int arg1){
  460.                     exit();
  461.                 }
  462.             });
  463.             builder.setNegativeButton("取消", new DialogInterface.OnClickListener(){
  464.                 @Override
  465.                 publicvoid onClick(DialogInterface arg0, int arg1){
  466.                 }
  467.             });
  468.             builder.show();
  469.             returntrue;
  470.         }
  471.         returnsuper.onKeyDown(keyCode, event);
  472.     }
  473. }
复制代码



确定和取消就是两个按钮加上图片,然后调用javascript内的方法即可
到此,算是完成了吧
最后再次感谢用爱发电出教程的各位大佬,感谢感谢!!!


然后就是国内android厂家各种对android进行自己的定制,保不准哪些手机可能会有bug什么的,我在vivo测试是没问题的,欢迎测试。
最后的最后我把自己的工程文件和构筑好的apk分享下,如果能帮到你是最好的。

项目文件:
链接:https://pan.baidu.com/s/1Xmp3cfbPnkm7DZsqrc2_MQ
提取码:5ppu
--来自百度网盘超级会员V4的分享

APK:
链接:https://pan.baidu.com/s/1r_Gc0bUuLXRstEI626Yc3A
提取码:g0an
--来自百度网盘超级会员V4的分享



             本帖来自P1论坛作者haiyin,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=487782  若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
java+android创建摇杆(非任意位置点触..): d4.png
         同一主题附件:
    d1.gif
    d2.gif
    d3.png
    d4.png
    d5.png
    d6.png
    d7.png
    data.zip (79.93 KB)
关闭

幸运抽奖

社区每日抽奖来袭,快来试试你是欧皇还是非酋~

立即查看

Loading...

QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

GMT+8, 2025-7-5 22:42 , Processed in 0.108802 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

返回顶部