android

Criando Controles Customizados no Android

janeiro 17, 2015 - Android / Java

Este é um pequeno tutorial ilustrando os passos gerais para se criar um Controle (objeto de interface com o usuário) customizado no Android.

Esqueleto de um Controle customizado


Todos os controles são descendentes da classe android.view.View. O exemplo abaixo contém os elementos mais comuns que são definidos para um controle customizado.

  • Construtores

Deve-se necessariamente implementar pelo menos um construtor que receba um parâmetro do tipo Context e acione o construtor da classe mãe com ele.

Para suportar a configuração através de um arquivo de parâmetros em XML, um construtor que também receba um AttributeSet é necessário. O construtor deve analisar o AttributeSet recebido para obter os valores dos parâmetros de configuração; isso é feito usando-se um objeto TypedArray, como mostrado no exemplo.

  • onDraw()

O objeto de interface customizado é desenhado na Activity ou Fragment do usuário pelo método onDraw().

onDraw() recebe um objeto do tipo Canvas, que ele deve utilizar para desenhar a interface de usuário desejada. O método padrão da classe View apenas desenha um retângulo preenchido com a cor de fundo. Pode-se chamar o método padrão antes de fazer o desenho, assim não é necessário apagar o fundo.

A implementação de onDraw() deve ser o mais simples possível, para que possa ser executada e retornar rapidamente. Não se devem criar novos objetos, sempre crie objetos rascunho durante a inicialização do objeto customizado e os reutilize dentro do método onDraw(). Por exemplo, quase sempre é necessário um objeto Paint- que deve ser criado fora de onDraw() e somente utilizado por esse método. Por isso no exemplo anterior existe o método do_init().

  • onMeasure()

O método onMeasure() é acionado para calcular o tamanho desejado para o objeto, antes que ele venha a ser desenhado. Pode ser necessária uma implementação diferente deste método, caso o seu objeto possa mudar conforme o seu tamanho final.

onMeasure() precisa necessariamente acionar o método setMeasuredDimension() para definir as dimensões desejadas ou então acionar o método sobrecarregado da classe mãe.

Os parâmetros de onMeasure() são sugestões do sistema operacional para o tamanho do objeto na tela; no entanto, quando a especificação de tamanho for do tipo “EXACTLY”, o valor passado como parâmetro não deve ser alterado, devendo ser utilizado diretamente para definir o tamanho final do objeto na chamada ao método setMeasuredDimension().

  • onTouchEvent(), onKeyUp(), onKeyDown(), etc

Esses métodos devem ser sobrecarregados para definir o comportamento do objeto conforme o usuário o toque, pressione uma tecla enquanto o objeto estiver em foco, etc. Após o tratamento, o método pode acionar a classe mãe ou despachar o evento para ser utilizado pelo usuário, por exemplo através do método performClick().

Normalmente a interação com o usuário causa alterações no desenho do objeto; neste caso, uma atualização deverá ser requisitada através do método invalidate(), que vai provocar uma nova chamada a onDraw() no momento apropriado.

 

Definindo propriedades em arquivo XML


O objeto customizado pode definir propriedades para serem editadas em um arquivo XML, exatamente como os outros Controles do Android, por exemplo utilizando um editor de interface com o usuário (GUI) como o Eclipse ou o Android Studio.

Para definir as propriedades existentes, deve ser incluído um recurso do tipo <declare-styleable> no projeto, em um arquivo XML como attrs.xml :

O objeto assim declarado poderá ser incluído no projeto através do editor de GUI (na sessão “Custom & Library Views” e as propriedades definidas serão editáveis diretamente. Ele pode ser declarado na especificação da interface em XML, por exemplo:

Tais propriedades deverão ser lidas pelo construtor do objeto que recebe um AttributeSet,

As constantes utilizadas são definidas automaticamente pelo compilador na classe global “R”, conforme os nomes definidos no <declare-styleable>.

 

› tags: Android / GUI / Java /

Deixe um comentário

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">