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