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

Por R$ 2.699, Moto G60 chega com a promessa de bateria durar até três dias

Motorola Moto G60 - Motorola
Motorola Moto G60 Imagem: Motorola

Lucas Carvalho

De Tilt, em São Paulo

28/04/2021 09h00Atualizada em 28/04/2021 16h11

A Motorola anunciou nesta quarta-feira (28) mais um celular da linha Moto G, que neste ano chega à sua décima geração e já teve outros três lançamentos em março (Moto G100, G10 e G30). A novidade é o Moto G60, que chega ao Brasil pelo preço sugerido de R$ 2.699.

O aparelho tem um conjunto de câmera tripla e é a primeira vez que a empresa adota um sensor de 108 MP na linha Moto G. Outro destaque é a bateria de 6.000 mAh, que, segundo a fabricante, dura 54 horas longe da tomada, podendo chegar a três dias dependendo do hábito de uso.

Além disso, o Moto G60 vem com tela de 6,8 polegadas (17,2 cm) com taxa de atualização em 120 Hz —ou seja, a tela do aparelho é atualizada 120 vezes por segundo para mostrar animações mais suaves. Tradicionalmente, celulares da linha Moto G vinham com apenas 60 Hz (exceto pelo top de linha Moto G100, que chega a 90 Hz).

As câmeras

A câmera de 108 MP usa uma tecnologia que a Motorola chama de "Ultra Pixel", que consiste em unificar nove pixels em um só ao processar as fotos para gerar imagens de apenas 12 MP, mas com nível maior de detalhamento, principalmente em ambientes de pouca luz.

Completa o conjunto traseiro uma lente ultra-grande-angular para capturar mais conteúdo em cada foto (e que também funciona como uma lente macro para fotografar detalhes de perto sem perder o foco), e um sensor de profundidade para ajudar no modo retrato (aquele em que o fundo fica borrado).

Já a câmera de selfies de 32 MP, que fica num furo no topo da tela, vem com um discreto flash frontal na borda superior do aparelho. O celular ainda vem com a função "Captura Dupla", que permite gravar vídeos com as câmeras frontal e traseira ao mesmo tempo.

Desempenho

O processador Snapdragon 732G, de nível intermediário, é acompanhado de 6 GB de RAM e 128 GB de espaço interno para armazenamento. O Moto G60 não tem e a 5G ou proteção contra água, mas vem com entrada para fones de ouvido, leitor de impressões digitais na parte traseira e um botão para convocar o Google Assistente na lateral.

As vendas do aparelho começam nesta quinta-feira (29), nas cores azul e "champagne", no varejo e também nas Moto Stores, as primeiras lojas-conceito da marca no mundo inauguradas nesta semana no Shopping Aricanduva, em São Paulo, e no Norte Shopping, no Rio de Janeiro.

Ficha técnica: Motorola Moto G60

  • Tela: IPS LCD; 6,8 polegadas; Full HD+ (1080 x 2460); 120 Hz;
  • Processador: Snapdragon 732G; 2,3 GHz; octa-core;
  • Câmeras: tripla: de 108 MP (Principal), 8 MP (Ultra-grande angular e macro) e 2 MP (profundidade); e frontal de 32 MP;
  • Memória: 128 GB (com e a micro SD de até 1 TB) de armazenamento; e 6 GB de RAM
  • Bateria: 6.000 mAh
  • Preço: R$ 2.699
Errata: este conteúdo foi atualizado
Diferentemente do que dizia uma versão anterior deste texto, na ficha técnica do aparelho, o Moto G60 possui e a cartão de memória micro SD de até 1 TB, e não somente até 512 GB. O erro foi corrigido.