gpt4 book ai didi

android - 为什么我的标签栏会破坏我的 AndEngine Activity ?

转载 作者:太空宇宙 更新时间:2023-11-03 13:34:06 25 4
gpt4 key购买 nike

我的 Android 应用程序有一个选项卡栏,它使用 Intent 来启动每个选项卡中的内容,如 Android 的 API 演示中所示 example .我在其中一个选项卡下放置了一个 AndEngine Activity 。我的第一个问题是:这是一个合理的想法吗?或者,如果我使用的是 AndEngine,在 AndEngine 中实现我的应用程序的整个 UI 是否更好?

假设我还没有进入非启动器,我遇到的具体问题如下。这个 AndEngine Activity ——我在基于选项卡的应用程序中加入的 Activity ——是 AndEngine PinchZoom example 的简化版本.它运行良好,直到您离开选项卡然后再返回。此时, View 会重新出现,但您无法再滚动或缩放。

这是我的 Activity 课。如果您也想查看选项卡栏类,请告诉我。如您所见,我尝试在用户离开选项卡时关闭各种监听器和检测器,并在用户返回时将它们重新打开。但我已经确定,使用断点,当我返回选项卡后触摸屏幕时,不会调用 onSceneTouchEvent。是否有什么东西干预并捕获了我的触摸事件?还是有什么东西变得不活跃,需要恢复活力?

我也posted AndEngine 论坛上的这个问题。

编辑:

感谢您的建议,纪尧姆。没错,当用户返回到选项卡时,onResumeGame 不会被调用。我以为我已经检查过了,但我一定是把可滚动的图形同时放在两个选项卡下弄糊涂了。 onResume 方法在此时被调用,而 onCreateGame 则没有。因此,我更改了代码,以便在 onResume 中打开触摸检测器。这个方法肯定会在我想要的时候被调用,所以我想这是进步,但是当我返回选项卡后触摸屏幕时 onSceneTouchEvent 仍然没有被触发。更新后的代码如下,更改标记为 //NEW

public class HomeActivity extends SimpleBaseGameActivity implements IOnSceneTouchListener,
IScrollDetectorListener, IPinchZoomDetectorListener {
private static final int CAMERA_WIDTH = 480;
private static final int CAMERA_HEIGHT = 628;

private boolean mInitialised = false; // NEW
private Scene mScene;
private ZoomCamera mZoomCamera;
private ITexture mTexture;
private ITextureRegion mGrassTextureRegion;
private SurfaceScrollDetector mScrollDetector;
private PinchZoomDetector mPinchZoomDetector;
private float mPinchZoomStartedCameraZoomFactor;

@Override
public EngineOptions onCreateEngineOptions() {
this.mZoomCamera = new ZoomCamera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);
final EngineOptions engineOptions = new EngineOptions(true,
ScreenOrientation.PORTRAIT_FIXED,
new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), this.mZoomCamera);

if (MultiTouch.isSupported(this)) {
if (MultiTouch.isSupportedDistinct(this)) {
Toast.makeText(this, "MultiTouch detected.", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(
this,
"MultiTouch detected, but your device has problems distinguishing between "
+ "fingers.", Toast.LENGTH_LONG).show();
}
} else {
Toast.makeText(this, "Sorry your device does NOT support MultiTouch!",
Toast.LENGTH_LONG).show();
}

return engineOptions;
}

@Override
public void onCreateResources() {
try {
this.mTexture = new BitmapTexture() {
@Override
protected InputStream onGetInputStream() throws IOException {
return getAssets().open("gfx/background_grass.png");
}
}.load(this.getTextureManager());
this.mGrassTextureRegion = TextureRegionFactory.extractFromTexture(mTexture);
} catch (IOException e) {
Debug.e(e);
}
}

@Override
public Scene onCreateScene() {
this.mEngine.registerUpdateHandler(new FPSLogger());
this.mScene = new Scene();
this.mScene.setOnAreaTouchTraversalFrontToBack();
this.mScene.setBackground(new Background(0.09804f, 0.6274f, 0.8784f));

// Calculate the coordinates for the sprite, so it's centered on the
// camera.
final float centerX = (CAMERA_WIDTH - this.mGrassTextureRegion.getWidth()) / 2;
final float centerY = (CAMERA_HEIGHT - this.mGrassTextureRegion.getHeight()) / 2;

// Create the sprite and add it to the scene.
final Sprite grass = new Sprite(centerX, centerY, this.mGrassTextureRegion,
this.getVertexBufferObjectManager());
this.mScene.attachChild(grass);

enableTouchDetectors(); // NEW
mInitialised = true; // NEW

return this.mScene;
}

@Override
public void onPause() {
this.mScene.setTouchAreaBindingOnActionDownEnabled(false);
this.mScene.setOnSceneTouchListener(null);
this.mPinchZoomDetector = null;
this.mScrollDetector = null;
super.onPause();
}

// NEW method
@Override
public void onResume() {
super.onResume();
// If returning to the tab, switch the touch detectors back on.
if (mInitialised) {
enableTouchDetectors();
}
}

// This method has been removed since Guillaume's answer.
// @Override
// public void onResumeGame() {
// super.onResumeGame();
// this.mScrollDetector = new SurfaceScrollDetector(this);
// this.mPinchZoomDetector = new PinchZoomDetector(this);
// this.mScene.setOnSceneTouchListener(this);
// this.mScene.setTouchAreaBindingOnActionDownEnabled(true);
// }

@Override
public void onScrollStarted(final ScrollDetector pScollDetector, final int pPointerID,
final float pDistanceX, final float pDistanceY) {
}

@Override
public void onScroll(final ScrollDetector pScollDetector, final int pPointerID,
final float pDistanceX, final float pDistanceY) {
final float zoomFactor = this.mZoomCamera.getZoomFactor();
this.mZoomCamera.offsetCenter(-pDistanceX / zoomFactor, -pDistanceY / zoomFactor);
}

@Override
public void onScrollFinished(final ScrollDetector pScollDetector, final int pPointerID,
final float pDistanceX, final float pDistanceY) {
}

@Override
public void onPinchZoomStarted(final PinchZoomDetector pPinchZoomDetector,
final TouchEvent pTouchEvent) {
this.mPinchZoomStartedCameraZoomFactor = this.mZoomCamera.getZoomFactor();
}

@Override
public void onPinchZoom(final PinchZoomDetector pPinchZoomDetector,
final TouchEvent pTouchEvent, final float pZoomFactor) {
this.mZoomCamera.setZoomFactor(this.mPinchZoomStartedCameraZoomFactor * pZoomFactor);
}

@Override
public void onPinchZoomFinished(final PinchZoomDetector pPinchZoomDetector,
final TouchEvent pTouchEvent, final float pZoomFactor) {
}

@Override
public boolean onSceneTouchEvent(final Scene pScene, final TouchEvent pSceneTouchEvent) {
this.mPinchZoomDetector.onTouchEvent(pSceneTouchEvent);

if (this.mPinchZoomDetector.isZooming()) {
this.mScrollDetector.setEnabled(false);
} else {
if (pSceneTouchEvent.isActionDown()) {
this.mScrollDetector.setEnabled(true);
}
this.mScrollDetector.onTouchEvent(pSceneTouchEvent);
}

return true;
}

// NEW method
private void enableTouchDetectors() {
this.mScrollDetector = new SurfaceScrollDetector(this);
this.mPinchZoomDetector = new PinchZoomDetector(this);
this.mScene.setOnSceneTouchListener(this);
this.mScene.setTouchAreaBindingOnActionDownEnabled(true);
}
}

最佳答案

汤米:我在自己的应用程序中遇到了同样的情况,其中我需要三个选项卡,其中一个是 andEngine。但我发现 TabActivity 没有像触发新 Intent 那样重新初始化选项卡。如果您记录其他选项卡之一的生命周期,您会发现这不仅仅是一个和引擎的东西,而是一个 TabActivity 的东西。关于这个问题,这里有一个非常有用的线程: http://groups.google.com/group/android-developers/browse_thread/thread/d89f1d5f913bb6f7

包括将每个选项卡设置为单个 Activity 中的 View 的示例。链接在这里。我使用了来自 commonsware myeslf 的代码,发现他们的库和示例经过良好测试且质量很高。 https://github.com/commonsguy/cw-android/tree/master/Fancy/Tab/

无论如何,如果不重写 Andengine 的核心类,我找不到让 tabactivity 工作的方法,这超出了我在项目中可以做的范围。

所以我做的解决方法是:我自己将选项卡构建为三个共享页脚的 Activity ,让您可以在它们之间切换。我不得不对历史进行一些修改,并覆盖后退按钮的行为以在适当的时候保留在选项卡中。此外,我在 Android list 中使用了一个 Intent 标志:

android:launchMode="singleInstance"

通过确保只创建一个 Andengine 选项卡实例,帮助应用顺利运行。

希望这对您有所帮助。如果 andengine 能够兼容 TabActivity 就好了,但我认为目前还没有完全兼容。

关于android - 为什么我的标签栏会破坏我的 AndEngine Activity ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9241054/

25 4 0