Fontes personalizadas no Android de maneira boa.
Você está farto de visualizações personalizadas para definir fontes? Ou atravessando o ViewTree para encontrar visualizações de texto? Sim eu também.
Inclua o download de dependência (.aar):
dependencies {
compile ' uk.co.chrisjenx:calligraphy:2.3.0 '
}
Adicione suas fontes personalizadas aos assets/
. Todas as definições de fonte são relativas a esse caminho.
Supondo que você esteja usando o gradle, você deve criar o diretório de ativos no src/main/
no diretório do seu projeto, se ele ainda não existir. Como é popular usar compilação com vários projetos com gradle, o caminho geralmente é app/src/main/assets/
, onde app
é o nome do projeto.
Você pode considerar a criação de uma fonts/
subdiretório no diretório de ativos (como nos exemplos).
< TextView fontPath = " fonts/MyFont.ttf " />
Nota: o espaço para nome ausente, isso é intencional.
Defina sua fonte padrão usando CalligraphyConfig
, na sua classe Application
no método #onCreate()
.
@ Override
public void onCreate () {
super . onCreate ();
CalligraphyConfig . initDefault ( new CalligraphyConfig . Builder ()
. setDefaultFontPath ( "fonts/Roboto-RobotoRegular.ttf" )
. setFontAttrId ( R . attr . fontPath )
. build ()
);
//....
}
NOTA: Você não precisa definir CalligraphyConfig
, mas a biblioteca não aplicará a fonte padrão e usará o atributo padrão do R.attr.fontPath
.
Enrole o contexto Activity
:
@ Override
protected void attachBaseContext ( Context newBase ) {
super . attachBaseContext ( CalligraphyContextWrapper . wrap ( newBase ));
}
Você está pronto para ir!
< TextView
android : text = " @string/hello_world "
android : layout_width = " wrap_content "
android : layout_height = " wrap_content "
fontPath = " fonts/Roboto-Bold.ttf " />
Nota: O IDE popular (Android Studio, Intellij) provavelmente marcará isso como um erro, apesar de estar correto. Você pode adicionar tools:ignore="MissingPrefix"
à própria exibição ou ao seu grupo de vista para os pais para evitar isso. Você precisará adicionar o espaço para nome das ferramentas para ter acesso a esse atributo "ignorar". xmlns:tools=" http://schemas.android.com/tools"
. Consulte https://code.google.com/p/android/issues/detail?id=65176.
< style name = " TextAppearance.FontPath " parent = " android:TextAppearance " >
<!-- Custom Attr -->
< item name = " fontPath " >fonts/RobotoCondensed-Regular.ttf</ item >
</ style >
< TextView
android : text = " @string/hello_world "
android : layout_width = " wrap_content "
android : layout_height = " wrap_content "
android : textAppearance = " @style/TextAppearance.FontPath " />
< style name = " TextViewCustomFont " >
< item name = " fontPath " >fonts/RobotoCondensed-Regular.ttf</ item >
</ style >
< style name = " AppTheme " parent = " android:Theme.Holo.Light.DarkActionBar " >
< item name = " android:textViewStyle " >@style/AppTheme.Widget.TextView</ item >
</ style >
< style name = " AppTheme.Widget " />
< style name = " AppTheme.Widget.TextView " parent = " android:Widget.Holo.Light.TextView " >
< item name = " fontPath " >fonts/Roboto-ThinItalic.ttf</ item >
</ style >
A CalligraphyFactory
procura a fonte em uma ordem bastante específica, na maioria das vezes é muito semelhante à forma como a estrutura do Android resolve atributos.
View
XML - Att attr aqui sempre terá prioridade.Style
XML - Att attr definido aqui é verificado em seguida.TextAppearance
XML - O att é verificado em seguida, a única ressalva para isso é se você tiver uma fonte definida no Style
e um TextAttribute
definido na View
que o atributo Style
é escolhido primeiro!Theme
- Se definido, isso é usado.Default
- Se definido no CalligraphyConfig
isso é usado de nenhuma das opções acima , ou se um dos itens acima retornar uma fonte inválida.Originalmente, mas em conflito com usuários que desejam usar esse atributo, agora você precisa definir um atributo personalizado.
Precisávamos enviar um ID personalizado com caligrafia para melhorar o fluxo de injeção de fonte. Infelizmente, isso significa que tem que ser um aar
. Mas você está usando o gradle agora, certo?
É possível usar vários tipos de letra dentro de uma TextView
, este não é um novo conceito para o Android.
Isso pode ser alcançado usando algo como o código a seguir.
SpannableStringBuilder sBuilder = new SpannableStringBuilder ();
sBuilder . append ( "Hello!" ) // Bold this
. append ( "I use Calligraphy" ); // Default TextView font.
// Create the Typeface you want to apply to certain text
CalligraphyTypefaceSpan typefaceSpan = new CalligraphyTypefaceSpan ( TypefaceUtils . load ( getAssets (), "fonts/Roboto-Bold.ttf" ));
// Apply typeface to the Spannable 0 - 6 "Hello!" This can of course by dynamic.
sBuilder . setSpan ( typefaceSpan , 0 , 6 , Spanned . SPAN_EXCLUSIVE_EXCLUSIVE );
setText ( sBuilder , TextView . BufferType . SPANNABLE );
Claro que este é apenas um exemplo. Sua milhagem pode variar.
Até onde sabemos (tente: grep -r -e "void set[^(]*(Typeface " <android source dir>
) Existem dois widgets padrão do Android que possuem vários métodos para definir tipos de letra. São eles:
Ambos têm um método chamado setSwitchTypeface
que define o tipo de letra dentro do comutador (por exemplo/desativado, sim/não). SetTypeface
define o tipo de letra do rótulo. Você precisará criar sua própria subclasse que substitua setTypeface
e chama super.setTypeface
e super.setSwitchTypeface
.
Esta biblioteca foi criada porque atualmente não é possível declarar uma fonte personalizada nos arquivos XML no Android.
Se você acha que isso deve ser possível, por favor, estrela este problema no rastreador oficial de bugs Android.
Copyright 2013 Christopher Jenkins
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.