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

Celular que "estica": conheça o aparelho com tela expansível da Oppo

Oppo X 2021 - Divulgação
Oppo X 2021 Imagem: Divulgação

Felipe Oliveira

Colaboração para Tilt

20/11/2020 14h35

Imagine que você cansou do tamanho da tela de seu celular e decide deixá-la um pouco maior. Ou ainda acha que o tamanho do smartphone não encaixa direito nas mãos e gostaria de um aparelho um pouco menor. É exatamente esta a ideia do Oppo X 2021, conceito apresentado pela marca chinesa durante o evento INNO Day.

A ideia do conceito é esticar a tela do aparelho, que a de 6,7 polegadas (17 centímetros) para até 7,4 polegadas (18,8 centímetros), "o que permite aos usuários ajustar o tamanho da tela com base nas necessidades reais".

O interessante é que, com o aumento ou diminuição da tela, o aparelho ajusta instantaneamente a escala das interfaces gráficas. Mas calma, como o celular é apenas um conceito ainda não há previsão para a chegada do aparelho até o consumidor.

Em sua apresentação durante o INNO Day, o vice-presidente e chefe do Instituto de Pesquisa Oppo, Levin Liu, disse que espera levar essa tecnologia aos consumidores "no momento certo".

Como funciona?

A tela do aparelho amplia ou diminui com um simples deslizar de dedos em um botão localizado ao lado da tela. A ideia da empresa chinesa e trazer uma tela expansível de maior qualidade, evitando os frisos que marcam os aparelhos com tela dobrável, lançados recentemente.

Para "deslizar" a tela, a Oppo criou um mecanismo chamado de "Warp Track", uma estrutura que fica escondida abaixo da tela que gira um motor de 6,8 milímetros. Essa estrutura funciona como uma esteira que "estica" ou "encolhe" o aparelho.

De acordo com o site Engadget, o corpo do telefone foi construído em duas placas que se estendem simultaneamente e uniformemente. A empresa informou na apresentação que equipou o Oppo X 2021 com tela de alta resistência, mas não especificou a durabilidade do aparelho.

"É importante desenvolver capacidades técnicas, mas é ainda mais importante integrá-las de forma inovadora. A Oppo acredita que devemos trazer os benefícios aos usuários e deixar toda a complexidade por nossa conta", disse Levin Liu.

Abaixo, você confere como é a expansão da tela do aparelho:


Aqui podemos ver como a parte traseira se movimenta durante a expansão: