quarta-feira, 9 de outubro de 2013

Criando Web Service utilizando o “Eclipse Juno"

A ideia deste artigo não é explorar conceitos mais profundos de “Web Services” e sim utilizar as ferramentas essenciais utilizando a linguagem Java. Para apenas relembrar os conceitos básicos do funcionamento de um “Web Service”, é importante ter em mente que sua principal função é de compartilhar, integrar dados entre sistemas de diferentes tipos de plataformas (Windows, Unix, Mac, MainFrame) e linguagens distintas (C#, VB, Java, Cobol, PHP, Delphi). O “Web Service” funciona como elo entre dois sistemas, pois é baseado em tecnologias abertas (XML e SOAP) que são reconhecidas em todas as plataformas descritas anteriormente. Para entendermos melhor iremos supor que a empresa The Club possui um sistema interno com todos os dados dos sócios e este possui relação com outros tipos de dados que precisaremos exibi-los em nosso site, sem precisarmos duplicar estas informações, a criação de um “Web Service” entra em ação neste momento. Resolveremos este tipo de situação programando um “Web Service” no servidor principal e disponibilizaremos o endereço URL do mesmo para o Site, ficando sempre atualizado e evitando o re-trabalho destas tarefas.

Funcionamento de um “Web Service”

Para entender o funcionamento de um “web service”, vamos supor que um cliente faz uma solicitação HTTP simples pelo navegador e o servidor onde está o “Web Service” faz um retorno com os dados processados em formato XML, de acordo com o arquivo WSDL. 

Ver Imagem 01 para maiores detalhes.

Figura 01: Funcionamento de um “Web Service”.

Tendo em mente este conceitos básicos podemos dar continuidade ao artigo, então, mãos a obra.

Pré-Requisitos

Teremos que instalar e configurar algumas ferramentas, sendo:


1) Eclipse Juno: Ferramenta IDE para desenvolvimento do “Web  Service”.
2) Apache Axis2: Framework para construção de “Web Services” no padrão SOAP.
3) Apache Tomcat: Servidor para publicar o “Web Service”.

Abaixo irei dar uma breve descrição sobre suas funcionalidades, onde baixá-los e a instalação e configuração necessária para um bom funcionamento. Todas estas ferramentas são freewares (gratuitas).

1) Eclipse Juno

É uma das principais IDEs de desenvolvimento Java, se tornando uma referência no desenvolvimento de softwares em geral. Esta versão Juno é uma das últimas lançadas (fim de junho de 2012), sendo que achei necessário destacar algumas características como o uso do Eclipse 4.x como plataforma, sendo que todas as versões anteriores ao Juno se embasavam na versão 3.x. A plataforma 4.x, que vem se desenvolvendo há algum tempo, apresenta mudanças significativas em alguns aspectos operacionais da IDE. Isso apresenta um desempenho melhor e um código mais limpo. É importante lembrar que apesar destas mudanças de plataforma, existirá compatibilidade para plug-ins desenvolvidos para a versão 3.x. Outro detalhe importante nesta versão é o suporte completo a versão 7 (sete) do Java, garantindo que o compilador já implementa por padrão todas as funcionalidade desta nova versão da linguagem, bem como o conjunto de ferramentas de desenvolvimento. Resumindo, para trabalharmos com desenvolvimento de “Web Services” esta ferramenta se comportou com total compatibilidade e facilidade.

Download

O download poderá ser realizado no link abaixo:
http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/juno/SR1/

Ver Imagem 02 para maiores detalhes.
  

Figura 02: Download do Eclipse.

Recomendo utilizar a opção “South America” para realizar o download.

Instalação

Importante: Antes de instalar o Eclipse é necessário possuir instalado o Java. 

Recomendo criar uma pasta no “C:\Softwares” para uma melhor organização de agora em diante. Todos os arquivos do Eclipse serão descompactados nesta pasta. Não existe instalação em si, apenas extraia os arquivos para podermos utilizá-lo daqui para frente. O nome da pasta contendo os arquivos deverá chamar “eclipse-jee-juno-SR1-win32” ou algo parecido. Arraste um atalho do executável para onde desejar trabalhar.

2) Apache Axis2

O Apache Axis2 é utilizado para fornecer e consumir “Web Services”. Pode funcionar como um “facilitador” de serviços Web embutido em outro software suportando o padrão “SOAP 1.1”, “SOAP 1.2” e o “REST”. Através do Axis2 os desenvolvedores podem criar aplicações distribuídas. Além da versão para Java, é importante salientar que existe uma implementação baseada na linguagem “C++” (Não iremos entrar em detalhes neste artigo). Através do Axis2 podemos gerar automaticamente o arquivo “WSDL” (Web Service Description Language) contendo as definições da interface dos “Web “Services”.

Download

O download deverá ser realizado no link:
http://axis.apache.org/axis2/java/core/download.cgi#std-bin

A Figura 03 nos dá mais detalhes.

 

Figura 03: Download do Axis2.

Localize a região “1.6.x releases” que significa as últimas versões lançadas, e em “Distribution” baixe a versão “Binary Distribution” escolhendo a extensão “zip”. 

Instalação

Apenas descompacte a pasta dos arquivos e salve na pasta “C:\Softwares”. O nome deverá ficar parecido com “axis2-1.6.2-bin”. 

3) Apache Tomcat

O Tomcat é um Servidor de Aplicações Java (“Conteiner Servlet”), servindo para interpretar aplicações escritas em Java para Web. Para quem não sabe, ele foi desenvolvido pela “Apache Software Foundation”. O Tomcat também possui outras características como atuar integrado a um servidor web dedicado como o Apache ou o “IID” (“Internet Information Service”), provendo um servidor web “HTTP” puramente em Java. Inclui ferramentas para configuração e gerenciamento.

Download

O Download poderá ser efetuado no link:
http://tomcat.apache.org/download-60.cgi

Ver Imagem 04.

Figura 04: Download do Tomcat.

Deslize a página até localizar a região 6.0.37 (significa a última versão até a data da publicação deste artigo). Em “Binary Distributions” (Distribuições em formato Binário) o item “Core” no meu caso utilizei a “32-bit Windows zip (PGP, md5)” que significa versão 32 Bits para o S.O. Windows. 

Instalação

Para realizar a instalação basta descompactar o arquivo que foi baixado anteriormente e salvá-lo em uma pasta. O nome do arquivo baixado deverá ficar idêntico a “apache-tomcat-6.0.37-windows-x86”.

Importante: Localize a pasta “\bin” do “axis2” em “C:\Softwares\axis2-1.6.2\bin” para copiarmos todos os arquivos contidos e colarmos todas as referências na pasta “\Lib” do “apache tomcat” em “C:\Softwares\apache-tomcat-6.0.37\lib”. Estes procedimentos foram necessários para termos acesso ao framework do Axis2 em nosso servidor de aplicações. 

Ver Figura 05 todos os programas essenciais.

Imagem 05: Softwares Instalados.

Preparando o ambiente de desenvolvimento

Neste momento é onde iremos configurar todo o ambiente de desenvolvimento. No primeiro momento vou configurar o Axis2 e logo em seguida o servidor Tomcat. Deveremos abrir o Eclipse Juno e clicar no item de menu “Window/Preferences”. No menu lateral esquerdo deve-se ir na opção “Webservices/Axis2 Preferences”. Ver Imagem 06.

Figura 06: Axix2 Preferences.

Nesta parte teremos duas opções, sendo: “Axis2 Run Time” (Axis2 em tempo de execução) e “Axis2 Preferences” com inúmeras configurações a serem abordadas. Clique na primeira opção e coloque o caminho onde o Axis2 foi instalado. Logo abaixo irá aparecer uma mensagem indicando que a configuração foi realizada com sucesso. Já na aba “Axis2 Preferences” marque a opção “Generate an Interface for Skeleton” para gerar apenas uma interface para o lado do servidor.
Na opção do menu na lateral esquerda localize o item “Webservice/Server and RunTime”. Ver Imagem 07.

Figura 07: Server and RunTime.

Aqui iremos selecionar em “Server RunTime” a versão 6 do servidor “Apache Tomcat” e em “Web service runtime” o framework “Apache Axis2”.Clique no botão “Apply” para finalizar esta etapa.
Agora deveremos configurar o Tomcat6. Para isto deveremos selecionar novamente a opção “Window/Preferences” e localizar a opção “Server/Runtime Environments” que significa executar ambientes em tempo de execução. Clique em “Add’ e selecione a versão 6 do Apache Tomcat. Ver Imagem 8. Clique em “Next”.

Figura 08: Selecionando o servidor Apache Tomcat.

Na próxima tela de configuração teremos o nome como: “Apache Tomcat v6.0”, o local onde deveremos indicar onde o Tomcat foi instalado e a versão do Eclipse que iremos trabalhar. Clique em “Finish” para encerrar esta etapa. Ver Imagem 09.

Figura 09: Configurações gerais do Tomcat.

Voltando para tela principal do Eclipse, localize na região inferior a aba chamada “Servers”. É exatamente aqui que adicionaremos o servidor Apache Tomcat. Clique com o botão direito Escolhendo “New/Server”. Ver Imagem 10. 

Figura 10: Adicionando o servidor.

Na próxima tela escolha em “Server Runtime Environment“ o servidor previamente configurado e clique em “Finish”. 

Criando o Exemplo

Deveremos clicar em “File/New/Other...” navegar até a aba Web/Dynamic Web Project”. Clique em “Next” para darmos continuidade. Ver Imagem 11. 

Figura 11: Criando um “Dynamic Web Project”. 

Em “Project name” defina como “webservicetc”. Escolha um local para ser salvo o projeto em “Project location”. Em “Target runtime” por padrão estará configurado o servidor Apache Tomcat 6 configurado anteriormente. Usaremos a última versão em “Dynamic web module version” e em “Configuration” teremos que modificar alguns parâmetros, para isto clique em “Modify...”. Ver Imagem 12.

Figura 12: Configurações.

Adicione o Item “Axis2 Web Services” para usarmos ao decorrer do desenvolvimento todas as extensões instaladas do Axis2. Finalizamos este processo clicando em “Ok”.  

Codificando o exemplo

O nosso “Web Service” funcionará da seguinte forma. Teremos uma classe com os dados dos clientes chamada“Clientes.java” e outra “TheClubWS.java” para carregarmos a classe Cliente e retorná-la em formato XML.

Classe “Clientes.java” 

Localize no projeto a pasta “Java Resources/src” para criarmos um pacote chamado “theclub”. Para quem não sabe, clique com o botão direito e escolha “New/Package”. Dentro deste pacote é onde a classe “Clientes.java” deverá estar localizada. Criaremos alguns atributos como: Id, Nome, Tipo, Cidade. Programe corretamente os métodos “Get” e “Set” para posteriormente podermos obter e devolver  valores. Ver Listagem abaixo:


package theclub;

public class Clientes
{
         private int Id;
         private String Nome;
         private String Tipo;
         private String Cidade;
       
         public int getId()
         {
              return Id;
         }

         public void setId(int id)
         {
              Id = id;
         }

         public String getNome()
         {
              return Nome;
         }

         public void setNome(String nome)
         {
              Nome = nome;
         }

         public String getTipo()
         {
              return Tipo;
         }

         public void setTipo(String tipo)
         {
              Tipo = tipo;
        }

         public String getCidade()
         {
              return Cidade;
         }

         public void setCidade(String cidade)
         {
              Cidade = cidade;
         }
       
         public Clientes()
         {
       
         }
}

 

Classe TheClubWS.java

Repetimos o processo descrito acima para implementarmos a classe “TheClubWS.java”. Vamos criar um método que terá como retorno uma lista de Clientes. Ver código abaixo:


package theclub;

Importe as bibliotecas para trabalharmos com Listas e Vetores do tipo Listas respectivamente.

import java.util.ArrayList;
import java.util.List;

public class TheClubWS
{  
      public List<Clientes> SelecionarClientes()
      {
          List<Clientes> list = new ArrayList<Clientes>();
           try
           {
               Clientes clientes1 = new Clientes();
               clientes1.setId(1);
               clientes1.setNome("Thiago");
               clientes1.setTipo("Físico");
               clientes1.setCidade("Avaré");
                list.add(clientes1);
                
                Clientes clientes2 = new Clientes();
               clientes2.setId(2);
               clientes2.setNome("Marcos");
               clientes2.setTipo("Físico");
               clientes2.setCidade("Avaré");
                list.add(clientes2);
           
                Clientes clientes3 = new Clientes();
               clientes3.setId(3);
               clientes3.setNome("Vitor");
               clientes3.setTipo("Físico");
               clientes3.setCidade("Avaré");
                list.add(clientes3);
           
                Clientes clientes4 = new Clientes();
               clientes4.setId(4);
               clientes4.setNome("The Club");
               clientes4.setTipo("Jurídico");
               clientes4.setCidade("Avaré");
                list.add(clientes4);
            
              return list;
            
          }
           catch (Exception e)
           {
              return null;
           }
       
      }
   
}

 

O método SelecionarClientes() terá como retorno uma variável do tipo lista de Clientes. Alimentaremos a classe Clientes com alguns dados e armazenaremos o resultado em uma variável do Tipo ArrayList. 

Na aba Project Explorer clique com o botão direito sobre a classe “theClubWS” e localize a opção “Web Services/Create Web Service”. Ver Imagem 13.

Figura 13: Gerando o “Web Service”.

Nesta tela temos algumas informações do lado servidor como Tipo, Implementação, demonstrativo de configurações do servidor Tomcat, do framework Axis2 e do projeto em questão. Temos também configurações do lado cliente, que por padrão deixaremos como “No Client”. Clique em “finish” para finalizar a etapa de criação do “web service”. Rode a aplicação de exemplo e terá uma tela parecida com a Imagem 14.

Figura 14: Run On Server.

Nesta tela teremos opções de escolher o servidor Apache Tomcat que já está pré-configurado ou definir um novo servidor. Deixaremos como padrão clicando no botão Finalizar. A Figura 15 é a tela de boas vindas e indica que tudo ocorreu corretamente. A opção “Services” nos dará maiores detalhes sobre os “web services” rodando no momento. 

Figura 15: Tela de Boas Vindas.

A Figura 16 nos dá uma descrição completa do “Web Service”, como por exemplo, o local onde está publicado, o status e todas as operações disponíveis. Clique sobre o “TheClubWS” para conferir o XML correspondente.

Figura 16: Descritivo do Serviço.

Enfim teremos o endereço para consumir o “web service”.
http://localhost:8080/webservicetc/services/TheClubWS?wsdl 

A Figura 17 nos mostra todo o código XML.

Figura 17: XML Correspondente. 

Podemos consumir este serviço em qualquer plataforma ou linguagem de programação como foi dito no começo do artigo. Basta atribuir o endereço citado anteriormente que será listado os métodos contidos neste serviço, no caso será listado o método SelecionarCliente(), tendo como retorno uma lista de dados dos Clientes. Por exemplo, utilizando o Microsoft Visual Studio (Para maiores detalhes recomendo a leitura do artigo “Asp.Net – Trabalhando com Web Services”, que poderá ser conferido no mês 05/2013) teremos um retorno idêntico ao da Figura 18.

Figura 18: Consumindo ‘Web Service”. 

Conclusão

Utilizando a linguagem Java, aprendemos neste artigo um pouco sobre todas as ferramentas necessárias para construir “Web Services”. Envolvemos a versão Juno do Eclipse, o servidor de aplicação Web Apache Tomcat e o framework Axis2 para publicação no padrão SOAP. Exploramos deste o download até a instalação e configuração no ambiente de desenvolvimento. Montamos também um pequeno exemplo envolvendo os conceitos fundamentados ao decorrer deste artigo.
Espero que tenham gostado um forte abraço e até o mês que vem!

 

terça-feira, 20 de agosto de 2013

Android – Trabalhando com o TouchScreen


Um dos recursos mais poderosos e fascinantes no desenvolvimento utilizando o sistema android é a possibilidade de poder interceptar eventos na tela com o toque do dedo, o “TouchScreen”. Temos classes específicas para este trabalho, a minha idéia neste mês é descrever as principais funcionalidades destas classes junto com seus métodos criando exemplos didáticos e de grande utilidade no dia-a-dia.

Eventos de Entrada (“Input Events”)

Existem várias maneiras de interceptar os eventos de interação do usuário com o aplicativo. Ao considerar eventos dentro de sua interface de usuário, a abordagem é capturar os eventos dentro da região denominada “View”, fornecendo os meios para fazê-lo. Quando compomos um layout, fazemos o uso de quantas “Views” forem necessárias, neste caso, podemos observar vários métodos de retorno de chamada pública que parecem úteis para os denominados eventos de InPut(entrada) e OutPut(saída). Esses métodos são chamados pelo Android quando a respectiva ação ocorre no objeto em questão. Por exemplo, quando um componente (um botão) é tocado, o método “onTouchEvent()” é acionado no objeto. No entanto, a fim de interceptar isso, você deve estender a classe e substituir o método. No entanto, ampliando cada objeto “View”, a fim de lidar com um evento como esse não seria prático. É por isso que a classe “View” também contém uma coleção de interfaces aninhadas com retornos de chamada que poderemos utilizar com uma maior facilidade. Estas interfaces, chamadas de “Listeners” (“ouvintes”), são o seu “bilhete” para capturar a interação do usuário com a interface do aplicativo. Temos a possibilidade de estender uma classe “View”, a fim de construir por exemplo um componente personalizado. Outra situação é estender a classe “Button” para fazer algo mais sofisticado. Neste caso, poderemos definir os comportamentos de eventos padrão para sua classe usando os manipuladores de eventos, os (“Event Handlers”)

Manipuladores de Eventos (“Event Handlers”)

De acordo com a própria documentação do Android, quando estamos construindo um componente a partir da classe “View” teremos vários métodos para serem implementados, sendo:
onKeyDown (int, KeyEvent) - Chamado quando apertamos alguma tecla.
onKeyUp (int, KeyEvent) - Chamado quando soltamos alguma tecla.
onTrackballEvent (MotionEvent) - Chamado quando ocorre um evento de movimento.
onTouchEvent (MotionEvent) - Chamado quando ocorre um evento de movimento da tela com o toque do dedo.
onFocusChanged (boolean, int, Rect) - Chamado quando recebemos ou perdemos o foco.
Demonstrei os métodos acima a fim de apresentar os manipuladores existentes. Daremos importância ao evento “OnTouchEvent”.

Entendendo a classe “MotionEvent”

A classe base para suporte TouchScreen é a classe “MotionEvent” onde é passado para as “Views” através do método onTouchEvent () (abordado anteriormente) podendo também ser sobrecarregado . Vejamos na Imagem 01 a hierarquia desta classe para maiores informações.

Figura 01: Estrutura da classe “MotionEvent”.

A classe “MotionEvent” contém inúmeros métodos e constantes como por exemplo: informações das coordenadas X, Y e capturas de movimentos.

Principais métodos e constantes

- GetAction(): Este método recebe a ação que foi executada, fornecendo as seguintes constantes para determinar a ação.

ACTION_DOWN: Ação que ocorre quando um toque foi iniciado contendo o local de partida inicial do movimento.
ACTION_UP: Esta constante é acionada quando um gesto pressionado tenha terminado, contendo a localização final, bem como todos os pontos intermediários desde o último movimento.
ACTION_MOVE: Ação que ocorre entre as constantes ACTION_DOWN e ACTION_UP. (A movimentação em si)

Todas as constantes abordadas acima retornam um valor inteiro.

- GetY(): Este método retorna um valor do tipo “Float” das coordenadas “Y” (linha vertical). Este valor pode ser transformado para inteiro.
- GetX():Este método retorna um valor do tipo “Float” das coordenadas “X” (Linha horizontal). Este valor pode ser transformado para inteiro.

Exemplo 1 - Movimentando uma Imagem com o toque do dedo

Nos exemplos deste artigo iremos envolver todos os conceitos aprendidos anteriormente sendo que neste primeiro criaremos uma imagem dinamicamente. Esta imagem será movimentada com o dedo e usando o “TouchScreen” na tela do dispositivo. Para isto descreverei todos os passos daqui pra frente.
Inicie uma aplicação do Zero clicando em “File/New/Android Project...” criando uma classe para estender (extends) para a interface “View”. Clique sobre o pacote e com o botão direito escolha “New/Class”. É nesta classe onde criaremos todos os métodos responsáveis pela movimentação da Imagem em questão. Ver Figura 02.


Figura 02: Criando a classe “CriarImagem.java”.

Como foi discutido anteriormente, devemos utilizar a classe “View” para implementarmos o método OnTouchEvent().
Classe “CriarImagem.java”
Antes de iniciarmos a codificação desta classe será necessário adicionar uma imagem qualquer em nosso aplicativo. Basta copiar e colar no diretório “res/drawable-hdpi”. Ver Imagem 03.

Figura 03: Imagem adicionada no projeto.

Observação Importante: 

Esta imagem deverá ser do tipo “.png” ou “jpg” possuindo o nome escrito especificamente em caixa baixa para assim evitar problemas de compilação.

Logo em seguida importaremos as bibliotecas que serão utilizadas ao decorrer do desenvolvimento.

package pct.Android_OnTouchEvent;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
public class CriarImagem extends View
{
     private Drawable imagem;
     private int x, y, largura, altura;
     private boolean Clicou;
     public int movimento = 12;

A classe principal “CriarImagem” herdará da classe “View”. Utilizaremos algumas variáveis privadas, sendo uma do tipo “Drawable” responsável por trabalhar com a imagem, outras do tipo “int” onde definimos a largura, altura, as coordenadas X, Y e uma booleana indicando se clicamos ou não na imagem.

public CriarImagem(Context context, AttributeSet attrs)
{
     super(context, attrs);
imagem =    context.getResources().getDrawable(R.drawable.theclub);
     largura = imagem.getIntrinsicWidth();
     altura = imagem.getIntrinsicHeight();
     x = 150;
     y = 300;
     setFocusable(true);
}

No método Construtor passamos dois parâmetros: o “Context” o Contexto da aplicação e o “AttributeSet” que significa uma coleção de atributos que podem ser utilizados dentro deste método.  O método “context.getResources().getDrawable()” irá recuperar a imagem, os métodos “getIntrinsicWidth()” e “getIntrinsicHeight()” irão retornar a largura e altura respectivamente, x e y serão as coordenadas para posicionamento da imagem em relação a tela do dispositivo. Já o método “setFocusable()” definirá se a “view” irá ou não receber o foco enquanto estiver em modo “TouchScreen”. Deixaremos como “true”

@Override
protected void onDraw(Canvas canvas)
{
     super.onDraw(canvas);
     imagem.setBounds(x,y,x+largura,y+altura);
     imagem.draw(canvas);
}


Para desenhar a imagem foi necessário reescrever o método “OnDraw()” tendo como parâmetro a classe “Canvas”. Passamos as coordenadas X e Y e a largura e altura utilizando o método “setBounds()” e redesenhamos com o “draw()” usando a classe “Canvas”. Este método é disparado sempre quando necessitamos redesenhar a imagem.


public boolean onTouchEvent(MotionEvent motionEvent)
{
     this.x = (int)motionEvent.getX();
     this.y = (int) motionEvent.getY();
        
     switch(motionEvent.getAction())
     {
         case MotionEvent.ACTION_DOWN:
         {
              Clicou = imagem.copyBounds().contains(x,y);
              break;
         }
                    
         case MotionEvent.ACTION_MOVE:
          if (Clicou)
          {
              this.x = x - (largura/2);
              this.y = y - (altura/2);
              break;
          }
                                          
         case MotionEvent.ACTION_UP :
         {
              Clicou = false;
              break;
         }
      }
        
     invalidate();
     return true;
}

Este é o principal evento que iremos trabalhar. Ele tem como parâmetro de entrada a classe “MotionEvent” e retorna um valor booleano. No primeiro momento iremos atribuir às variáveis globais X e Y as respectivas coordenadas com os métodos “getX()” e “getY()”. Faremos um “Case” para comparar as Constantes do método “GetAction()”, o mesmo que recebe a ação que foi executada, fornecendo constantes para determinar a ação. Na constante “ACTION_DOWN” com o método “copyBounds()” indicamos que clicamos na imagem informando suas coordenadas. A constante “ACTION_MOVE”, faz o ato de mover em si, movimentamos a figura fazendo o cálculo das coordenadas menos o tamanho dividido por dois, dando uma impressão de movimento. Por final retiramos o foco com a constante “ACTION_UP”. Resumindo, este método irá movimentar a Imagem conforme o toque do dedo.

Configurações no “AndroidManifest.xml”

Nas configurações do arquivo “AndroidManifest.xml” não faremos praticamente nada de mirabolante, apenas setamos o uso da “Activity” “Android_OnTouchEventActivity” que será comentado logo a seguir. Ver em seguida a listagem completa.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="pct.Android_OnTouchEvent"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="8" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".Android_OnTouchEventActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
</manifest>

Configurações no “Strings.xml”

Este arquivo irá definir algumas constantes que serão abordadas ao decorrer do projeto, como por exemplo: a cor cinza que preencherá o fundo onde movimentaremos a imagem. Ver código abaixo:.

<?
xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Trabalhando com o evento OnTouchEvent!</string>
    <string name="app_name">The Club - Android</string>
    <color name="cinza">#D0D0D0</color>
</resources>

Criando o “Lay-Out”

O aplicativo possuirá um “LinearLayout” onde conterá um “TextView” e um componente chamado desenho que faz referência à classe “CriarImagem”. Ver Imagem 04.

Figura 04: Componentes utilizados.

A Imagem 05 nos dá uma noção do Lay-out.

Figura 05: Lay-Out do exemplo 1.

O XML correspondente:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello"
    />
<pct.Android_OnTouchEvent.CriarImagem
     android:id="@+id/desenho"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:background="@color/cinza"   
     />   
</LinearLayout>

Devemos dar uma atenção especial na linha de código abaixo:

<
pct.Android_OnTouchEvent.CriarImagem />


Percebam que interessante, conseguimos chamar diretamente uma classe (no caso uma “View”) de dentro do XML, é fantástico!

Codificando o exemplo 1

Seguindo a lógica, a atividade “Android_OnTouchEventActivity” que codificaremos a seguir, possuirá uma chamada para o lay-out “criarimagem.xml” que dentro do mesmo teremos a classe “CriarImagem.java”, na qual está localizada toda a codificação de nosso exemplo.

package pct.Android_OnTouchEvent;

import android.app.Activity;
import android.os.Bundle;

public class Android_OnTouchEventActivity extends Activity
{            
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.criarimagem);
    }
    
}
O “SetContentView()” será o método que irá chamar a tela de nosso aplicativo. Ver Imagem 06.

Exemplo em “Run-Time”

Figura 06: Movimentando a Imagem “The Club”.

Exemplo 2 – Pintando e escrevendo na Tela com o toque do dedo

Este segundo exemplo irá pintar e desenhar na tela de nosso aplicativo com o toque do dedo. Aprenderemos também a trabalhar com a classe “Paint”, “Path” entre outras. Os passos são idênticos ao do exemplo anterior, por isto detalharei um pouco menos para ficar menos cansativo abordando apenas os conceitos inéditos.
Chega de conversa e vamos ao trabalho!

Classe “PintarTela.java”

Utilizaremos algumas bibliotecas adicionais para desenvolver este exemplo, veja abaixo:

package
pct.Android_OnTouchEvent;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

Temos a classe “android.graphics.Paint” sendo específica para pintura, estilo, cor. Ela também oferece base para desenhar geometrias, texto e bitmaps. Já a classe “android.graphics.Path” permite realizar contornos e formas geométricas como: segmentos de linhas retas, curvas quadráticas e cúbicas.

public class PintarTela extends View
{   
     private Paint paint = new Paint();
     private Path path = new Path();

Esta classe também herdará da classe “View” e utilizará dois objetos, do tipo “Paint” e “Path”.

      public PintarTela(Context context, AttributeSet attrs)
     {
        super(context, attrs);

        paint.setAntiAlias(true);
        paint.setStrokeWidth(6);
        paint.setColor(Color.BLUE);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeJoin(Paint.Join.ROUND);
      }

Temos o método “setAntiAlias()” que serve para suavizar as bordas de nosso toque, o “setStrokeWidh()” é o tamanho da linha, o “setColor()” para definir a cor, o “setStyle()” o estilo e o “setStrokeJoin()” é um tratamento específico para quando as linhas se juntarem.

        @Override
       protected void onDraw(Canvas canvas)
       {
         canvas.drawPath(path, paint);
       }

Método que irá desenhar usando as configurações definidas anteriormente na classe “Paint”.

        @Override
       public boolean onTouchEvent(MotionEvent motionEvent)
       {
           float eventX = motionEvent.getX();
          float eventY = motionEvent.getY();

          switch (motionEvent.getAction())
          {
              case MotionEvent.ACTION_DOWN:
                  path.moveTo(eventX, eventY);
                  return true;
              case MotionEvent.ACTION_MOVE:
                  path.lineTo(eventX, eventY);
                  break;
                  default:
                  return false;
           }

           invalidate();
           return true;
       }
Usaremos apenas as constantes “ACTON_DOWN” para dar início do movimento de acordo com as coordenadas definidas fazendo o uso do método “MoveTo()” e a “ACTION_MOVE”para adicionar uma linha a partir do último ponto especificado pelas coordenadas (x, y).

Configurações no “AndroidManifest.xml”

Adicionaremos algumas configurações básicas neste arquivo já comentado mais acima, veja o trecho:
...
<activity android:name=".Android_OnTouchEventActivity_2"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
...
Criando o “Lay-Out”

Teremos um “LinearLayout” onde conterá um “TextView” e um componente chamado desenho que faz referência à classe “Pintartela”. Ver Imagem 07.

Figura 07: Lay-Out do exemplo 2.

O XML correspondente:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello"
    />
   
<pct.Android_OnTouchEvent.PintarTela
     android:id="@+id/desenho"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     />   
</LinearLayout>

Codificando o Exemplo 2

Seguindo os passos que já foram descritos acima foi necessário criar uma classe estendendo de uma “Activity” para invocarmos o XML contendo a classe “PintarTela”. O método “SetContentView()” irá chamar a tela de nosso aplicativo. Ver Imagem 08.
Abaixo código completo.

package pct.Android_OnTouchEvent;
import android.app.Activity;
import android.os.Bundle;

public class Android_OnTouchEventActivity_2 extends Activity
{   
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.pintartela);
    }
}

Exemplo em “Run-Time”

Figura 08: Desenhando e Pintando em “Run-Time”.

Referências


Conclusões

Uma das formas de interceptar os eventos de interação do usuário com o aplicativo é capturar estes eventos dentro de uma região chamada “View”. É a partir desta classe que discorremos o artigo deste mês. Trabalhamos com o evento “OnTouchEvent()”, que é o evento que capta o toque do dedo na tela do dispositivo e a classe “MotionEvent”, classe base para suporte para esta tarefa junto com métodos e constantes. No primeiro exemplo procurei demonstrar como movimentar uma imagem com o “TouchScreen”, já no segundo como pintar e escrever na tela do aplicativo. Esta é uma das inúmeras formas de usar os recursos “TouchScreen” na programação Android.

Espero que tenham gostado! Deixo aqui um abraço e nos vemos no mês que vem!