- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在我的游戏中实现 AdMob,但存在一个问题:关闭 rewarderAd 视频后,游戏不响应触摸,也不记录任何内容。
我在 Web 上进行了搜索,找到了在广告回调中插入 gameView.requestFocus();
的建议,但它不起作用。
MyGdxGame.java(核心):
import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.InputProcessor;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.graphics.g3d.Material;
import com.badlogic.gdx.graphics.g3d.ModelBatch;
import com.badlogic.gdx.graphics.g3d.attributes.BlendingAttribute;
import com.badlogic.gdx.graphics.g3d.attributes.FloatAttribute;
import com.badlogic.gdx.graphics.g3d.attributes.TextureAttribute;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.math.Vector3;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.Label;
import com.badlogic.gdx.utils.Align;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.Pool;
import com.badlogic.gdx.utils.viewport.FitViewport;
import com.badlogic.gdx.utils.viewport.Viewport;
public class MyGdxGame extends ApplicationAdapter implements InputProcessor {
public final static float CARD_WIDTH = 1f;
public final static float CARD_RATIO_W_H = 277f / 200f;
public final static float CARD_HEIGHT = CARD_WIDTH * CARD_RATIO_W_H;
public final static float MINIMUM_VIEWPORT_SIZE = 7f;
float widthPixel;
float heightPixel;
float widthPixel1Card;
float heightPixel1Card;
CardBatch cards;
CardActions actions;
Vector3 vector3touch;
Stage stage;
Label labelStart;
ModelBatch modelBatch;
TextureAtlas atlas;
ShapeRenderer shapeRenderer;
OrthographicCamera cam;
private Viewport viewport;
private IActivityRequestHandler myRequestHandler;
public MyGdxGame(IActivityRequestHandler handler) {
myRequestHandler = handler;
}
@Override
public void create () {
widthPixel = Gdx.graphics.getWidth();
heightPixel = Gdx.graphics.getHeight();
widthPixel1Card = widthPixel / MINIMUM_VIEWPORT_SIZE;
heightPixel1Card = widthPixel1Card * CARD_RATIO_W_H;
shapeRenderer = new ShapeRenderer();
modelBatch = new ModelBatch();
atlas = new TextureAtlas("carddeck.atlas");
Material material = new Material(
TextureAttribute.createDiffuse(atlas.getTextures().first()),
new BlendingAttribute(false, 1f),
FloatAttribute.createAlphaTest(0.2f));
cards = new CardBatch(material);
cam = new OrthographicCamera(MINIMUM_VIEWPORT_SIZE, MINIMUM_VIEWPORT_SIZE * CARD_RATIO_W_H);
viewport = new FitViewport(MINIMUM_VIEWPORT_SIZE, MINIMUM_VIEWPORT_SIZE * CARD_RATIO_W_H, cam);
Gdx.input.setInputProcessor(this);
actions = new CardActions();
vector3touch = new Vector3();
stage = new Stage(new FitViewport(Gdx.graphics.getWidth(), Gdx.graphics.getWidth() * CARD_RATIO_W_H));
Texture texture = new Texture(Gdx.files.internal("arial32.png"), true); // true enables mipmaps
texture.setFilter(Texture.TextureFilter.MipMapLinearNearest, Texture.TextureFilter.Linear); // linear filtering in nearest mipmap image
BitmapFont fontDistanceField = new BitmapFont(Gdx.files.internal("arial32.fnt"), new TextureRegion(texture), false);
Label.LabelStyle labelStyleDistanceField = new Label.LabelStyle();
labelStyleDistanceField.font = fontDistanceField;
labelStart = new Label("Touch to start", labelStyleDistanceField);
labelStart.setSize(widthPixel/2, heightPixel1Card);
labelStart.setPosition(widthPixel/2-widthPixel1Card*1.5f, (heightPixel/2f)-heightPixel1Card);
labelStart.setAlignment(Align.left);
labelStart.setWrap(false);
labelStart.setColor(Color.BLACK);
stage.addActor(labelStart);
}
@Override
public void render() {
final float delta = Math.min(1/30f, Gdx.graphics.getDeltaTime());
Gdx.gl.glClearColor(167/255f, 219/255f, 216/255f, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
drawCoordsDebug();
actions.update(delta);
modelBatch.begin(cam);
modelBatch.render(cards);
modelBatch.end();
stage.act(Math.min(Gdx.graphics.getDeltaTime(), 1 / 30f));
stage.draw();
}
public static class CardActions {
Pool<CardAction> actionPool = new Pool<CardAction>() {
protected CardAction newObject() {
return new CardAction(CardActions.this);
}
};
Array<CardAction> actions = new Array<>();
public void actionComplete(CardAction action) {
action.card.inMovimento = false;
actions.removeValue(action, true);
actionPool.free(action);
}
public void update(float delta) {
for (CardAction action : actions) {
action.update(delta);
}
}
// ...
}
public static class CardAction {
public CardActions parent;
public Card card;
public final Vector3 fromPosition = new Vector3();
public float fromAngle;
public final Vector3 toPosition = new Vector3();
public float toAngle;
public float speed;
public float alpha;
public CardAction(CardActions parent) {
this.parent = parent;
}
public void update(float delta) {
alpha += delta * speed;
if (alpha >= 1f) {
alpha = 1f;
parent.actionComplete(this);
}
card.position.set(fromPosition).lerp(toPosition, alpha);
card.angle = fromAngle + alpha * (toAngle - fromAngle);
card.update();
}
}
@Override
public void resize(int width, int height) {
cam.position.set(0, 0, 10);
cam.lookAt(0, 0, 0);
cam.update();
viewport.update(width, height);
stage.getViewport().update(width, height);
}
@Override
public boolean keyDown(int keycode) {return false; }
@Override
public boolean keyUp(int keycode) {return false; }
@Override
public boolean keyTyped(char character) {return false; }
@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {return false; }
@Override
public boolean touchUp(int screenX, int screenY, int pointer, int button) {
Gdx.app.log("touchUp", "");
// handle it
return true;
}
@Override
public boolean touchDragged(int screenX, int screenY, int pointer) {return false; }
@Override
public boolean mouseMoved(int screenX, int screenY) {return false; }
@Override
public boolean scrolled(int amount) {return false; }
public void drawCoordsDebug() {
shapeRenderer.setProjectionMatrix(cam.combined);
shapeRenderer.begin(ShapeRenderer.ShapeType.Line);
shapeRenderer.setColor(Color.WHITE);
float wTot = Gdx.graphics.getWidth();
float hTot = Gdx.graphics.getHeight();
shapeRenderer.circle(0, 0, 1f);
for(float w = 0; w >= -wTot; w--) {
shapeRenderer.line(new Vector2(w,-hTot), new Vector2(w,hTot));
}
for(float w = 0; w <= wTot; w++) {
shapeRenderer.line(new Vector2(w,-hTot), new Vector2(w,hTot));
}
for(float h = 0; h >= -hTot; h--) {
shapeRenderer.line(new Vector2(-wTot, h), new Vector2(wTot, h));
}
for(float h = 0; h <= hTot; h++) {
shapeRenderer.line(new Vector2(-wTot, h), new Vector2(wTot, h));
}
shapeRenderer.end();
}
@Override
public void dispose () {
modelBatch.dispose();
atlas.dispose();
cards.dispose();
shapeRenderer.dispose();
stage.dispose();
}
}
DesktopLauncher.java:
public class DesktopLauncher implements IActivityRequestHandler {
private static DesktopLauncher application;
public static void main (String[] arg) {
LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
if (application == null) {
application = new DesktopLauncher();
}
new LwjglApplication(new MyGdxGame(application), config);
}
@Override
public void showAds(boolean show) {
}
}
AndroidLauncher.java:
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.Settings;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.RelativeLayout;
import com.badlogic.gdx.backends.android.AndroidApplication;
import com.google.android.gms.ads.AdListener;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdSize;
import com.google.android.gms.ads.AdView;
import com.google.android.gms.ads.MobileAds;
import com.google.android.gms.ads.RequestConfiguration;
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.util.LinkedList;
import java.util.List;
public class AndroidLauncher extends AndroidApplication implements IActivityRequestHandler {
private final int SHOW_ADS = 1;
private final int HIDE_ADS = 0;
protected AdView mAdView;
@Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MobileAds.initialize(this, initializationStatus -> { });
// Create and setup the AdMob view
mAdView = new AdView(this);
mAdView.setAdSize(AdSize.BANNER);
mAdView.setAdUnitId("");
AdRequest adRequest = new AdRequest.Builder().build();
mAdView.loadAd(adRequest);
// Create the layout
RelativeLayout layout = new RelativeLayout(this);
// Do the stuff that initialize() would do for you
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
// Add the libGDX view
View gameView = initializeForView(new MyGdxGame(this));
layout.addView(gameView);
// Add the AdMob view
RelativeLayout.LayoutParams adParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
adParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
adParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
layout.addView(mAdView, adParams);
layout.setKeepScreenOn(true);
setContentView(layout);
}
protected Handler handler = new Handler()
{
@Override
public void handleMessage(Message msg) {
switch(msg.what) {
case SHOW_ADS:
{
Activity activityContext = AndroidLauncher.this;
if (rewardedAd.isLoaded()) {
RewardedAdCallback adCallback = new RewardedAdCallback() {
@Override
public void onRewardedAdOpened() {
// Ad opened.
}
@Override
public void onRewardedAdClosed() {
// Ad closed.
rewardedAd = createAndLoadRewardedAd();
gameView.requestFocus();
}
@SuppressLint("ApplySharedPref")
@Override
public void onUserEarnedReward(@NonNull RewardItem reward) {
gameView.requestFocus();
}
@Override
public void onRewardedAdFailedToShow(int errorCode) {
// Ad failed to display.
}
};
rewardedAd.show(activityContext, adCallback);
} else {
if (mInterstitialAd.isLoaded()) {
mInterstitialAd.show();
}
}
break;
}
case HIDE_ADS:
{
mAdView.setVisibility(View.GONE);
break;
}
}
}
};
// This is the callback that posts a message for the handler
@Override
public void showAds(boolean show) {
handler.sendEmptyMessage(show ? SHOW_ADS : HIDE_ADS);
}
@Override
protected void onResume() {
super.onResume();
gameView.requestFocus();
}
}
touchUp
方法也不会在日志中打印任何内容。
几次尝试:
将 gameView.requestFocus();
替换为:
runOnUiThread(new Runnable() {
@Override
public void run() {
gameView.requestFocus();
}
});
奇怪的是它发生在 Android 10 上,而在 Android 6.0 上即使没有这些代码行也能正常工作。
注意:我知道只有当用户想要查看它以获得奖励时才必须使用 rewardedAd,在这里我用它来测试流程,然后再继续在游戏。
谢谢!
最佳答案
According to the documentation您应该在主线程上运行所有操作。当您展示您的广告时,您正在从未在主线程上运行的 new Handler()
调用您的代码,要解决此问题,您需要通过更改以下内容在主线程上运行此处理程序行
protected Handler handler = new Handler()
到
protected Handler handler = new Handler(Looper.getMainLooper())
关于android - onResume 之后的 Activity "freezed",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65864777/
假设我有 3 个 Fragment,BaseFragment,以及第一个 fragment 和第二个 fragment 。 我已经实现了 BaseFragment 的 onResume() 并编写了一
这是我的第一个应用程序,所以这个问题/答案可能非常基本。我目前有 onPause(); ,当玩家离开屏幕时停止播放音乐。我尝试做类似的事情,但使用 onResume,以便再次播放音乐(backgrou
如何重载onResume()以正确的方式工作?我想从 activity 返回到 MainActivity ,我希望在其中具有与应用程序启动后相同的状态。我想使用 recreate() 但它循环了或者类
出于某种原因,当我在代码中声明 onResume() 时,它会无缘无故地让我的程序崩溃,甚至无法打开。 这是我的 onResume() 代码: public void onResume() {
我遇到了一个棘手的问题。我有两个标签页主机 ...标签页主机 A 和标签页主机 B。每个选项卡主机都有三个选项卡(我们称它们为 A1、B1、A2、B2 等)。 选项卡主机 B 从 Activity A
我的应用程序有一个问题,如果我返回到一个 Activity ,我会收到一条错误消息,指出数据库已关闭: ERROR/AndroidRuntime(3566): Caused by: java.lang
在我的 android 应用程序中,我有一个问题已经 3 天无法解决了。我阅读了很多帖子和答案,但仍然找不到我的解决方案。 我的问题是当我按下主页按钮并在很长时间后返回应用程序时它崩溃了(NullPo
我如何实现一个无限滚动到 onResume(),目前是 onCreateView,我实现了一个无限滚动,它工作得很好,但是当涉及到 onResume() 时,它在另一个显示空白数据时不起作用。 这是o
我在我的 Android 应用程序中使用谷歌地图。一切都很好,但是当我没有启用 GPS 服务时,我会显示一条消息来启用。当我启用 GPS 并在我的 Fragment der map 中返回时,仅当我按
我一直在搜索这个,但不知道会发生什么...... 当我回到上一个 Activity 时,我的组件已正确初始化,但它们上面有一个新组件... 我的意思是,在 Debug模式下,我遵循并执行了 onRes
我读过一些与我的问题相似的帖子,最相似的问题在这里:Strange onPause(), onResume() behaviour in fragments 我正在使用 FragmentPagerAd
我已经阅读了关于 onResume() 和 onStart() 的文档,但我仍然不明白的一件事是 onResume() 在没有 onStart() 之前被调用? 最佳答案 请引用Android Act
我正在尝试制作一个简单的记事本应用程序,我想在“新建笔记” Activity 完成且主屏幕恢复时刷新笔记。但是,当我尝试使用此代码打开应用程序时,我会强制关闭。如果我删除 OnResume 东西,它不
这个问题在这里已经有了答案: Android: Under what circumstances would a Dialog appearing cause onPause() to be cal
我有一个问题。在为预览初始化相机并将另一个应用程序聚焦后,然后返回我的应用程序:预览显示为黑色。如果我继续拍照,它会拍摄我正常指向相机的位置的照片。 我在 OnResume() 覆盖上做错了什么吗?相
我正在使用列表适配器来显示不同的商店,当有人选择商店时,它会将他们带到一个新的 Activity 中,他们可以在该 Activity 中将商店添加到该屏幕上的收藏夹。 有一个调用 finish();
我有一个 Intent,它通过一个长的 Extra 从我的数据库中获取信息。它还通过 String Extra 设置 Activity 的标题。 现在,当我第一次启动 Activity 时,一切都完美
所以我有我的主要 Activity ,当您按下按钮时,它会启动 Activity 2。启动 activity2 后,我按下主页按钮,它将在 activity2 触发 onPause,然后 androi
我正在编写一个购物车应用,其中我允许用户选择要购买的商品并将他们需要的商品添加到购物车,为此我给出了两种不同的标签, 第一个标签,浏览产品 第二个标签,浏览购物车中的商品 [用户添加] 这里我遇到了一
我有问题。当我第一次启动我的 android 应用程序时,在主要 Activity 中 onCreate 和 onResume 都会被调用。但我只想被称为 onCreate。 我能做什么? 最佳答案
我是一名优秀的程序员,十分优秀!