Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 是否向具有时间延迟的活动添加视图?_Android_Kotlin_View_Imageview_Avd - Fatal编程技术网

Android 是否向具有时间延迟的活动添加视图?

Android 是否向具有时间延迟的活动添加视图?,android,kotlin,view,imageview,avd,Android,Kotlin,View,Imageview,Avd,我正在尝试修改一个现有的示例应用程序,当用户触摸屏幕时,该应用程序会向主活动添加视图。这些视图是浮动在屏幕上的位图图像。触摸屏幕上的任何位置都会在该位置添加这些图像之一 它通过为每次触摸创建一个新视图(位图图像)来实现这一点 它可以正常工作,但我正在尝试添加一个特性,它可以在不需要任何用户输入的情况下以编程方式添加这些视图 在下面的代码中,我添加了onResume()来尝试此功能。(在onCreate()中添加相同的代码也不起作用。) 不幸的是,它没有像我所希望的那样添加它们——它不是在用户启动

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

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

它可以正常工作,但我正在尝试添加一个特性,它可以在不需要任何用户输入的情况下以编程方式添加这些视图

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

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


很明显,我是android开发者的新手,所以我不知道接下来该怎么办。 我需要做什么来实现延迟,使其每半秒添加一个新视图?为什么默认情况下它会这样做

谢谢

    
    
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

类ImageScreen:活动(){
创建公共覆盖乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.imagescreen)
mFrame=findviewbyd(R.id.frame)作为FrameLayout
mBitmap=BitmapFactory.decodeResource(资源,R.drawable.myBitmapImage)
mFrame!!.setOnTouchListener{},事件->
createImage(event.x,event.y)
真的
}
}
重写onResume(){
super.onResume()
对于(0..10中的i){
createImage(xpos.random(),ypos.random())
睡眠(500)
}
}
private fun createImage(x:Float,y:Float){
mFrame!!.addView(myImage(applicationContext,x,y))
}
内部类myImage内部构造函数(上下文:context,x:Float,y:Float):视图(context){
private fun createScaledBitmap(r:随机){
mScaledBitmap=Bitmap.createScaledBitmap(mBitmap!!,mScaledBitmapWidth,mScaledBitmapWidth,false)
}
有趣的开始{
val executor=Executors.newScheduledThreadPool(1)
mMoverFuture=executor.scheduleWithFixedDelay({
如果(changePosIfStillOnScreen()){
后验证日期()
}否则停止(错误)
},0,刷新率.toLong(),时间单位为毫秒)
}
私人游乐站(){
mFrame!!.removeView(this@myImage)
}
@同步的
覆盖onDraw(画布:画布){
canvas.save()
canvas.drawBitmap(mScaledBitmap!!,mXPos,mYPos,mpainer)
canvas.restore()
}
}
}
//为了简单起见,删除了与此问题无关的其他代码,例如函数和变量声明

对于它暂停5秒,然后一次添加所有10个,这是因为在代码中使用
睡眠(500)
,它将冻结主线程(UI线程)

使用handler实现延迟操作,Ref:

注意:以下代码段是从java的角度来看的,您可能需要将其修改为kotlin

Handler=newhandler(getMainLooper());
Runnable Runnable=新的Runnable(){
@凌驾
公开募捐{
如果(计数器<5){
createImage(0,0);//您的位置
handler.postDelayed(这个,500);
计数器++;
}
}
};
handler.postDelayed(可运行,500);
注意:计数器是一个int变量,用于确定。。。计数。

推理:
在任何UI类(活动、片段、视图)中执行的所有代码都默认为UI线程。如果在该线程中执行任何
Thread.sleep()
操作,整个UI将暂时冻结,这在某些情况下可能导致ANR崩溃。

Handler
可以在这里帮助您。它需要一个
Looper
引用来实例化。当您调用
post(Runnable)
或可选的
postDelayed(Runnable,long millis)
时,它将获取
Runnable
并在UI线程上执行它(延迟或其他)。但是,对于每次使用,您都需要再次调用
post
,即在
Runnable
中递归调用
post

我希望这有帮助

谢谢大家!!这非常有效。然而,我仍然不完全清楚为什么这十种观点最初同时出现。我知道sleep()会冻结线程,但是假设我对被冻结的线程没有问题(在这段时间内我不需要任何用户输入),为什么它不在添加其他视图之间将线程冻结十次呢?UI线程的某些属性是否假定设计器希望同时添加所有元素?就我对视图层次结构的了解而言,在想要膨胀视图与实际膨胀视图之间有一个小的延迟,因为所有视图调用都在后端排队。这可能是因为睡眠-唤醒周期太快,视图无法在屏幕上具体化。
val executor=Executors.newScheduledThreadPool(1)mMoverFuture=executor.scheduleWithFixedDelay({if(changePosIfStillOnScreen()){postInvalidate()}else stop(false)},0,REFRESH\u RATE.toLong(),TimeUnit.millides)
可能是这一部分加载了图像,在设置图像和查看图像之间引入了轻微的延迟。
    Handler handler = new Handler(getMainLooper());
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            if (counter < 5) {
                createImage(0, 0); //your positions
                handler.postDelayed(this, 500);
                counter++;
            }
        }
    };
    handler.postDelayed(runnable, 500);