;(function() { window.createMeasureObserver = (measureName) => { var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`; performance.mark(`${markPrefix}-start`); return { end: function() { performance.mark(`${markPrefix}-end`); performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`); performance.clearMarks(`${markPrefix}-start`); performance.clearMarks(`${markPrefix}-end`); } } }; /** * Gerenciador de eventos */ window.gevent = { stack: [], RUN_ONCE: true, on: function(name, callback, once) { this.stack.push([name, callback, !!once]); }, emit: function(name, args) { for (var i = this.stack.length, item; i--;) { item = this.stack[i]; if (item[0] === name) { item[1](args); if (item[2]) { this.stack.splice(i, 1); } } } } }; var runningSearch = false; var hadAnEvent = true; var elementsToWatch = window.elementsToWatch = new Map(); var innerHeight = window.innerHeight; // timestamp da última rodada do requestAnimationFrame // É usado para limitar a procura por elementos visíveis. var lastAnimationTS = 0; // verifica se elemento está no viewport do usuário var isElementInViewport = function(el) { var rect = el.getBoundingClientRect(); var clientHeight = window.innerHeight || document.documentElement.clientHeight; // renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content if(el.className.includes('related-content-front')) return true; // garante que usa ao mínimo 280px de margem para fazer o lazyload var margin = clientHeight + Math.max(280, clientHeight * 0.2); // se a base do componente está acima da altura da tela do usuário, está oculto if(rect.bottom < 0 && rect.bottom > margin * -1) { return false; } // se o topo do elemento está abaixo da altura da tela do usuário, está oculto if(rect.top > margin) { return false; } // se a posição do topo é negativa, verifica se a altura dele ainda // compensa o que já foi scrollado if(rect.top < 0 && rect.height + rect.top < 0) { return false; } return true; }; var asynxNextFreeTime = () => { return new Promise((resolve) => { if(window.requestIdleCallback) { window.requestIdleCallback(resolve, { timeout: 5000, }); } else { window.requestAnimationFrame(resolve); } }); }; var asyncValidateIfElIsInViewPort = function(promise, el) { return promise.then(() => { if(el) { if(isElementInViewport(el) == true) { const cb = elementsToWatch.get(el); // remove da lista para não ser disparado novamente elementsToWatch.delete(el); cb(); } } }).then(asynxNextFreeTime); }; // inicia o fluxo de procura de elementos procurados var look = function() { if(window.requestIdleCallback) { window.requestIdleCallback(findByVisibleElements, { timeout: 5000, }); } else { window.requestAnimationFrame(findByVisibleElements); } }; var findByVisibleElements = function(ts) { var elapsedSinceLast = ts - lastAnimationTS; // se não teve nenhum evento que possa alterar a página if(hadAnEvent == false) { return look(); } if(elementsToWatch.size == 0) { return look(); } if(runningSearch == true) { return look(); } // procura por elementos visíveis apenas 5x/seg if(elapsedSinceLast < 1000/5) { return look(); } // atualiza o último ts lastAnimationTS = ts; // reseta status de scroll para não entrar novamente aqui hadAnEvent = false; // indica que está rodando a procura por elementos no viewport runningSearch = true; const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve()); // obtém todos os elementos que podem ter view contabilizados //elementsToWatch.forEach(function(cb, el) { // if(isElementInViewport(el) == true) { // // remove da lista para não ser disparado novamente // elementsToWatch.delete(el); // cb(el); // } //}); done.then(function() { runningSearch = false; }); // reinicia o fluxo de procura look(); }; /** * Quando o elemento `el` entrar no viewport (-20%), cb será disparado. */ window.lazyload = function(el, cb) { if(el.nodeType != Node.ELEMENT_NODE) { throw new Error("element parameter should be a Element Node"); } if(typeof cb !== 'function') { throw new Error("callback parameter should be a Function"); } elementsToWatch.set(el, cb); } var setEvent = function() { hadAnEvent = true; }; window.addEventListener('scroll', setEvent, { capture: true, ive: true }); window.addEventListener('click', setEvent, { ive: true }); window.addEventListener('resize', setEvent, { ive: true }); window.addEventListener('load', setEvent, { once: true, ive: true }); window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true }); window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE); // inicia a validação look(); })();
  • AssineUOL
Topo

Paulo Andrade vai narrar Fla na Libertadores e anima torcida: 'Finalmente'

Paulo Andrade, narrador do grupo Disney - Guido Bompan
Paulo Andrade, narrador do grupo Disney Imagem: Guido Bompan

Do UOL, em São Paulo

02/05/2022 12h45

A dois dias da partida entre Flamengo e Talleres (ARG), pela 4ª rodada do Grupo H da Libertadores, torcedores do Rubro-negro já comemoram uma escalação para a partida. No entanto, a confirmação não é sobre quem vai a campo, e sim às cabines de transmissão. Acontece que Paulo Andrade fará a sua estreia narrando partidas da equipe pelo torneio.

Considerado um dos maiores narradores esportivos do país, Paulo Andrade irá comandar a partida do Flamengo na Libertadores pela primeira vez. Em seu Twitter, ele confirmou que estará na transmissão da ESPN para a partida, que começa às 19h, no Estádio Mario Alberto Kempes, na Argentina.

"Jogo importante, vale até classificação antecipada na Libertadores", escreveu o narrador. Com 100% de aproveitamento nas três primeiras rodadas, o Flamengo lidera o grupo H, com nove pontos, seguido pelo adversário desta semana, com seis. A Universidade Católica, com três pontos, está em terceiro, enquanto a última posição é ocupada pelo Sporting Cristal, ainda zerado.

Com o anúncio, torcedores do Rubro-negro encheram a postagem com comentários de celebração. "Finalmente, obrigado, Mickey", escreveu um internauta, brincando com o fato de que a ESPN pertence ao Grupo Disney. "Finalmente, emoção do início ao fim", acrescentou outro usuário da rede social.

Já teve também quem colocou as expectativas para o confronto "nas alturas". "Você narrando um jogo do Flamengo era o que eu esperava e gostaria há tempos, excelente", comemorou um torcedor. "Amém, estava na hora de ver o melhor narrador do Brasil narrando um jogo do Mengão", completou outro.

Paulo Andrade é presença constante nas transmissões da ESPN de jogos do Campeonato Inglês, que ele narra desde 2003, quando chegou na emissora. Antes de se encontrar no microfone, ele foi jogador de base de times paulistas e viveu a frustração de não conseguir ser um futebolista profissional.