转自:http://www.apkbus.com/android-60569-1-1.html
讲源代码下载:
edu.nju.wsj.libgdx.rar(3.84 MB, 下载次数: 104)
这一讲作为外篇四,给大家介绍一些libgdx中常用的控件。事实上,libgdx中的的动作效果和与用户的交互基本依赖于演员类Actor,而libgdx中的控件不出意外的都直接或者间接继承自Actor。
首先我们来看看标签类,Label:

我们发现Label最终是继承自演员类Actor,其实我们可以发现,libgdx中我们常用的控件都集中在com.badlogic.gdx.scenes,scene2d.ui这个包中。这里说一句题外话。从上面的图中我们可以看到Label实现了一个Layout接口。我们先来看看Layout接口

我们可以看到,我们常用的这些UI控件,包括我曾经给大家介绍过的Button,Slider还有Window都实现了这个所谓的Layout接口。这个接口有以下会很多方法,大家不必深究,很多方法是在舞台绘制的时候由Actor的父控件自动调用的,大家稍微了解一点就可以了。

简单的说,Layout方法提供了一些让演员Actor在父控件(如Group,Window或者Stage等等)中大小的适应方法,比如取得一些默认的宽度和长度等等,我们不必在此深究,需要用的时候再查查文档即可,深究起来就非常复杂了。
我们返回来继续讲Label的使用方法:

我们可以看到,构造函数中的CharSequence其实就是我们要显示的内容,Skin或者Label.LabelStyle则指定Label的样式。这里我们用最简单的第一个构造函数来实现一个Label。
其中用到了Label.LabelStyle类,我们再来看一下。

既然知道了怎么构造一个Label,我们就在我们的代码中添加一个Label,看看实际的效果好了。这次我们的代码在十三讲的基础上进行修改。在MyGame.java中添加一个Label实例:
- Label label;
还是在show()函数中进行初始化:
- label=new Label("Testin",new Label.LabelStyle(bf,new Color(0, 0, 1, 1)));
我们在原来的程序中添加过一个BitmapFont字体实例bf,这里就直接拿来用了,至于Color类的使用也非常简单,构造函数中的四个参数即为我们熟悉的RGBA,并且值都在0-1之间。
初始化完成后我们加入这个Label,顺便设置了一下label的位置。
- label.x=300;
- label.y=300;
运行一下看看效果
:
字有点小,我们可以把字体变得大一点:
- //字体放大五倍
- bf.setScale(5f);
重新运行一下,这次足够的大了:

除此之外,我们还可以直接将Label加入Button,因为Button也继承自Group,可以作为一个父控件使用,不把label加入stage而是加入Button中,并且将设置label位置的代码删去,并且修改Button的位置,这里注意,对于Actor设置其位置,都是相对父控件而言的。
- //设置Button的位置
- button.x=Gdx.graphics.getWidth()/3;
- button.addActor(label);
运行看看效果,这里我们修改了字体的大小,为了看起来更合适一些。

接下来我们再介绍一个控件CheckBox,看到这个名字大家一定不会陌生,这么类SDK也有,相当于一个选择是或者否的控件,我们还是来看看CheckBox的介绍:

我们可以看到,CheckBox继承自Button,那我们就可以确信,它的很多性质都和Button类似,而Button的使用我们大家一定很了解了。
依然来看看其构造方法:

我们发现,和我们刚才介绍的Label的构造方法非常类似,都需要一个某某Style的类来指定这个控件的样式,我们就顺势看看CheckBox.CheckBoxStyle这个样式类:

很显然,我们用最后一个构造函数来构造这个CheckBox.CheckBoxStyle,第一个参数是设定了CheckBox没有被勾选时的图片,第二个自然就是被勾选时的图片了,后面两个大家很熟悉,一个是字体BitmapFont实例,后一个是颜色Color.
那我们就构造一个CheckBox,首先我做了两张图片,分别代表CheckBox勾选和未勾选时的图片:

我们在MyGame.java中添加一个CheckBox变量:
- CheckBox checkbox;
在show()中进行初始化:
- TextureRegion checked=new TextureRegion(new Texture(Gdx.files.internal("checked.png")));
- TextureRegion unchecked=new TextureRegion(new Texture(Gdx.files.internal("unchecked.png")));
- checkbox=new CheckBox("Testin",new CheckBox.CheckBoxStyle(checked,unchecked,bf,new Color(0, 1, 0, 1)));
加入舞台:
- stage.addActor(checkbox);
运行一下:


上面两张图分别是勾选和未勾选时的样子,右边的绿色的“Testin”字样其实是CheckBox的一部分。
至于按下的回调函数,由于CheckBox继承自Button,因此可以用Button一样的方法设置一个监听器,并从成员isPressed中获取当前状态。