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

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




楼主 宇智波家老大  发布于 2017-03-02 09:05:00 +0800 CST  
2楼自占

楼主 宇智波家老大  发布于 2017-03-02 09:05:00 +0800 CST  
本教程由@氵骨G大神提供思路与剖析代码。特别鸣谢。


楼主 宇智波家老大  发布于 2017-03-02 09:09:00 +0800 CST  
再之前的教程授权


楼主 宇智波家老大  发布于 2017-03-02 09:10:00 +0800 CST  
part1:GUI的基础知识

GUI是modpe里很常用的东西。。。它就是我们用的很多js里的那些菜单,按钮,对话框之类的。
添加GUI会使用到java,如果说没有任何java的基础会不太方便学习。。。但是如果理解力比较强那么还是可以学会的(当然前提是英语基础不错。。)
在学习之要了解几个概念:
进程,是操作系统进行资源分配的最小的单位。这个资源包括的东西有很多,比如说CPU,内存什么的。
进程也就是程序在你的机器上的一次执行,也就是说你如果运行了一个程序,就相当于你启动了一个进程。
任何一个程序都一定有线程,特别是java,必须启动一个main。
一般来说一个CPU只能分配给一个进程。我们使用的机器,是在操作系统的管理下,所有正在运行的进程都轮流使用CPU,而这个轮流的时间是非常短的,这样使用者根本感觉不到CPU是轮流使用的,所以有着所有进程都在同时运行的错觉。

楼主 宇智波家老大  发布于 2017-03-02 09:10:00 +0800 CST  
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();

楼主 宇智波家老大  发布于 2017-03-02 09:11:00 +0800 CST  
part3:View - Layout

View,指的就是控件。比如按钮、输入框、菜单啥的,都属于控件。
Layout是“容器”。顾名思义,它是承载控件所用的“容器”。
我们需要把view,也就是控件,放到容器里。这个容器我们一般用的是layout(布局)。布局有很多类型,如线性布局等。
容器是继承于控件的,也就是说它可以嵌套,也就是在一个容器里添加容器。

楼主 宇智波家老大  发布于 2017-03-02 09:11:00 +0800 CST  
那么,在容器里添加控件,也就是:
layout.addView(view);
layout也就是容器名,addView,直译就是添加控件。view就是被添加的控件。
如果只有一个空间,则可以不创建容器。

楼主 宇智波家老大  发布于 2017-03-02 09:12:00 +0800 CST  
part4:GUI的运行

之前说过,线程是运行时绝对存在的。那么GUI也一样。它需要运行在UI线程上。
那么,我们之前获取的ctx,也就是主活动,也就要用来运行它。
那么,要加上:

ctx.runOnUiThread();

然后在后面的括号内写入代码。
那么,就是:

ctx.runOnUiThread(
new java.lang.Runnable(
run:function(){
}
))
剖析啥的需要学Java和Android,我们在这儿暂且不提。

楼主 宇智波家老大  发布于 2017-03-02 09:12:00 +0800 CST  
接下来,我们就可以调用View了。在上面添加按钮。
但是,我们要在哪里创建呢?
我们需要创建一个悬浮窗,因为如果创建到Minecraft的layout里,会影响游戏运行。
于是,我们需要创建一个悬浮窗。目的是在存在GUI的时候,也不影响游戏的运行。

var btnWindow = new android.widget.PopupWindow();

btnWindow就是这个悬浮窗。

楼主 宇智波家老大  发布于 2017-03-02 09:13:00 +0800 CST  
如果有多个控件,我们就需要容器了。但即使只有一个控件,新手建议是添加容器的好。以便熟悉它的运用。

楼主 宇智波家老大  发布于 2017-03-02 09:13:00 +0800 CST  
part5:添加按钮控件

下面,我们就可以添加按钮控件了。
var button = new android.widget.Button(ctx);
这样可以添加一个按钮控件。控件名为button。
接下来,我们可以设置它的属性。这里用添加字来举例。
button.setText("G");
可以看到,我在button上添加了G字符。
下面是很重要的环节,我们需要创建一个监听器。
什么是监听器呢?
也就是说,当你做出了一个特定活动时,触发一个内容。可以当做是ModPE里的钩子函数。
因为我们使用的是手机,所以监听器的触发就是点击GUI。如果是PC的话,还可以使用键盘,鼠标等多种来触发监听器。

楼主 宇智波家老大  发布于 2017-03-02 09:14:00 +0800 CST  
但监听器的触发也是分很多种的。比如按下时触发、松开时触发、长按时触发等等……这里我们仅用按下时触发来举例。
button.setOnClickListener(new android.view.View.OnClickListener({
onClick: function(viewarg){
//触发内容
}
}))
这个就是监听器。你可以在监听器中写上你需要执行的事件。它会在这个GUI被按下时触发。

楼主 宇智波家老大  发布于 2017-03-02 09:14:00 +0800 CST  
但是,每个手机的大小一般是不同的,比如相同大小的GUI在iPhone大小的手机上显示很大,但是在iPad大小上就很小了。
那么,我们就要有自适应屏幕的算法。也就是说,把每个手机屏幕都分成固定个数的网格。那么这时候你再用这个函数来设置GUI的位置、大小,他们在不同设备上的比例也是相同的。
function dip2px(ctx, dips){
return Math.ceil(dips * ctx.getResources().getDisplayMetrics().density);
}
这是个挺老的算法,当然放在哪个位置都可以。这是套独立的自定义函数。

楼主 宇智波家老大  发布于 2017-03-02 09:14:00 +0800 CST  
然后要设置btnWindow的内容视图(ContentView)为layout。
btnWindow.setContentView(layout);

接下来,我们就可以设置GUI的大小了。
btnWindow.setWidth(dip2px(ctx,宽度));
btnWindow.setHeight(dip2px(ctx,高度));
dip2px就是刚刚的算法。宽度高度根据你的需要来自定义。

楼主 宇智波家老大  发布于 2017-03-02 09:15:00 +0800 CST  
那么接下来就是最后一部分了:设置显示位置。比如说在左右,上下等。
btnWindow.showAtLocation(ctx.getWindow().getDecorView(), android.view.Gravity.TOP | android.view.Gravity.RIGHT,x,y);
那些Gravity后面的TOP,RIGHT可以修改,我这里写的是在右边。然后最后的x和y就是坐标。
左就是LEFT,下是BOTTOM。不分前后顺序,注意大写。
如果填的是LEFT(左)与BOTTOM(下),那么它的原点就在左下角。你可以把手机看成一个平面直角坐标系,x增在右,y增在上。
如果填的是TOP与RIGHT,原点就在右上角。X增和Y增相反。

楼主 宇智波家老大  发布于 2017-03-02 09:15:00 +0800 CST  
当然,你可以在run:function(){}里再加一个try,这样在GUI出现错误的时候不会报错,而是print出错误。
try的格式是:
try{
}
catch(err)
{
}
也就是说,当try发生了错误之后,执行catch里的内容。一般写:
catch(err)
{
print(err);
}
err就是发生的错误,当错误后,它会print出来。

楼主 宇智波家老大  发布于 2017-03-02 09:16:00 +0800 CST  
TXT链接http://pan.baidu.com/share/link?shareid=1051610096&uk=1582428994

楼主 宇智波家老大  发布于 2017-03-02 09:25:00 +0800 CST  
OK,我将再准备一下图片button、用base64实现不需要带材质包材质的GUI和图片转base64……

楼主 宇智波家老大  发布于 2017-03-02 22:01:00 +0800 CST  
那么,在学习了添加GUI后,我们将把给GUI添加图片作为单独的一章讲解。
它的教程将分为三部分:常规带材质GUI,base64图片GUI,图片转base64。
首先我们来讲带材质的GUI。

楼主 宇智波家老大  发布于 2017-03-05 14:43:00 +0800 CST  

楼主:宇智波家老大

字数:4951

发表时间:2017-03-02 17:05:00 +0800 CST

更新时间:2019-01-29 16:00:33 +0800 CST

评论数:55条评论

帖子来源:百度贴吧  访问原帖

 

热门帖子

随机列表

大家在看