;(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

Johnny Hooker lembra discurso a religiosos em festival: 'Preso na garganta'

De Splash, no Rio

27/09/2021 04h00

Johnny Hooker falou, em entrevista no "OtaLab" desta semana, sobre a polêmica em que se envolveu durante o Festival de Garanhuns (PE), em 2018. Na ocasião, o cantor reagiu a insultos feitos contra uma atriz travesti que se apresentava e disse que "Jesus também era travesti". A declaração rendeu uma grande discussão na época e, segundo Johnny, foi uma espécie de grito de "basta" ao preconceito.

Aqueles religiosos atacando aquela atriz travesti me trouxe uma raiva tão grande e alguma coisa na minha cabeça falou assim: 'Não, não mais. Se eles falam o que querem, eles vão ouvir o que não querem. Eles vão ter que ouvir. Agora eu vou falar, porque isso não é uma via de uma mão'. E a religião não está na Constituição. As pessoas têm direito à dignidade, à vida. Aí saiu aquilo ali, porque foi o grito que estava preso na garganta.

O cantor definiu o desabafo no palco como "um grande arroubo".

Naquele momento eu cansei. A gente, que é LGBT, ouve desde pequenininho que é o demônio, o lixo, que não presta, é nojento, enfim...

Johnny na ocasião teve apoio de grande parte da plateia.

"Muita gente fica perdida no meio da polêmica e acaba não vendo os detalhes daquele momento. Aquele festival é realizado em uma cidade que é muito conservadora, mas é frequentado por uma juventude que é muito progressista, acredita no futuro e nas pautas da liberdade e do respeito.

j - Reprodução - Reprodução
Johnny Hooker foi um dos convidados do "OtaLab" desta semana
Imagem: Reprodução

No papo com Ota, Johnny lembrou ainda que a polêmica lhe rendeu uma série de ataques na internet. "Chegaram a inventar que eu tinha morrido no dia do meu aniversário", lembrou o cantor, que também opinou sobre o momento atual do país, social e politicamente: "O Brasil precisa voltar a beijar na boca".

E mais

Além de Johnny Hooker, Otaviano recebeu o também cantor Hungria Hip Hop no programa desta semana. O rapper abriu o álbum de fotos e mostrou a coleção de carros de luxo que tem na garagem: "São R$ 200 de gasolina e jantar no espetinho", brincou Hungria, que se emocionou ao lembrar da história do fã que virou juiz inspirado por sua música.

Angélica também participou do "OtaLab", mostrando, ao lado dos colegas de "Jornada Astral", Vitor diCastro e Paula Pires, detalhes do programa que ela vai comandar na HBO Max. "A gente vai mostrar um olhar diferente para as celebridades", contou a apresentadora.

Você pode assistir a toda a programação do Canal UOL aqui.