Uma visualização personalizada bem projetada é como qualquer outra classe bem projetada. Ela encapsula uma um conjunto específico de funcionalidade de aplicativo com uma interface simples, usa CPU e memória de forma eficiente e assim por diante. Em além de ser bem projetada, uma visualização personalizada precisa fazer o seguinte:
- Seguir os padrões do Android.
- Fornecer atributos de estilo personalizados que funcionem com layouts XML do Android.
- Enviar eventos de acessibilidade.
- Ser compatível com várias plataformas Android.
O framework do Android oferece um conjunto de classes base e tags XML para ajudar você a criar uma visualização que atende a todas as opções e cumprimento de requisitos regulatórios. Esta lição discute como usar o framework do Android para criar a versão principal funcionalidade de uma visualização .
Também é possível encontrar informações em Componentes de visualização personalizados.
Criar uma subclasse de uma visualização
Todas as classes de visualização definidas no framework do Android estendem
    View: Seu
    a visualização personalizada também
    estendem View diretamente, ou você pode
    economizar tempo estendendo uma das
    visualização atual
    subclasses, como Button.
Para permitir que o Android Studio interaja com sua visualização, você precisa fornecer pelo menos um construtor que use uma
Context e um objeto AttributeSet como parâmetros.
Esse construtor permite que o editor de layout crie e edite uma instância da sua visualização.
Kotlin
class PieChart(context: Context, attrs: AttributeSet) : View(context, attrs)
Java
class PieChart extends View { public PieChart(Context context, AttributeSet attrs) { super(context, attrs); } }
Definir atributos personalizados
Para adicionar um View integrado à interface do usuário, especifique-o em um elemento XML e
controlar seu
aparência e comportamento com os atributos do elemento. Também é possível adicionar e definir estilos
visualizações usando XML. Para
ativar esse comportamento na visualização personalizada, faça o seguinte:
- Defina atributos personalizados para sua visualização em um elemento de recurso <declare-styleable>.
- Especifique valores para os atributos no seu layout XML.
- Recuperar valores de atributo no momento da execução.
- Aplique os valores do atributo recuperados à sua visualização.
Esta seção discute como definir atributos personalizados e especificar os valores deles. A próxima seção aborda recuperação e aplicação dos valores no tempo de execução.
Para definir atributos personalizados, adicione recursos <declare-styleable>
     ao seu projeto. É comum colocar esses recursos em um
    res/values/attrs.xml. Aqui está
    um exemplo de um arquivo attrs.xml:
<resources> <declare-styleable name="PieChart"> <attr name="showText" format="boolean" /> <attr name="labelPosition" format="enum"> <enum name="left" value="0"/> <enum name="right" value="1"/> </attr> </declare-styleable> </resources>
Esse código declara dois atributos personalizados, showText e labelPosition,
    que pertencem a um estilo
    entidade chamada PieChart. Por convenção, o nome da entidade estilizável é o mesmo
    como
    nome da turma
    que define a visualização personalizada. Não é necessário seguir essa convenção,
    em muitos códigos populares
    os editores dependem dessa convenção de nomenclatura para fornecer o preenchimento da instrução.
Depois de definir os atributos personalizados, é possível usá-los em arquivos XML de layout, assim como os atributos
    atributos. O único
    A diferença é que seus atributos personalizados pertencem a um namespace diferente. Em vez de pertencer a alguém
    ao namespace http://schemas.android.com/apk/res/android, eles pertencem a http://schemas.android.com/apk/res/[your package name]. Por exemplo, veja como usar
    atributos definidos para
    PieChart:
    
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:custom="http://schemas.android.com/apk/res-auto"> <com.example.customviews.charting.PieChart custom:showText="true" custom:labelPosition="left" /> </LinearLayout>
Para evitar a repetição do URI do namespace longo, o exemplo usa uma
            xmlns. Essa diretiva atribui o alias custom a
            o namespace http://schemas.android.com/apk/res/com.example.customviews.
            Você pode escolher qualquer alias que quiser para seu namespace.
Observe o nome da tag XML que adiciona a visualização personalizada ao layout. É o
            nome qualificado do
            classe de visualização personalizada. Caso sua classe de visualização seja interna, qualifique-a ainda mais
            com o nome da classe externa da visualização.
            Por exemplo, o
            A classe PieChart tem uma classe interna chamada PieView. Para usar o
            atributos personalizados dessa classe,
            use a tag com.example.customviews.charting.PieChart$PieView.
Aplicar atributos personalizados
Quando uma visualização é criada a partir de um layout XML, todos os atributos na tag XML são lidos
            do recurso
            pacote e transmitido para o construtor da visualização como um
            AttributeSet:
            Embora seja
            ler valores diretamente do AttributeSet.
            tem algumas desvantagens:
- As referências de recursos dentro de valores de atributo não são resolvidas.
- Os estilos não são aplicados.
Em vez disso, transmita AttributeSet para
            obtainStyledAttributes().
            Esse método transmite de volta um
            TypedArray
            matriz de
            que são
            que já foram desreferenciadas e estilizados.
O compilador de recursos do Android trabalha muito para facilitar as chamadas
            obtainStyledAttributes()
            mais fácil. Para cada <declare-styleable>
            recurso no diretório res/, o R.java gerado define uma matriz de atributos
            IDs e um conjunto de
            constantes que definem o índice de cada atributo da matriz. Você usa o modelo
            constantes para ler
            os atributos do TypedArray. Saiba como
            a classe PieChart
            lê seus atributos:
Kotlin
init { context.theme.obtainStyledAttributes( attrs, R.styleable.PieChart, 0, 0).apply { try { mShowText = getBoolean(R.styleable.PieChart_showText, false) textPos = getInteger(R.styleable.PieChart_labelPosition, 0) } finally { recycle() } } }
Java
public PieChart(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.getTheme().obtainStyledAttributes( attrs, R.styleable.PieChart, 0, 0); try { mShowText = a.getBoolean(R.styleable.PieChart_showText, false); textPos = a.getInteger(R.styleable.PieChart_labelPosition, 0); } finally { a.recycle(); } }
Os objetos TypedArray
          são recursos compartilhados
            e precisam ser reciclados após o uso.
Adicionar propriedades e eventos
Os atributos são uma forma eficiente de controlar o comportamento e a aparência das visualizações, mas
            elas só podem ser lidas
            quando a visualização é inicializada. Para oferecer um comportamento dinâmico, exponha um getter de propriedade e
            par setter para cada
            atributo personalizado. O snippet a seguir mostra como PieChart expõe uma propriedade
            chamado showText:
Kotlin
fun isShowText(): Boolean { return mShowText } fun setShowText(showText: Boolean) { mShowText = showText invalidate() requestLayout() }
Java
public boolean isShowText() { return mShowText; } public void setShowText(boolean showText) { mShowText = showText; invalidate(); requestLayout(); }
Observe que setShowText chama invalidate().
            e requestLayout(). Essas ligações são cruciais
            para garantir que a visualização se comporte de maneira confiável. Você precisa
            para invalidar a visualização depois de qualquer alteração em suas propriedades que possa alterar sua
            aparência, para que
            ou sistema sabe que precisa ser redesenhado. Da mesma forma, você precisa solicitar um novo layout se
            uma propriedade muda de forma
            que possam afetar o tamanho ou
a forma da visualização. Esquecer essas chamadas de método pode fazer
            difícil de encontrar
            insetos.
As visualizações personalizadas também precisam ser compatíveis com listeners de eventos para comunicar eventos importantes. Para
            instância: PieChart
            expõe um evento personalizado chamado OnCurrentItemChanged para notificar os listeners que
            o usuário girou o
            gráfico de pizza para focar em uma nova fatia.
É fácil esquecer de expor propriedades e eventos, especialmente quando você é o único usuário da visualização personalizada. Definir com cuidado a interface da visualização reduz a manutenção futura custos. Uma boa regra a seguir é sempre expor qualquer propriedade que afete o aparência ou comportamento a visualização personalizada.
Design para acessibilidade
Sua visualização personalizada precisa oferecer suporte a uma grande variedade de usuários. Isso inclui usuários com deficiências que impedir que eles vejam ou usem uma tela sensível ao toque. Para apoiar usuários com deficiências, faça o seguinte:
- Rotule seus campos de entrada usando android:contentDescription. .
- Enviar eventos de acessibilidade chamando sendAccessibilityEvent()quando apropriado.
- Ofereça suporte a controles alternativos, como botão direcional ou trackball.
Para mais informações sobre como criar visualizações acessíveis, consulte Tornar os apps mais acessíveis.
 
  