Para desenhar formas e linhas personalizadas no Flutter, existem basicamente quatro coisas envolvidas: Show CustomPaint [expositores fornecer papel e, em seguida, mostrar o que você desenha] ?️ CustomPainter [este é o seu pintor] 油漆 pintar [este é o seu pincel] 画 canvas [este é o seu papel] ⬜ Sim, é tão simples Então vamos começar a criar nosso arquivo principal: Https://medium.com/media/7804344df66feafd0aa7fbb67d7e263d/href O desenho será feito na classe DrawingPage: Https://medium.com/media/338ed8860e180dd63535ed18e02e4b79/href Como de costume, nossa página começa com o Scaffold, que possui um appBar e um corpo configurado para a instância do widget CustomPaint. A tela é criada e apresentada a você pelo widget CustomPaint, que possui três propriedades importantes: Pintor: Esta é uma instância da classe CustomPainter que desenha a primeira camada da pintura na tela. Criança: você pode configurá-lo para qualquer widget que você quiser. Depois que o pintor terminar de pintar, a sub-imagem será exibida no topo da pintura. foregroundPaint: Finalmente, este desenho é desenhado no topo das duas primeiras camadas. Como eu disse, o objeto CustomPaint cria uma tela e a fornece aos objetos painter e foregroundPaint para que possam ser desenhados neles. Tamanho da telaMas qual é o tamanho da tela? O mesmo tamanho da tela inteira? Metade da tela? Ou o que? O objeto CustomPaint cria uma tela com o mesmo tamanho dos parâmetros filhos. Se o parâmetro filho não for fornecido [sim, isso é opcional], o tamanho da tela será determinado pelo parâmetro size que você pode fornecer ao objeto CustomPaint ao instanciar. Em nosso exemplo, o filho é um widget central que é tão grande quanto a tela. Portanto, nossa tela será tão grande quanto a tela inteira. Se você quiser saber por que o widget Central é tão grande quanto a tela inteira, leia meu artigo recente sobre o widget Central: Entendendo o widget central em Flutter O canto superior esquerdo da tela é chamado de origem. É o ponto da coordenada [0,0]. As coordenadas do canto inferior direito da tela são [size.width, size.height]: Coordenadas de lonaPintorO tipo do parâmetro do pintor é CustomPainter. Isso significa apenas que sua classe pintora [que vamos criar] deve estender a classe CustomPainter. Você normalmente nomeia sua classe CustomPainter com base no que você deseja desenhar. Se você quiser desenhar o céu, chame-o de SkyPainter. Se você quiser desenhar um rosto, nomeie-o FacePainter. Se você quiser sacar uma arma, por favor leia primeiro: Se uma pessoa tem que trabalhar com uma arma, é melhor certificar-se de que o fazem nas circunstâncias certas. Em alguns casos, fazer uma arma é ilegal. Leia em: http://gunbelts.com/blog/when-is-drawing-your-gun-legal/ ? Como eu pretendo principalmente desenhar uma curva virtual na tela, quero nomear meu pintor "CurvePainter": Https://medium.com/media/9d3193f04247a67791a9284c006c3411/href Como você pode ver, meu pintor estende a classe CustomPainter. A classe CustomPainter tem duas funções importantes para substituir: Pintura: A pintura atual ocorre aqui. Você percebeu os dois parâmetros fornecidos para esse recurso? Nesta função, você pode acessar o objeto de tela, que é realmente o seu papel, ou o tamanho da tela que deseja desenhar. shouldRepaint: Nesta função, você deve retornar verdadeiro ou falso. Se a sua pintura depende de uma variável e a variável mudou, então você retorna true aqui, então Flutter sabe que deve chamar o método paint para redesenhar sua pintura. Caso contrário, retornar false significa que você não precisa se redesenhar. deDesenhar linhas e formas Agora tudo está pronto para começar a pintar. A tela está pronta e sabemos seu tamanho. O objeto de tela fornecido a você tem várias funções auxiliares que ajudam você a desenhar coisas, para citar algumas: drawLine [offset p1, offset p2, pintura] Desenhe uma linha do ponto 1 ao ponto 2 usando o pigmento fornecido. drawCircle [deslocamento c, raio duplo, pintura] Desenhe um círculo centrado no ponto dado, que tem o raio dado pelo segundo parâmetro e é desenhado no terceiro parâmetro. drawPath [tinta para pintura] Desenha o caminho determinado usando o desenho especificado. moveTo [double x, double y] Antes de começar a desenhar, por padrão, sua caneta está na origem [o canto superior esquerdo da tela]. Você pode usar esse recurso para mover a caneta antes de começar a desenhar. Entre todas as formas que você desenha, sejam elas preenchidas ou tocadas [ou ambas], são controladas pelo Paint.style. Ok, vamos desenhar algumas coisas reais. Eu desenharei uma linha, um círculo e um caminho para você e depois deixarei você explorar o restante da função. Https://medium.com/media/0a35dbc2a093c15729e21e1b189fd261/href No exemplo acima, criei primeiro a tinta [como minha caneta] e defini a cor e a largura da caneta. Em seguida, uso o método drawLine para desenhar uma linha do meio da borda esquerda da tela até o meio da borda direita da tela: ?Por favor, observe como desenhar o widget de texto "Blade Runner" [que é um sub-parâmetro do CustomPaint] depois que o artista terminar. Se você fornecer um terceiro parâmetro foregroundPaint, ele será desenhado na parte superior do widget filho. Agora vamos desenhar um círculo azul no centro da tela: Https://medium.com/media/7667cbbd0e43909977fdc1894f086fb4/href Como você pode ver, eu uso a mesma cor, mas primeiro mudo sua cor para azul e defina seu estilo para traçar [não preenchimento] para que o círculo não seja preenchido. Especifiquei o ponto central da tela por Offset [size.width / 2, size.height / 2] e determinei que o raio do círculo é proporcional à largura da tela: size.width / 4. Dica: posso simplesmente definir o raio para um número como 10 ou qualquer outro número, mas como a tela pode ser de qualquer tamanho, é melhor redimensionar o objeto com base no tamanho da tela. Caminho de desenhoAgora vamos desenhar uma marca de seleção ✔️ usando o objeto de caminho abaixo do círculo. Https://medium.com/media/7461d84105a9437983de0181099262ab/href Para fazer isso, primeiro movo a caneta para as coordenadas abaixo do círculo [usando moveTo] e, em seguida, adiciono duas linhas ao caminho [usando lineTo]. Você apenas tem que imaginar as coordenadas X e Y apropriadas, ou mais precisamente, pegar um pedaço de papel e calculá-las pacientemente. O resultado do código acima é: Você pode fechar o caminho chamando path.close []: Https://medium.com/media/187b4cd2c77a9a6be37ced7e1af53ea6/href Resultado: Você quer esta estrada fechada cheia de cor? Não tem problema, basta alterar o estilo da caneta para preenchê-lo: Https://medium.com/media/ded6aadb57d12ce21d8597900d86e08d/href O resultado é: O código fonte deste artigo está disponível no GitHub. No próximo artigo, vou mostrar-lhe "Como desenhar uma curva pontilhada. Antes disso, por favor, continue prestando atenção e obrigado pela leitura. O uso do Canvas e do Path para desenhar formas e linhas personalizadas no Flutter foi publicado originalmente no Hacker Noon on Medium, e as pessoas continuam a conversa realçando e respondendo à história. Fonte: compilado a partir de informações 0x de BITCOININSIDER. Copyright pertence ao autor Anonymous, sem permissão, não pode ser reproduzido Tom M. Mitchell forneceu uma definição mais formal amplamente citada: “Diz-se que um programa de computador aprende pela experiência E, com respeito a algum tipo de tarefa T e performance P, se sua performance P nas tarefas em T, na forma medida por P, melhoram com a experiência E.” Esta definição das tarefas envolvidas no aprendizado de máquina é dada de forma fundamentalmente operacional, ao invés de cognitiva, seguindo a proposta de Alan Turing em seu artigo “Computadores e inteligência”, em que a pergunta “As máquinas são capazes de pensar?” seja substituída pela pergunta “As máquinas são capazes de fazer o que (nós como entidades pensantes) podemos fazer?” Machine Learning e a Inteligência Artificial estão na ordem do dia, parecendo não haver nada que não lhes dê uso. No entanto, o que são exactamente estas coisas? E é aí que este Teachable Machine dá uma ajuda. Criado para ser utilizado de forma fácil em salas de aula, este Teachable Machine da Google permite que rapidamente se possam construir modelos de machine learning e ver o seu resultado. Por exemplo, podemos usá-lo para aprender a distinguir entre fotos de pessoas e de animais, objetos, posições (do corpo ou da cabeça), ou até sons. Em todos os casos o processo e sempre o mesmo, arranjar exemplos dos casos a diferenciar, treinar o sistema, e aplicá-lo. Iremos neste projeto, trabalhar com classificação de imagens. Passo 1: criar classes (rótulos) para um grupo de imagens. Neste nosso pequeno exemplo, iremos criar duas classes Cães e Gatos. Para facilitar nossa vida, iremos utilizar uma base de dados pronta (kaggle cats and dogs), mas poderíamos tirar nossas próprias fotos ou até mesmo pega-las na internet. Passo 2: Definir os parâmetros de treinamento e iniciar o treino. É possível analizar os resultados em tempo real clicando em Under the hood. Passo 3: Testar e exportar o modelo Salve seu projeto (Menu lateral esquerdo → Save Project to Drive) para conseguir acessar no futuro, caso queira fazer outras mudanças. Abra o Visual Studio Code, e abra a paleta de comandos (Ctrl + Shift + P) e digite: Flutter: New Project O diagrama abaixo apresenta as comunicações do nosso aplicativo. Por isso, dentro do projeto teremos um diretório chamado lib, e a arvore de arquivos deve ser como a apresentada abaixo: No arquivo pubspec.yaml adicione as seguintes dependências para este projeto Vamos atualizar o arquivo main.dart Crie a classe TFLiteResult (lib → models → tflite_result.dart), que utilizaremos para armazenar a resposta do classificador de imagens. Esta classe é baseada na documentação do Plugin TFLite: Sempre que possível, iremos criar alguns componentes para facilitar o desenho das telas e também para reutilizar componentes em outros projetos. Crie a classe CameraHelper (lib → components → camera_helper.dart), que servirá para capturar uma foto da câmera e devolver um arquivo. Para conhecer mais é só estudar o plugin ImagePicker que estamos utilizando. Crie a classe TFLiteHelper (lib → components → tflite_helper.dart), que utilizaremos para carregar o modelo treinador e classificar as fotos. Para conhecer mais é só estudar o plugin Tflite que estamos utilizando Para carregarmos o modelo, vamos precisar realizar algumas etapas: Crie a classe HomePage (lib → pages → home_page.dart), que utilizaremos para desenhar apresentar o resultado e a foto tirada pelo usuário quando precionar o botão flutuante. Agora, aperte F5 para iniciar a depuração do projeto Selecione um emulador existente ou crie um novo se for necessário. Se seu celular estiver plugado no computador e com o modo desenvolver ativado, você poderá rodar o aplicativo direto no celular.
O código completo pode ser baixado aqui. Espero que tenham gostado, deixem seus comentários a baixo e um forte abraço! Desafio
|