我的目标:我想创造一个黑白闪烁的视频。白色闪烁频率必须为40hz。所以基本上我需要创建80帧,其中有40个白色和40个黑色帧。白色的闪光说明你从一个40hz的led灯泡得到的闪光。
这是我目前使用的代码:
package com.example.java
import android.os.Build
import android.os.Bundle
import android.view.WindowInsets
import android.view.WindowManager
import android.widget.ImageView
import androidx.annotation.ColorRes
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import java.util.*
class MainActivity : AppCompatActivity() {
private lateinit var imgFlickr: ImageView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
@Suppress("DEPRECATION")
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
window.insetsController?.hide(WindowInsets.Type.statusBars())
} else {
window.setFlags(
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN
)
}
supportActionBar?.hide()
imgFlickr = findViewById(R.id.img_flickr)
val timer = Timer()
val timerBlack = FlickrTimer(R.color.black)
val timerWhite = FlickrTimer(R.color.white)
timer.schedule(timerBlack, 0, 12)
timer.schedule(timerWhite, 0, 12)
}
private inner class FlickrTimer(@ColorRes val backgroundColor: Int) : TimerTask() {
override fun run() {
runOnUiThread {
imgFlickr.setBackgroundColor(ContextCompat.getColor(this@MainActivity, backgroundColor))
}
}
}
}
我的问题是:要在1秒内显示40个白色图像和40个黑色图像,每张图片应持续1秒/80帧=00125秒=12,5毫秒。但是,我使用的计时器不支持小数。有没有人知道如何解决这个问题,或者有完全不同的想法来实现这个目标?我真的很高兴!
谨致问候,
米奇
1条答案
按热度按时间gojuced71#
你可以用
Thread.sleep(long millis, int nanos)
使用nanos
更细粒度延迟的值。问题是你用的是runOnUiThread
它将消息发布到主线程,然后开始处理它。。。有时。。。有事情要做!在这个帖子里有一个答案,有一些链接指向
SurfaceView
在自己的专用线程上运行的实现(grafika链接已断开,但文件在这里)和一些其他引用。你基本上可以有自己的Surface
你可以把它从ui线程中画出来,你可以随意地休眠线程,当它醒来的时候直接画出来。另一个问题是,据我所知,android总是以60hz的频率进行本地渲染,包括使用
SurfaceView
(这里是关于整个管道的详细信息,但是您正在向系统轮询的队列添加帧)。如果你不愿意跳过每3帧,就不可能把60赫兹变成40赫兹,我猜这是不可能的!我知道一些较新的手机能处理120hz的频率,但我不知道在安卓系统上是如何工作的。也许你需要开始摆弄opengl,vulkan或renderscript-远远超出我所知道的,抱歉!