如何在kotlin(或java)中创建40hz闪烁的黑白灯?

62lalag4  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(423)

我的目标:我想创造一个黑白闪烁的视频。白色闪烁频率必须为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毫秒。但是,我使用的计时器不支持小数。有没有人知道如何解决这个问题,或者有完全不同的想法来实现这个目标?我真的很高兴!
谨致问候,
米奇

gojuced7

gojuced71#

你可以用 Thread.sleep(long millis, int nanos) 使用 nanos 更细粒度延迟的值。问题是你用的是 runOnUiThread 它将消息发布到主线程,然后开始处理它。。。有时。。。有事情要做!
在这个帖子里有一个答案,有一些链接指向 SurfaceView 在自己的专用线程上运行的实现(grafika链接已断开,但文件在这里)和一些其他引用。你基本上可以有自己的 Surface 你可以把它从ui线程中画出来,你可以随意地休眠线程,当它醒来的时候直接画出来。
另一个问题是,据我所知,android总是以60hz的频率进行本地渲染,包括使用 SurfaceView (这里是关于整个管道的详细信息,但是您正在向系统轮询的队列添加帧)。如果你不愿意跳过每3帧,就不可能把60赫兹变成40赫兹,我猜这是不可能的!
我知道一些较新的手机能处理120hz的频率,但我不知道在安卓系统上是如何工作的。也许你需要开始摆弄opengl,vulkan或renderscript-远远超出我所知道的,抱歉!

相关问题