加个控件来试试

代码摘自源码的tests里面的libgdx-master\tests\gdx-tests\src\com\badlogic\gdx\tests\UISimpleTest.java ,后期的分析都建立在此目录里面,分析
所有的tests demo


添加一个TextButton:


TextButton button = new TextButton("not Checked", skin);
button.setPosition(0, 0);
button.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent arg0, Actor arg1) {
// TODO Auto-generated method stub
// arg0.
if (arg1 instanceof TextButton) {
TextButton tmp = (TextButton) arg1;
if (tmp.isChecked()) {
button.setText("Checked");
} else {
button.setText("not Checked");
}
}


}
});

 代码很简单:
 生成一个textbutton,设置位置,增加一个listener,我们这节关注点在addListener接口。
 那么我们来分析跟踪下addListener函数:
   所有的控件都是继承自actor,因此实际也是演员,因此我们去actor里面找addListener接口。
    public boolean addListener (EventListener listener) {
if (!listeners.contains(listener, true)) {
listeners.add(listener);
return true;
}
return false;
}
代码简单的将listener 加入到actor的监听里面,继续查找listeners的调用地方,去看看
notify-->fire-->
然后我们回到stage类里面:
Stage extends InputAdapter  因此舞台可以接收输入。
Gdx.input.setInputProcessor(stage); 这句便是会将舞台注册到输入设备的进程内。
回到Stage里面:
touchDown
touchDragged
touchUp
keyDown
keyUp
我们来看下touchDown 函数:
Actor target = hit(stageCoords.x, stageCoords.y, true);
if (target == null) target = root;
target.fire(event);
这里hit便是检测点击到哪个控件了,如果为空,则赋值为当前的root,调用fire接口将操作传递下去。这样子
fire-->notify 则会调用
for (int i = 0, n = listeners.size; i < n; i++) {
EventListener listener = listeners.get(i);
if (listener.handle(event)) {
event.handle();
完成回调传递。

 ChangeListener implements EventListener {
public boolean handle (Event event) {
if (!(event instanceof ChangeEvent)) return false;
changed((ChangeEvent)event, event.getTarget());
return false;
}
可以看到handle 函数的处理过程。分析此章节完成。

你可能感兴趣的:(android,源码分析,libgdx)