首页 > 解决方案 > 将视图添加到具有时间延迟的活动?

问题描述

我正在尝试修改现有的示例应用程序,当用户触摸屏幕时,该应用程序会将视图添加到主活动。这些视图是围绕屏幕浮动的位图图像。触摸屏幕上的任意位置会在该位置添加这些图像之一。

它通过为每次触摸创建一个新视图(位图图像​​)来实现这一点。

它按原样工作正常,但我正在尝试添加一个功能,它以编程方式添加这些视图而无需任何用户输入。

在下面的代码中,我添加了 onResume() 来尝试这个功能。(在 onCreate() 中添加相同的代码也不起作用。)

不幸的是,它并没有像我希望的那样添加它们——不是在用户启动应用程序后每 500 毫秒添加一个,而是暂停 5 秒,然后一次添加所有十个。


显然我是 android dev 的新手,所以我不知道从哪里开始。

我需要做些什么来实现延迟,使其每半秒添加一个新视图?为什么默认情况下会这样做?

谢谢!

    
    
class ImageScreen : Activity(){

   
    public override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContentView(R.layout.imagescreen)

        mFrame = findViewById<View>(R.id.frame) as FrameLayout
        mBitmap = BitmapFactory.decodeResource(resources, R.drawable.myBitmapImage)
    
        mFrame!!.setOnTouchListener { _, event ->
            createImage(event.x, event.y)
            true
        }

    }
    
    override fun onResume() {
        super.onResume()

        for (i in 0..10) {

            createImage(xpos.random(), ypos.random())
            sleep(500)

        }
    }
    
    private fun createImage(x: Float, y: Float){
        mFrame!!.addView(myImage(applicationContext, x, y))
    }
    
    
    inner class myImage internal constructor(context: Context, x: Float, y: Float) : View(context) {
 
        private fun createScaledBitmap(r: Random) {
            mScaledBitmap = Bitmap.createScaledBitmap(mBitmap!!, mScaledBitmapWidth, mScaledBitmapWidth, false) 
        }

        fun start() {
            val executor = Executors.newScheduledThreadPool(1)

            mMoverFuture = executor.scheduleWithFixedDelay({
                if (changePosIfStillOnScreen()) {
                    postInvalidate()
                } else stop(false)
            }, 0, REFRESH_RATE.toLong(), TimeUnit.MILLISECONDS)
        }

        private fun stop() {
                    mFrame!!.removeView(this@myImage)
        }

        @Synchronized
        override fun onDraw(canvas: Canvas) {
            canvas.save()
            canvas.drawBitmap(mScaledBitmap!!, mXPos, mYPos, mPainter)
            canvas.restore()
        }
    }
}

// Additional code, such as functions and variable declarations that are not pertinent to this question, have been removed for simplicity

标签: androidkotlinviewimageviewavd

解决方案


因为它会暂停 5 秒,然后一次添加所有十个,那是因为sleep(500)您在代码中使用,它会冻结主线程(UI 线程)。

使用 handler 实现延迟动作,参考: https ://developer.android.com/reference/android/os/Handler


推荐阅读