设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2970|回复: 32
打印 上一主题 下一主题

[原创发布] java+android创建摇杆(非任意位置点触..)

[复制链接]

Lv2.观梦者

梦石
0
星屑
390
在线时间
48 小时
注册时间
2020-4-24
帖子
61
跳转到指定楼层
1
发表于 2021-11-16 17:33:30 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 haiyin 于 2021-11-20 22:24 编辑

更新了简洁版
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.             public void onStart() {
  4.  
  5.             }
  6.  
  7.             @Override
  8.             public void direction(RockerViewtwo.Direction direction) {
  9.                 if (direction == RockerViewtwo.Direction.DIRECTION_CENTER) {
  10.                     Log.e("_now9", "当前方向:中心");
  11.                     goiuout();
  12.                 } else if (direction == RockerViewtwo.Direction.DIRECTION_DOWN) {
  13.                     Log.e("_now8", "当前方向:下");
  14.                     goiuout();
  15.                     goiudown();
  16.                 } else if (direction == RockerViewtwo.Direction.DIRECTION_LEFT) {
  17.                     Log.e("_now7", "当前方向:左");
  18.                     goiuout();
  19.                     goiuleft();
  20.                 } else if (direction == RockerViewtwo.Direction.DIRECTION_UP) {
  21.                     Log.e("_now6", "当前方向:上");
  22.                     goiuout();
  23.                     goiuup();
  24.                 } else if (direction == RockerViewtwo.Direction.DIRECTION_RIGHT) {
  25.                     Log.e("_now5", "当前方向:右");
  26.                     goiuout();
  27.                     goiuright();
  28.                 } else if (direction == RockerViewtwo.Direction.DIRECTION_DOWN_LEFT) {
  29.                     Log.e("_now4", "当前方向:左下");
  30. //                    goiuleft();
  31.                     goiuout();
  32.                     goiudown();
  33.                 } else if (direction == RockerViewtwo.Direction.DIRECTION_DOWN_RIGHT) {
  34.                     Log.e("_now3", "当前方向:右下");
  35. //                    goiuright();
  36.                     goiuout();
  37.                     goiudown();
  38.                 } else if (direction == RockerViewtwo.Direction.DIRECTION_UP_LEFT) {
  39.                     Log.e("_now2", "当前方向:左上");
  40. //                    goiuleft();
  41.                     goiuout();
  42.                     goiuup();
  43.                 } else if (direction == RockerViewtwo.Direction.DIRECTION_UP_RIGHT) {
  44.                     Log.e("_now1", "当前方向:右上");
  45. //                    goiuright();
  46.                     goiuout();
  47.                     goiuup();
  48.                 }
  49.             }
  50.  
  51.             @Override
  52.             public void onFinish() {
  53.  
  54.             }
  55.         });
  56.         mRockerView.setOnAngleChangeListener(new RockerViewtwo.OnAngleChangeListener() {
  57.             @Override
  58.             public void onStart() {
  59.  
  60.             }
  61.  
  62.             @Override
  63.             public void angle(double angle) {
  64.                 Log.e("_now10", "当前角度:" + angle);
  65.             }
  66.  
  67.             @Override
  68.             public void onFinish() {
  69.  
  70.             }
  71.         });
  72.  
  73.         mRockerView.setOnDistanceLevelListener(new RockerViewtwo.OnDistanceLevelListener() {
  74.             @Override
  75.             public void onDistanceLevel(int level) {
  76.                 Log.e("_now11", "当前距离级别:" + level);
  77.             }
  78.         });
  79. ublic static void goiuout() {
  80.         gameWebView.loadUrl("javascript:downgetout()");
  81.     }
  82.  
  83.     public static void goiuleft() {
  84.         gameWebView.loadUrl("javascript:downleft()");
  85.     }
  86.  
  87.     public static void goiuup() {
  88.         gameWebView.loadUrl("javascript:downup()");
  89.     }
  90.  
  91.     public static void goiudown() {
  92.         gameWebView.loadUrl("javascript:downdrow()");
  93.     }
  94.  
  95.     public static void goiuright() {
  96.         gameWebView.loadUrl("javascript:downright()");
  97.     }
  98.  
  99.     public static void goiuok() {
  100.         gameWebView.loadUrl("javascript:downok()");
  101.     }
  102.  
  103.     public static void goiuesc() {
  104.         gameWebView.loadUrl("javascript:downesc()");
  105.     }


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


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


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



确定和取消就是两个按钮加上图片,然后调用javascript内的方法即可
到此,算是完成了吧
最后再次感谢用爱发电出教程的各位大佬,感谢感谢!!!
data.zip (79.93 KB, 下载次数: 6, 售价: 10 星屑)

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

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

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


评分

参与人数 3+3 收起 理由
a66294836 + 1 精品文章
微笑的迪妮莎 + 1 大佬牛皮
夏虫沉默 + 1 塞糖

查看全部评分

风碎于形

Lv2.观梦者

梦石
0
星屑
390
在线时间
48 小时
注册时间
2020-4-24
帖子
61
2
 楼主| 发表于 2021-11-16 17:34:55 | 只看该作者
本帖最后由 haiyin 于 2021-11-16 17:36 编辑

内向的我要给自己打气!!!
风碎于形
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
16
星屑
12065
在线时间
1413 小时
注册时间
2020-3-21
帖子
365

极短23获奖

3
发表于 2021-11-16 18:00:35 | 只看该作者
支持!(这方面的研究真的很缺乏,会webview的这些打包问题都是小问题,但对于不会webview的问题就很大,所以与两者都有关的教程很少……)
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
390
在线时间
48 小时
注册时间
2020-4-24
帖子
61
4
 楼主| 发表于 2021-11-16 18:55:53 | 只看该作者
仇九 发表于 2021-11-16 18:00
支持!(这方面的研究真的很缺乏,会webview的这些打包问题都是小问题,但对于不会webview的问题就很大,所 ...

感谢支持,网上关于webview的教程挺多的,所以我就忽略了这点了
风碎于形
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
7667
在线时间
1437 小时
注册时间
2018-12-16
帖子
2026
5
发表于 2021-11-16 20:02:20 | 只看该作者
本帖最后由 play337 于 2021-11-16 20:08 编辑

我可以問一些問題嗎?

關於...確定和取消就是兩個按鈕加上圖片,然後調用javascript內的方法即可
我試了一下.... 如果是按下去可以集氣...放開才放絕招的按鈕...這要怎麼設定呢?
可以加入 範例裡面嗎?

因為我看另一個大大:https://rpg.blue/thread-486591-1-1.html
插件也很棒 但是好像也沒有集氣按鈕範例...

回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
390
在线时间
48 小时
注册时间
2020-4-24
帖子
61
6
 楼主| 发表于 2021-11-16 21:29:46 | 只看该作者
本帖最后由 haiyin 于 2021-11-16 21:33 编辑
play337 发表于 2021-11-16 20:02
我可以問一些問題嗎?

關於...確定和取消就是兩個按鈕加上圖片,然後調用javascript內的方法即可


按钮有个onTouch事件,可以监听按下和松开,可以在按下的时候调用聚气js函数,松开的时候执行放大招的js函数,下面例子中gsq是按钮变量,换成你的按钮变量
  1. gsq.setOnTouchListener(new View.OnTouchListener() {
  2.             @Override
  3.             public boolean onTouch(View v, MotionEvent event) {
  4.                 int action = event.getAction();
  5.                 if (action == MotionEvent.ACTION_DOWN) {
  6. //按下
  7.                     gsq.setBackground(qxrd);
  8.                     gameWebView.loadUrl("javascript:downesc()");
  9.                 } else if (action == MotionEvent.ACTION_UP) {
  10. //松开
  11.                     gsq.setBackground(qx);
  12.                     gameWebView.loadUrl("javascript:downgetout()");
  13.                 }
  14.                 return false;
  15.             }
  16.         });
复制代码

点评

請問這腳本是貼在哪個檔案裏面呢?  发表于 2021-11-16 22:39
风碎于形
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
390
在线时间
48 小时
注册时间
2020-4-24
帖子
61
7
 楼主| 发表于 2021-11-16 22:00:44 | 只看该作者
本帖最后由 haiyin 于 2021-11-16 22:18 编辑
play337 发表于 2021-11-16 20:02
我可以問一些問題嗎?

關於...確定和取消就是兩個按鈕加上圖片,然後調用javascript內的方法即可


js鼠标的按下或松开事件分别是onmousedown和onmouseup事件,前提是你要得到A,B两个按钮,
然后给按钮设置onmousedown和onmouseup监听
怎么获取A,B这两个元素你可以问问那个大大,又或者在浏览器调试面板看看能不能获取到id。
不过大大既然写了点击事件,那松开事件应该也很靠近了吧,,,希望能帮到你。

点评

這是要我去改那個大大的插件嗎? 我的程度很差...實在不知道要怎麼著手 >_<  发表于 2021-11-16 22:40
风碎于形
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
390
在线时间
48 小时
注册时间
2020-4-24
帖子
61
8
 楼主| 发表于 2021-11-16 22:43:03 | 只看该作者
haiyin 发表于 2021-11-16 21:29
按钮有个onTouch事件,可以监听按下和松开,可以在按下的时候调用聚气js函数,松开的时候执行放大招的js ...

这个是android层的MainActivity里的,把你之前的按钮事件.setOnClickListener换成这个就行了
风碎于形
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
390
在线时间
48 小时
注册时间
2020-4-24
帖子
61
9
 楼主| 发表于 2021-11-16 22:44:16 | 只看该作者
haiyin 发表于 2021-11-16 21:29
按钮有个onTouch事件,可以监听按下和松开,可以在按下的时候调用聚气js函数,松开的时候执行放大招的js ...

首先确定我们说的都是android按钮...不是用js写出来的按钮...
风碎于形
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
390
在线时间
48 小时
注册时间
2020-4-24
帖子
61
10
 楼主| 发表于 2021-11-16 22:48:52 | 只看该作者
haiyin 发表于 2021-11-16 22:00
js鼠标的按下或松开事件分别是onmousedown和onmouseup事件,前提是你要得到A,B两个按钮,
然后给按钮设置 ...

要是大大没写松开的事件接口,你只能改,要么你加上去,要么大大加上去...要么换一个有写这些接口的...
确实看别人代码是最心碎的,每个人的风格都不同...
风碎于形
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-18 15:41

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表