详解Android Libgdx中ScrollPane和Actor事件冲突问题的解决办法

时间:2021-05-19

详解Android Libgdx中ScrollPane和Actor事件冲突问题的解决办法

在Libgdx的使用过程中,经常会用到ScrollPane这个widget,来实现滑动效果, 如下所示:

但是如果想在上面的效果上添加一点扩展,比如ScrollPane中的Actor可以从ScrollPane中移出来,并添加到Stage中,则需要添加额外的逻辑

具体代码参考如下:

/** * Created by Danny.姜 on 17/7/26. */public class TestAdapter extends ApplicationAdapter { Stage stage; ScrollPane scrollPane; Table table; private float lastStageX; private float lastStageY; ActorGestureListener actorGestureListener; private InputListener inputListener = new InputListener() { @Override public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { Log.e("DANNY", "actor touch down"); if (pointer == 0) { lastStageX = event.getStageX(); lastStageY = event.getStageY(); inStage = false; } return true; } @Override public void touchDragged(InputEvent event, float x, float y, int pointer) { Log.e("DANNY", "actor touch dragging"); Actor actor = event.getListenerActor(); if (cancelTouchFocus) { float currentX = event.getStageX(); float currentY = event.getStageY(); actor.moveBy(currentX - lastStageX, currentY - lastStageY); lastStageX = currentX; lastStageY = currentY; if (!inStage) { Vector2 vector2 = actor.localToStageCoordinates(new Vector2()); actor.setPosition(vector2.x, vector2.y); stage.addActor(actor); stage.cancelTouchFocusExcept(this, actor); inStage = true; } } } @Override public void touchUp(InputEvent event, float x, float y, int pointer, int button) { Log.e("DANNY", "actor touch up"); cancelTouchFocus = false; } }; @Override public void create() { super.create(); stage = new Stage(); stage.setDebugAll(true); Gdx.input.setInputProcessor(stage); actorGestureListener = new ActorGestureListener() { @Override public boolean longPress(Actor actor, float x, float y) { Log.e("DANNY", "actor gesture listener long pressed"); cancelTouchFocus = true; return super.longPress(actor, x, y); } }; table = new Table(); scrollPane = new ScrollPane(table, new ScrollPane.ScrollPaneStyle()); scrollPane.setSize(stage.getWidth(), 500); scrollPane.setScrollingDisabled(false, true); scrollPane.setCancelTouchFocus(false); scrollPane.setSmoothScrolling(true); scrollPane.setFlingTime(0); stage.addActor(scrollPane); initTable(); } private boolean cancelTouchFocus = false; private boolean inStage = false; private void initTable() { for (int i = 0; i < 10; i++) { BaseGdxActor actor = new BaseGdxActor(new TextureRegion( new Texture("badlogic.jpg"))); table.add(actor).width(actor.getWidth()).pad(10); actor.addListener(actorGestureListener); actor.addListener(inputListener); } } @Override public void render() { super.render(); Gdx.gl.glClearColor(1, 1, 1, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); stage.act(); stage.draw(); }}

实现效果如下:

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章