扫描二维码关注官方公众号
返回列表
+ 发新帖
查看: 191|回复: 0

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

[复制链接]
累计送礼:
0 个
累计收礼:
0 个
  • TA的每日心情
    开心
    2025-2-4 02:05
  • 签到天数: 110 天

    连续签到: 2 天

    [LV.6]常住居民II

    2328

    主题

    395

    回帖

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    6
    卡币
    10477
    OK点
    16
    推广点
    0
    同能卷
    0
    积分
    13228

    灌水之王

    发表于 2024-3-4 01:54:47 | 显示全部楼层 |阅读模式
    更新了简洁版
    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在线咨询功能删除,谢谢。

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
    天天去同能,天天有童年!
    回复 送礼论坛版权

    使用道具 举报

    文明发言,和谐互动
    文明发言,和谐互动
    高级模式
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    幸运抽奖

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

    立即查看

    聊天机器人
    Loading...

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

    GMT+8, 2025-3-11 00:42 , Processed in 0.140427 second(s), 54 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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