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.