我知道这个问题在这里很多次,但是在所有这些情况下都适用的答案对我来说不起作用。当活动开始时,我正在截取屏幕截图。我在onCreate的底部执行我的代码。它的效果非常好4次5次,第5次屏幕还没有渲染,你会得到一个黑色截图。
我的解决方法是在onCreate结束时启动的AsyncTask中执行屏幕截图代码。如果我睡了200毫秒,它会在10次中有9次工作。 500分钟的睡眠可以100%的时间获得,但你可以注意到延迟。这似乎也是一个糟糕的解决方案,因为500毫秒是一个任意数字,可能无法在所有设备上运行。
我怎么知道UI的呈现时间,所以我可以截取屏幕截图?
答案 0 :(得分:8)
您可以使用Window.getDecorView()抓取顶部装饰视图,然后在其上使用post(Runnable)。使用装饰视图会产生可以在任何应用程序中运行的可重用代码,因为它不依赖于某些特定的View元素是膨胀布局的一部分。
调用将导致您的Runnable被放置在消息队列中以在UI线程上运行,因此不会在Runnable中运行长操作以避免阻止UI线程
// @Override protected void onCreate(Bundle savedInstanceState) {
window.decorView.post {
// TODO your magic code to be run
}
// @Override protected void onCreate(Bundle savedInstanceState) {
getWindow().getDecorView().post(new Runnable() {
@Override
public void run() {
// TODO your magic code to be run
}
});
答案 1 :(得分:0)
getWindow()可能返回null。
为实现相同目标的建议:
final Handler handlerUI = new Handler(Looper.getMainLooper());
Runnable r = new Runnable() {
public void run() {
// TODO your magic code to be run
}
};
handlerUI.post(r);