Android Libgdx 에서 Scrollpane 과 Actor 이벤트 충돌 문 제 를 해결 하 는 방법
Libgdx 를 사용 하 는 과정 에서 스크롤 패 널 이라는 widget 을 자주 사용 하여 미끄럼 효 과 를 실현 합 니 다.다음 과 같 습 니 다.
그러나 위의 효과 에 확장 자 를 추가 하려 면 스크롤 패 널 의 Actor 가 스크롤 패 널 에서 이동 하여 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();
}
}
실현 효 과 는 다음 과 같다.궁금 한 점 이 있 으 시 면 메 시 지 를 남기 거나 본 사이트 의 커 뮤 니 티 에 가서 토론 을 교류 하 세 요.읽 어 주 셔 서 감사합니다. 도움 이 되 셨 으 면 좋 겠 습 니 다.본 사이트 에 대한 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.