詳解Android Libgdx中ScrollPane和Actor事件沖突問題的解決辦法
詳解Android Libgdx中ScrollPane和Actor事件沖突問題的解決辦法
在Libgdx的使用過程中,經(jīng)常會用到ScrollPane這個widget,來實現(xiàn)滑動效果, 如下所示:
但是如果想在上面的效果上添加一點擴展,比如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(); } }
實現(xiàn)效果如下:
如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
Android自定義控件實現(xiàn)不規(guī)則區(qū)域點擊事件
這篇文章主要為大家詳細介紹了Android自定義控件實現(xiàn)不規(guī)則區(qū)域點擊事件,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-05-05Android中使用socket通信實現(xiàn)消息推送的方法詳解
這篇文章主要介紹了Android中使用socket通信實現(xiàn)消息推送的方法,文中舉了一個消息發(fā)送端和一個消息接收端以及服務(wù)器端的例子來說明原理并且展示了客戶端的實現(xiàn),需要的朋友可以參考下2016-04-04Android MediaPlayer實現(xiàn)音樂播放器實例代碼
這篇文章主要介紹了Android MediaPlayer實現(xiàn)音樂播放器實例代碼的相關(guān)資料,需要的朋友可以參考下2017-01-01Android補間動畫基本使用(位移、縮放、旋轉(zhuǎn)、透明)
這篇文章主要介紹了Android補間動畫基本使用(位移、縮放、旋轉(zhuǎn)、透明),補間動畫就是原形態(tài)變成新形態(tài)時為了過渡變形過程,生成的動畫2018-05-05Android小程序?qū)崿F(xiàn)個人信息管理系統(tǒng)
這篇文章主要為大家詳細介紹了Android小程序?qū)崿F(xiàn)個人信息管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-05-05Android AlarmManager實現(xiàn)定時循環(huán)后臺任務(wù)
這篇文章主要為大家詳細介紹了Android AlarmManager實現(xiàn)定時循環(huán)后臺任務(wù),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-06-06