The Codest
  • Sobre nós
  • Serviços
    • Desenvolvimento de software
      • Desenvolvimento de front-end
      • Desenvolvimento backend
    • Staff Augmentation
      • Programadores Frontend
      • Programadores de back-end
      • Engenheiros de dados
      • Engenheiros de nuvem
      • Engenheiros de GQ
      • Outros
    • Aconselhamento
      • Auditoria e consultoria
  • Indústrias
    • Fintech e Banca
    • E-commerce
    • Adtech
    • Tecnologia da saúde
    • Fabrico
    • Logística
    • Automóvel
    • IOT
  • Valor para
    • CEO
    • CTO
    • Gestor de entregas
  • A nossa equipa
  • Case Studies
  • Saber como
    • Blogue
    • Encontros
    • Webinars
    • Recursos
Carreiras Entrar em contacto
  • Sobre nós
  • Serviços
    • Desenvolvimento de software
      • Desenvolvimento de front-end
      • Desenvolvimento backend
    • Staff Augmentation
      • Programadores Frontend
      • Programadores de back-end
      • Engenheiros de dados
      • Engenheiros de nuvem
      • Engenheiros de GQ
      • Outros
    • Aconselhamento
      • Auditoria e consultoria
  • Valor para
    • CEO
    • CTO
    • Gestor de entregas
  • A nossa equipa
  • Case Studies
  • Saber como
    • Blogue
    • Encontros
    • Webinars
    • Recursos
Carreiras Entrar em contacto
Seta para trás VOLTAR
2021-02-10
Desenvolvimento de software

Desenvolvimento de software personalizado. Uma pequena história sobre ondas de marca

The Codest

Bartosz Slysz

Software Engineer

Uma das coisas que nos deixou confusos quando estávamos a construir o nosso novo sítio Web foram as ondas transformadas que se podem ver em diferentes locais das páginas. Tínhamos muitas ideias sobre como implementá-las da forma correta sem grande esforço. No entanto, a maior parte das soluções eram lentas e tivemos de construir de raiz algo que fosse mais rápido do que as bibliotecas já existentes.

Propostas de solução

Começámos com um objeto SVG simples que foi animado com diferentes bibliotecas. Como queríamos ter 3 objectos numa página, o resultado não foi muito satisfatório. Todas as animações eram lentas - todos os caminhos de um único objeto SVG tinham de ser actualizados em períodos de tempo muito curtos, o que tornava a página inteira tão lenta como um caracol. Tivemos de rejeitar a solução com SVG puro inserido num documento. Isso deixou nós com duas outras soluções à escolha.

O vídeo foi a segunda opção. Começámos com dois problemas:

- fundo transparente, que não pode ser aplicado com os formatos de vídeo mais populares, como .mp4 ou .webm,

- a capacidade de resposta, o que constituía um verdadeiro problema, uma vez que os vídeos não são escaláveis enquanto tal.
​
Decidimos manter esta solução em suspenso - "se não encontrarmos mais nada, escolhemos esta".

A última opção era utilizar tela com WebGL renderização. Foi uma opção muito invulgar, porque tivemos de conceber todos os mecanismos de renderização por nós próprios. Isto porque as ondas mórficas que tínhamos eram personalizadas - o que nos obrigou a conceber uma solução personalizada.

Arquitetura da solução

Vamos começar do zero. Qual era o material que tínhamos de utilizar para construir estas ondas? A ideia era que todas as ondas fossem um ficheiro SVG de tamanho 1×1 e caminhos específicos posicionados à volta desta área. A animação deste SVG foi construída através de algumas formas de estados para este ficheiro. Assim, todas as animações eram representadas como um conjunto de ficheiros que continham as fases de movimentação de uma forma.

Se olharmos mais profundamente para o que são os estados - todos os caminhos são apenas uma espécie de matriz com valores específicos posicionados numa ordem específica. Alterar esses valores em posições específicas dentro desta matriz altera a forma nas suas partes específicas. Podemos simplificar isto com o seguinte exemplo:


estado 1: [1, 50, 25, 40, 100]
estado 2: [0, 75, -20, 5, 120]
estado 3: [5, 0, -100, 80, 90]

Assim, podemos assumir que a forma que queremos renderizar consiste numa matriz com 5 elementos que estão a mudar com a flexibilização linear em períodos de tempo específicos. Quando a animação termina a última fase, recomeça com a primeira para nos dar a impressão de uma animação infinita.

Mas... espera - o que é exatamente a matriz apresentada acima? Tal como referi, é um caminho responsável pela apresentação de uma forma específica. Toda a mágica está incluída no d propriedade do caminho do SVG. Esta propriedade contém um conjunto de "comandos" para desenhar uma forma e cada comando tem um tipo de argumentos. A matriz acima mencionada é constituída por todos os valores (argumentos) associados a estes comandos.

A única diferença entre estes "ficheiros de estado" eram os valores de comandos específicos, uma vez que a ordem dos comandos era a mesma. Assim, toda a magia consistia em obter todos os valores e animá-los.

O assistente chamado Física

No parágrafo anterior, referi que a única magia na animação de um objeto é a criação de transições entre todas as fases de uma forma. A questão é: como fazer isso com o canvas?
​
A função que todos os que trabalharam com tela deve saber é requestAnimationFrame. Se estiveres a ver isto pela primeira vez, acredito sinceramente que deves começar por ler isto. Portanto, o que nos interessa nesta função é o argumento - DOMHighResTimeStamp. Parece realmente assustador, mas na prática não é assim tão difícil de entender. Podemos dizer que é uma marca temporal do tempo decorrido desde o primeiro render.

Ok, mas o que é que podemos fazer com isto? Como o requestAnimationFrame deve ser chamada recursivamente, podemos aceder a um delta de tempo entre as suas chamadas. E aqui vamos nós com a ciência! ⚛️ (ok, talvez não seja ciência de foguetões... ainda)
​
A física ensina-nos que o delta de uma distância é igual ao delta do tempo multiplicado pela velocidade. No nosso caso, a velocidade é constante porque queremos atingir o ponto final num determinado período de tempo. Então, vamos ver como podemos representá-lo com os estados acima:

Digamos que queremos fazer a transição entre estes estados em mil milissegundos, pelo que os valores de velocidade serão os seguintes:


delta: [ -1, 25, -45, -35, 20]
velocidade: [-1/1000, 25/1000, -45/1000, -35/1000, 20/1000]

A velocidade acima diz-nos: por cada milissegundo, vamos aumentar o valor em -1/1000. E aqui é o ponto em que podemos voltar ao nosso requestAnimationFrame e o tempo delta. O valor de uma determinada posição que queremos aumentar é o tempo delta multiplicado pela velocidade da sua posição. Outra coisa que se pode conseguir sem problemas é limitar o valor para não ultrapassar o estado para o qual se está a ir.
​
Quando a transição termina, chamamos outra e assim por diante. E não parece ser assim tão difícil de implementar, mas uma das principais regras do desenvolvimento de software é não perder tempo com coisas que já estão implementadas. Por isso - escolhemos um pequena biblioteca que nos permite criar estas transições sem esforço.
​
Foi assim que criámos uma onda animada que parece uma criatura viva.

Algumas palavras sobre a clonagem de formas

Como se pode ver, as ondas da marca The Codest não são uma única figura animada. São compostas por muitas figuras com a mesma forma, mas com tamanho e posição diferentes. Nesta etapa, vamos dar uma olhadela rápida sobre como duplicar desta forma.
​
Assim, o contexto do ecrã permite-nos área de desenho à escala (nos bastidores - podemos dizer que multiplica todas as dimensões passadas para os métodos drawable por "k", em que "k" é um fator de escala, por defeito definido para "1"), tornar a tela traduzidaÉ como mudar o ponto de ancoragem de uma área de desenho. E também podemos saltar entre estes estados com estes métodos: salvar e restaurar.
​
Estes métodos permitem-nos guardar o estado de "zero modificações" e, em seguida, renderizar um número específico de ondas no ciclo com uma tela corretamente dimensionada e traduzida. Logo a seguir, podemos voltar ao estado guardado. Isto é tudo sobre clonagem de figuras. É muito mais fácil do que clonar ovelhas, não é?

Cereja no topo

Mencionei que rejeitámos uma das potenciais soluções devido ao desempenho. A opção com o canvas é bastante rápida, mas ninguém disse que não podia ser ainda mais optimizada. Comecemos pelo facto de não nos preocuparmos com a transição de formas quando estas estão fora da janela de visualização do browser.
​
Há outra API de browser que os programadores adoravam - IntersecçãoObservador. Permite-nos seguir elementos específicos da página e tratar eventos que são invocados quando esses elementos aparecem ou desaparecem da janela de visualização. Neste momento - temos uma situação bastante fácil - vamos criar o estado de visibilidade, alterá-lo através dos manipuladores de eventos IntersectionObserver e simplesmente ativar/desativar o sistema de renderização para formas específicas. E ... boom, o desempenho melhorou muito! Estamos a renderizar apenas as coisas que estão visíveis na janela de visualização.

Resumo

Escolher uma forma de implementar as coisas é muitas vezes uma escolha difícil, especialmente quando as opções disponíveis parecem ter vantagens e desvantagens semelhantes. A chave para fazer uma escolha correta é analisar cada uma delas e excluir as que consideramos menos vantajosas. Nem tudo é claro - alguma solução requer mais tempo do que as outras, mas pode ser optimizada mais facilmente ou mais personalizável.

Embora estejam a aparecer novas bibliotecas JS quase todos os minutos, há coisas que não conseguem resolver. E é por isso que todos os engenheiros de front-end (e não só eles) devem conhecer as APIs dos browsers, manter-se a par das novidades técnicas e, por vezes, pensar "como seria a minha implementação desta biblioteca se tivesse de fazer isto?". Com mais conhecimento sobre navegadores, podemos construir coisas realmente sofisticadas, tomar boas decisões sobre as ferramentas que usamos e ficar mais confiantes sobre nossas código.

Ler mais:

– Ruby 3.0. Ruby e métodos de controlo da privacidade menos conhecidos

– Calem-se e levem o vosso dinheiro #1: Custos ocultos e verdadeira agilidade no processo de desenvolvimento de produtos

– Desafios do CTO - aumento de escala e crescimento de produtos de software

Artigos relacionados

Ilustração de uma aplicação de cuidados de saúde para smartphone com um ícone de coração e um gráfico de saúde em ascensão, com o logótipo The Codest, representando soluções digitais de saúde e HealthTech.
Desenvolvimento de software

Softwares para o setor de saúde: Tipos, casos de uso

As ferramentas em que as organizações de cuidados de saúde confiam atualmente não se assemelham em nada às fichas de papel de há décadas atrás. O software de cuidados de saúde apoia agora os sistemas de saúde, os cuidados aos doentes e a prestação de cuidados de saúde modernos em...

OCODEST
Ilustração abstrata de um gráfico de barras em declínio com uma seta ascendente e uma moeda de ouro que simboliza a eficiência ou a poupança de custos. O logótipo The Codest aparece no canto superior esquerdo com o slogan "In Code We Trust" sobre um fundo cinzento claro
Desenvolvimento de software

Como dimensionar a sua equipa de desenvolvimento sem perder a qualidade do produto

Aumentar a sua equipa de desenvolvimento? Saiba como crescer sem sacrificar a qualidade do produto. Este guia cobre sinais de que é hora de escalar, estrutura da equipe, contratação, liderança e ferramentas - além de como o The Codest pode...

OCODEST
Desenvolvimento de software

Construir aplicações Web preparadas para o futuro: ideias da equipa de especialistas do The Codest

Descubra como o The Codest se destaca na criação de aplicações web escaláveis e interactivas com tecnologias de ponta, proporcionando experiências de utilizador perfeitas em todas as plataformas. Saiba como a nossa experiência impulsiona a transformação digital e o negócio...

OCODEST
Desenvolvimento de software

As 10 principais empresas de desenvolvimento de software sediadas na Letónia

Saiba mais sobre as principais empresas de desenvolvimento de software da Letónia e as suas soluções inovadoras no nosso último artigo. Descubra como estes líderes tecnológicos podem ajudar a elevar o seu negócio.

thecodest
Soluções para empresas e escalas

Fundamentos do desenvolvimento de software Java: Um Guia para Terceirizar com Sucesso

Explore este guia essencial sobre o desenvolvimento de software Java outsourcing com sucesso para aumentar a eficiência, aceder a conhecimentos especializados e impulsionar o sucesso do projeto com The Codest.

thecodest

Subscreva a nossa base de conhecimentos e mantenha-se atualizado sobre os conhecimentos do sector das TI.

    Sobre nós

    The Codest - Empresa internacional de desenvolvimento de software com centros tecnológicos na Polónia.

    Reino Unido - Sede

    • Office 303B, 182-184 High Street North E6 2JA
      Londres, Inglaterra

    Polónia - Pólos tecnológicos locais

    • Parque de escritórios Fabryczna, Aleja
      Pokoju 18, 31-564 Cracóvia
    • Embaixada do Cérebro, Konstruktorska
      11, 02-673 Varsóvia, Polónia

      The Codest

    • Início
    • Sobre nós
    • Serviços
    • Case Studies
    • Saber como
    • Carreiras
    • Dicionário

      Serviços

    • Aconselhamento
    • Desenvolvimento de software
    • Desenvolvimento backend
    • Desenvolvimento de front-end
    • Staff Augmentation
    • Programadores de back-end
    • Engenheiros de nuvem
    • Engenheiros de dados
    • Outros
    • Engenheiros de GQ

      Recursos

    • Factos e mitos sobre a cooperação com um parceiro externo de desenvolvimento de software
    • Dos EUA para a Europa: Porque é que as empresas americanas decidem mudar-se para a Europa?
    • Comparação dos centros de desenvolvimento da Tech Offshore: Tech Offshore Europa (Polónia), ASEAN (Filipinas), Eurásia (Turquia)
    • Quais são os principais desafios dos CTOs e dos CIOs?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • Website terms of use

    Direitos de autor © 2026 por The Codest. Todos os direitos reservados.

    pt_PTPortuguese
    en_USEnglish de_DEGerman sv_SESwedish da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench pl_PLPolish arArabic it_ITItalian jaJapanese es_ESSpanish nl_NLDutch etEstonian elGreek cs_CZCzech pt_PTPortuguese