我正在编写一个使用ChessClock类的游戏应用程序。这两个运动员每人都有一个钟。时钟每十分之一秒向自己发送一个信息流,如果运行,则减少剩余时间。当时间到期时,时钟会调用父视图组中的一个方法,该方法会停止时钟并设置一个标志,该标志会导致忽略进一步的触摸事件,从而用户无法再移动工件。我正在用kotlin写作,但我认为java程序员也会明白这一点:
class ChessClock : TextView {
constructor(context: Context) : super(context)
constructor(context:Context, p:String) : this(context) {
player = p
}
var player = ""
val RUNNING = 0
val PAUSED = 1
val IDLE = 2
val EXPIRED = 3
val mInterval = 100L
var mTime = 0L // in milliseconds
var mState = IDLE
val mHandler = Handler()
val mUpdateTimeTask = object : Runnable {
override fun run() {
if (mState == RUNNING) showTime()
mHandler.postDelayed(this, mInterval)
}
}
// override fun onDetachedFromWindow() {
// super.onDetachedFromWindow()
// stop()
// }
fun setTime(minutes:Long) {
mTime = 1000*60*minutes // minutes to milliseconds
mState = IDLE
setTextColor(getResources().getColor(R.color.colorIdle))
showTime()
mUpdateTimeTask.run()
}
fun pause() {
mState = PAUSED
setTextColor(getResources().getColor(R.color.colorPaused))
}
fun start() {
mState = RUNNING
setTextColor(getResources().getColor(R.color.colorRunning))
}
fun expire() {
mState = EXPIRED
setTextColor(getResources().getColor(R.color.colorExpired))
model.timeout(player)
val aboyne = parent as AboyneView
aboyne.gameOver(false)
}
fun toggle() {
if (mState == PAUSED) start()
else if (mState == RUNNING) pause()
}
fun stop() {
mHandler.removeCallbacks(mUpdateTimeTask)
}
fun showTime() {
val tenths = (mTime % 1000) / 100
var seconds = mTime / 1000
val minutes = seconds % 3600 / 60
seconds %= 60
if (minutes >= 1)
setText(String.format("%02d:%02d",minutes, seconds))
else
setText(String.format("%01d:%02d:%01d",minutes, seconds,
tenths))
if (mState != RUNNING) return
if (mTime > 0)
mTime -= mInterval
else
expire()
}
}
这可以正常工作,但是如果用户按下后退按钮然后开始一个新游戏,时钟显然会继续运行,即使活动的onDestroy方法已被调用。然后当运行时钟到期时,即使新时钟仍在运行,新游戏也会被冻结。
我是android新手,我不明白这是怎么回事。我本以为活动结束时,时钟会被破坏。我已经测试了关于日志消息发生了什么的想法,并确认在调用onDestroy之后时钟会运行。我还重写了onDetachedFromWindow以停止时钟,这会使问题消失,但这太过分了。如果用户接到电话,它也会停止计时,不是吗?这不是我想要的。
你能建议如何最好地完成我想要的吗?没有办法从活动中访问时钟,是吗?我想过在onDestroy中发出一些事件,并让ChessBell监听它,但我还不知道如何编写自定义事件和监听器。有更简单的方法吗?
我不明白提出的建议如何解决我的问题,但我想出了一个难题。
我将一个全局变量BACK_按钮初始化为false
。在该活动中,我覆盖了onDestroy
,将_按钮设置为true
。然后我修改了ChessClock代码来检查BACK_按钮:
val mUpdateTimeTask = object : Runnable {
override fun run() {
if (BACK_BUTTON) expire()
else {
if (mState == RUNNING) showTime()
mHandler.postDelayed(this, mInterval)
}
}
不是一个很好的解决方案,但在我弄清楚自定义事件之前必须这样做。据我所知,自定义事件和自定义事件侦听器是做到这一点的唯一干净方法。
我不知道如何在Kotlin中实现这一点,但在java中,您可以设置计时器,每X毫秒执行一次timertask,然后在需要时调用mTimer取消它。cancel()你应该试着用它来代替mHandler。postDelayed(这是mInterval)
以下是您的做法:如何在静态编程语言中延迟后调用函数?
我对libGDX有一个问题,当我用后退按钮退出后恢复应用程序时,只有一个白色屏幕。 实际应用运行,接受触摸输入,播放声音,但屏幕只是白色。 我读过保持对纹理的静态引用可能会导致这个问题,但我没有这样做。 下面是我的资产代码如何工作的简化版本。 在按下后退按钮后返回应用程序时,重新创建AssetManager,重新打开SplashScreen(为白色),并更新AssetManager直到重新加载所有
我正在使用Actionbar和它的“up”按钮从一个细节活动返回到主活动,这很好。类似地,用户可以按系统“后退”按钮返回到主活动。 在我的主要活动中,在中,从internet下载数据,以便在应用程序启动时显示。我注意到,当我使用Actionbar“up”按钮从细节转到主要活动时,运行,重新下载数据。但是当我使用系统“后退”按钮时,没有运行,因此立即显示主活动视图。 我在详细信息活动中用于实现“向上
在我的应用程序中,我有一个注销功能。如果用户单击注销,它将进入主屏幕。现在,我按下后退按钮退出我的应用程序。但我想要的是,我需要自动退出(即以编程方式退出),就像返回按钮功能一样。我知道,通过调用finish()可以实现该功能。但问题是,它会转到上一个活动。
假设有几个以编程方式创建的按钮,并且有一个通用的按钮处理程序。 如何理解处理器内部哪个按钮被按下? 而不在函数调用中传递一些特殊的东西。那不行:< code > onButtonClicked(" button " I); 例如,在JavaScript中,在处理程序内部有< code>$(this),它可以立即“理解”按下了哪个按钮。 也许在颤振中也有类似的机制?我想在按钮上挂起属性(事先不知道哪
问题内容: 我只是在http://ritter.vg上设置了新主页。我正在使用jQuery,但是使用的次数很少。 它使用AJAX加载所有页面-我将其设置为通过检测URL中的哈希来允许添加书签。 但是我无法使用后退和前进按钮。 有没有一种方法可以在不使用setInterval循环的情况下检测何时按下后退按钮(或检测哈希值何时变化)?当我尝试使用.2和1秒超时的那些时,它挂住了我的CPU。 问题答案: