minecraftpe吧 关注:638,729贴子:15,084,284

【教程】太守的GUI教程(基础入门)

只看楼主收藏回复

哈喽啊本尊就是你们敬爱的太守爸爸
不接受反驳意见靴靴
这次为了不弃坑我直接写完辣
快夸本尊
通俗易懂保证轻松入门。




来自Android客户端1楼2017-03-02 09:05回复
    2楼自占


    星座王
    点亮12星座印记,去领取
    活动截止:2100-01-01
    去徽章馆》
    来自Android客户端2楼2017-03-02 09:05
    回复
      快滚


      IP属地:江西来自Android客户端3楼2017-03-02 09:06
      回复
        本教程由@氵骨G 大神提供思路与剖析代码。特别鸣谢。


        星座王
        点亮12星座印记,去领取
        活动截止:2100-01-01
        去徽章馆》
        来自Android客户端6楼2017-03-02 09:09
        回复
          再之前的教程授权


          星座王
          点亮12星座印记,去领取
          活动截止:2100-01-01
          去徽章馆》
          来自Android客户端7楼2017-03-02 09:10
          回复
            part1:GUI的基础知识
            GUI是modpe里很常用的东西。。。它就是我们用的很多js里的那些菜单,按钮,对话框之类的。
            添加GUI会使用到java,如果说没有任何java的基础会不太方便学习。。。但是如果理解力比较强那么还是可以学会的(当然前提是英语基础不错。。)
            在学习之要了解几个概念:
            进程,是操作系统进行资源分配的最小的单位。这个资源包括的东西有很多,比如说CPU,内存什么的。
            进程也就是程序在你的机器上的一次执行,也就是说你如果运行了一个程序,就相当于你启动了一个进程。
            任何一个程序都一定有线程,特别是java,必须启动一个main。
            一般来说一个CPU只能分配给一个进程。我们使用的机器,是在操作系统的管理下,所有正在运行的进程都轮流使用CPU,而这个轮流的时间是非常短的,这样使用者根本感觉不到CPU是轮流使用的,所以有着所有进程都在同时运行的错觉。


            星座王
            点亮12星座印记,去领取
            活动截止:2100-01-01
            去徽章馆》
            来自Android客户端8楼2017-03-02 09:10
            回复
              part2:Activity
              Activity,在百度百科里的义项是:
              Activity是Android组件中最基本也是最为常见用的四大组件(Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器)之一。
              Activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务。
              Activity中所有操作都与用户密切相关,是一个负责与用户交互的组件,可以通过setContentView(View)来显示指定控件。
              在一个android应用中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。Activity之间通过Intent进行通信。
              (以上来自百度百科)
              那么我们就可以知道,Activity可以提供一个视窗,也就是一个能看到的窗口。所以我们如果要写GUI,就要获取主Activity。但是我们在ModPE中写GUI是不需要创建Activity的,因为它是事先已经被创建过了的。所以,我们直接在Activity上添加控件就可以了。
              虽然Activity是已经存在的,但它没被赋值为一个固定的量。ModPE是不能自动获取Activity的。于是,我们就需要用代码来获取它的Activity。
              var ctx = com.mojang.minecraftpe.MainActivity.currentMainActivity.get();


              星座王
              点亮12星座印记,去领取
              活动截止:2100-01-01
              去徽章馆》
              来自Android客户端9楼2017-03-02 09:11
              回复
                part3:View - Layout
                View,指的就是控件。比如按钮、输入框、菜单啥的,都属于控件。
                Layout是“容器”。顾名思义,它是承载控件所用的“容器”。
                我们需要把view,也就是控件,放到容器里。这个容器我们一般用的是layout(布局)。布局有很多类型,如线性布局等。
                容器是继承于控件的,也就是说它可以嵌套,也就是在一个容器里添加容器。


                星座王
                点亮12星座印记,去领取
                活动截止:2100-01-01
                去徽章馆》
                来自Android客户端10楼2017-03-02 09:11
                回复
                  那么,在容器里添加控件,也就是:
                  layout.addView(view);
                  layout也就是容器名,addView,直译就是添加控件。view就是被添加的控件。
                  如果只有一个空间,则可以不创建容器。


                  星座王
                  点亮12星座印记,去领取
                  活动截止:2100-01-01
                  去徽章馆》
                  来自Android客户端11楼2017-03-02 09:12
                  收起回复
                    part4:GUI的运行
                    之前说过,线程是运行时绝对存在的。那么GUI也一样。它需要运行在UI线程上。
                    那么,我们之前获取的ctx,也就是主活动,也就要用来运行它。
                    那么,要加上:
                    ctx.runOnUiThread();
                    然后在后面的括号内写入代码。
                    那么,就是:
                    ctx.runOnUiThread(
                    new java.lang.Runnable(
                    run:function(){
                    }
                    ))
                    剖析啥的需要学Java和Android,我们在这儿暂且不提。


                    星座王
                    点亮12星座印记,去领取
                    活动截止:2100-01-01
                    去徽章馆》
                    来自Android客户端12楼2017-03-02 09:12
                    收起回复
                      接下来,我们就可以调用View了。在上面添加按钮。
                      但是,我们要在哪里创建呢?
                      我们需要创建一个悬浮窗,因为如果创建到Minecraft的layout里,会影响游戏运行。
                      于是,我们需要创建一个悬浮窗。目的是在存在GUI的时候,也不影响游戏的运行。
                      var btnWindow = new android.widget.PopupWindow();
                      btnWindow就是这个悬浮窗。


                      星座王
                      点亮12星座印记,去领取
                      活动截止:2100-01-01
                      去徽章馆》
                      来自Android客户端13楼2017-03-02 09:13
                      回复
                        如果有多个控件,我们就需要容器了。但即使只有一个控件,新手建议是添加容器的好。以便熟悉它的运用。


                        星座王
                        点亮12星座印记,去领取
                        活动截止:2100-01-01
                        去徽章馆》
                        来自Android客户端14楼2017-03-02 09:13
                        回复
                          part5:添加按钮控件
                          下面,我们就可以添加按钮控件了。
                          var button = new android.widget.Button(ctx);
                          这样可以添加一个按钮控件。控件名为button。
                          接下来,我们可以设置它的属性。这里用添加字来举例。
                          button.setText("G");
                          可以看到,我在button上添加了G字符。
                          下面是很重要的环节,我们需要创建一个监听器。
                          什么是监听器呢?
                          也就是说,当你做出了一个特定活动时,触发一个内容。可以当做是ModPE里的钩子函数。
                          因为我们使用的是手机,所以监听器的触发就是点击GUI。如果是PC的话,还可以使用键盘,鼠标等多种来触发监听器。


                          星座王
                          点亮12星座印记,去领取
                          活动截止:2100-01-01
                          去徽章馆》
                          来自Android客户端15楼2017-03-02 09:14
                          回复
                            但监听器的触发也是分很多种的。比如按下时触发、松开时触发、长按时触发等等……这里我们仅用按下时触发来举例。
                            button.setOnClickListener(new android.view.View.OnClickListener({
                            onClick: function(viewarg){
                            //触发内容
                            }
                            }))
                            这个就是监听器。你可以在监听器中写上你需要执行的事件。它会在这个GUI被按下时触发。


                            星座王
                            点亮12星座印记,去领取
                            活动截止:2100-01-01
                            去徽章馆》
                            来自Android客户端16楼2017-03-02 09:14
                            回复
                              但是,每个手机的大小一般是不同的,比如相同大小的GUI在iPhone大小的手机上显示很大,但是在iPad大小上就很小了。
                              那么,我们就要有自适应屏幕的算法。也就是说,把每个手机屏幕都分成固定个数的网格。那么这时候你再用这个函数来设置GUI的位置、大小,他们在不同设备上的比例也是相同的。
                              function dip2px(ctx, dips){
                              return Math.ceil(dips * ctx.getResources().getDisplayMetrics().density);
                              }
                              这是个挺老的算法,当然放在哪个位置都可以。这是套独立的自定义函数。


                              星座王
                              点亮12星座印记,去领取
                              活动截止:2100-01-01
                              去徽章馆》
                              来自Android客户端17楼2017-03-02 09:14
                              回复