Страница 1 из 1

шрифты

Добавлено: 12 дек 2013, 19:07
парень
Как добавить шрифт в свое предложение?

Если нельзя добавить шрифт, то можно ли Рисовать их программно?

Re: шрифты

Добавлено: 12 дек 2013, 19:39
trew
парень писал(а):Как добавить шрифт в свое предложение?
Если нельзя добавить шрифт, то можно ли Рисовать их программно?
Это больше, чем вы спрашивали :)
Рассказано как правильно добавлять шрифты.

Re: шрифты

Добавлено: 13 дек 2013, 05:21
парень
Спасибо. Правильно ли я понимаю, что надо скачать теперь этот шрифт и положить в папку asset?

а использовать только программно? Или можно его указывать в XML ?

Re: шрифты

Добавлено: 13 дек 2013, 05:43
парень
Можно ли поумолчанию сделать шрифт, типа в стиле или в теме?

Re: шрифты

Добавлено: 13 дек 2013, 08:38
rezak90
парень писал(а):Можно ли поумолчанию сделать шрифт, типа в стиле или в теме?
видимо ты мою статью так и не понял

Re: шрифты

Добавлено: 13 дек 2013, 10:00
adarash
парень писал(а):Можно ли по умолчанию сделать шрифт, типа в стиле или в теме?
Можно http://stackoverflow.com/questions/1228 ... -whole-app Но, я так полагаю, ты не очень владеешь android-ом, правильно? Решение, которое предложили тебе выше шикарно. Так что если могёшь и то, и то соединить воедино - дерзай. Если нет, то лучше используй статью и устанавливай программно. Результат будет тот же.

Если не понятно пишу - звиняйте, я не выспался.

Re: шрифты

Добавлено: 13 дек 2013, 10:28
парень
rezak90 писал(а):
парень писал(а):Можно ли поумолчанию сделать шрифт, типа в стиле или в теме?
видимо ты мою статью так и не понял
я лишь понял что если написать:

Код: Выделить всё

tvContent.setTypeface(Typefaces.get(getActivity(), FontType.ITALIC));
то тогда шрифт именно этого эллемента будет fonts/Roboto-Italic.ttf

а я спрашиваю есть ли способы чтобы в xml у эллемента я пишу например: font-famili:Roboto-italic и тогда это будет такой то шрифт???

Re: шрифты

Добавлено: 13 дек 2013, 11:08
rezak90
парень писал(а):а я спрашиваю есть ли способы чтобы в xml у эллемента я пишу например: font-famili:Roboto-italic и тогда это будет такой то шрифт???
есть, но опять таки ты не понял статью, если сделать как ты то будет утечка памяти

Re: шрифты

Добавлено: 13 дек 2013, 11:20
adarash
парень писал(а):
rezak90 писал(а):
парень писал(а):Можно ли поумолчанию сделать шрифт, типа в стиле или в теме?
видимо ты мою статью так и не понял
я лишь понял что если написать:

Код: Выделить всё

tvContent.setTypeface(Typefaces.get(getActivity(), FontType.ITALIC));
то тогда шрифт именно этого эллемента будет fonts/Roboto-Italic.ttf

а я спрашиваю есть ли способы чтобы в xml у эллемента я пишу например: font-famili:Roboto-italic и тогда это будет такой то шрифт???
печалька

Re: шрифты

Добавлено: 13 дек 2013, 15:38
парень
так. ребят. что за комментарии? обьясните мне тогда.

в статье есть класс который сделан для того чтобы не было утечки памяти - верно? (кстати в 8 строчке есть эллемент html'a <span...> - это опечатка? )

если я потом задаю эллементу с помощью этого класса шрифт то утечки нету. сам я не знаю как это проверить но полагаюсь на вас.

Вопрос остался актуальным - есть ли готовый пример реализации шрифта таким образом чтобы всем эллементам TextView задавался шрифт выбранный мной?

Я так понял уже, благодаря ссылке adarash'a , что это возможно. для этого надо соединить два данных мне вами примера.

А еще я понял что мне надо менять структуру своего приложения. ибо уже сам в нем не могу найти тот или иной метод.

можете посоветовать "правльный" на ваш взгляд вариант? чтобы было понятно например где лучше обработки писать - во фрагменте или в главной активити, а если ссыль есть на новую активити из фрамента то как лучше - то где лучше обрабатывать результат в созданной активити или чтобы она возвращала данные а обработка их шла в "родителе" ...

Надеюсь что-то из мною написанного понятно :) (2 сутки как не спал еще...)

Re: шрифты

Добавлено: 13 дек 2013, 15:43
rezak90
лучше проспись и потом задавай вопросы

Re: шрифты

Добавлено: 13 дек 2013, 15:53
парень
не могу :) отстаю от намеченного плана на сутки :)

Итак, вроде должно получится так: (поправьте если я ошибся)

создаем класс (он для кеша шрифта):

Код: Выделить всё

public class Typefaces
{

private static final Hashtable<String, Typeface> cache = new Hashtable<String, Typeface>();

public static Typeface get(Context context, FontType type)
{
synchronized (cache)
{
if (!cache.containsKey(type.name()))
{
Typeface tf = null;

switch (type)
{
case BLACK:
tf = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-Black.ttf");
break;
case BLACK_ITALIC:
tf = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-BlackItalic.ttf");
break;
case BOLD:
tf = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-Bold.ttf");
break;
case BOLD_CONDENSED:
tf = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-BoldCondensed.ttf");
break;
case BOLD_CONDENSED_ITALIC:
tf = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-BoldCondensedItalic.ttf");
break;
case BOLD_ITALIC:
tf = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-BoldItalic.ttf");
break;
case CONDENSED:
tf = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-Condensed.ttf");
break;
case CONDENSED_ITALIC:
tf = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-CondensedItalic.ttf");
break;
case ITALIC:
tf = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-Italic.ttf");
break;
case LIGHT:
tf = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-Light.ttf");
break;
case LIGHT_ITALIC:
tf = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-LightItalic.ttf");
break;
case MEDIUM:
tf = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-Medium.ttf");
break;
case MEDIUM_ITALIC:
tf = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-MediumItalic.ttf");
break;
case REGULAR:
tf = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-Regular.ttf");
break;
case THIN:
tf = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-Thin.ttf");
break;
case THIN_ITALIC:
tf = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-ThinItalic.ttf");
break;
default:
break;
}
cache.put(type.name(), tf);
}
return cache.get(type.name());
}
}

public enum FontType
{
BLACK, BLACK_ITALIC, BOLD, BOLD_CONDENSED, BOLD_CONDENSED_ITALIC, BOLD_ITALIC, CONDENSED, CONDENSED_ITALIC, ITALIC, LIGHT, LIGHT_ITALIC, MEDIUM, MEDIUM_ITALIC, REGULAR, THIN, THIN_ITALIC;
}

}
далее создаем класс который будет обрабатывать вьюшку:

Код: Выделить всё

public class MyTextView extends android.widget.TextView
{

    public MyTextView(Context context)
    {
        this(context, null);
    }

    public MyTextView(Context context, AttributeSet attrs)
    {
        this(context, attrs, 0);
    }

    public MyTextView(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs);
        if (this.isInEditMode()) return ;

        final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SomeStyle);
        final String customFont = a.getString(R.styleable.SomeStyle_font);

        
     //   this.setTypeface(Typeface.createFromAsset(context.getAssets(), customFont)
     // Так должно браться из кеша. Верно? 
        this.setTypeface(Typefaces.get(context, FontType.ITALIC));
        );  
    }
}
потом мы создаем attr.xml - Куда его засунуть?

Код: Выделить всё

<declare-styleable name="SomeStyle">
    <attr name="font" format="string" />
</declare-styleable>
далее в теме мы указываем это: это в mystyles.xml?

Код: Выделить всё

<item name="android:textViewStyle">@style/MyTextView</item>
потом мы задаем несколько стилей для вьюшки с несколькими шрифтами - Верно?

Код: Выделить всё

<style name="MyTextView1" parent="@android:style/Widget.TextView">
    <item name="font">МОЙШРИФТ1.ttf</item>
</style><style name="MyTextView2" parent="@android:style/Widget.TextView">
    <item name="font">МОЙШРИФТ2.ttf</item>
</style>

И тогда мы в эклипсе при создании xml разметки, просто задаем стиль вьюшке.

Это так?

Re: шрифты

Добавлено: 13 дек 2013, 23:38
парень
Разобрался. Все работает. В кеш загружается. В XML выбирать шрифт можно!

Для того чтобы шрифт отображался нам в XML файле надо отображать не TextView, а наш, кастомный:

Код: Выделить всё

 <com.example.buhg.RobotoTextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="qwe 123 бублик"
                android:textSize="25sp"
                app:font="LIGHT" />
com.example.buhg.RobotoTextView - com.example.bum - имя нажего приложения, RobotoTextView - класс который создадим далее.
app:font="LIGHT" - указывает название шрифта, я их делал "под себя", и вы можете их изменить. В моем приложении для экспериментов добавлено 18 шрифтов Roboto. Обратите внимание что если название шрифта указать с ошибкой, вылетит ошибка и приложение упадет.

Далее создадим класс Typefaces - он необходим для того чтобы в кеш загружался наш шрифт и не вызывал перезаполнение памяти...

Код: Выделить всё

import java.util.Hashtable;

import android.content.Context;
import android.graphics.Typeface;

public class Typefaces
{

private static final Hashtable<String, Typeface> cache = new Hashtable<String, Typeface>();

public static Typeface get(Context context, FontType type)
{
	
synchronized (cache)
{
if (!cache.containsKey(type.name()))
{
Typeface tf = null;

switch (type)
{

case BLACK:
tf = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-Black.ttf");
break;
case BLACK_ITALIC:
tf = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-BlackItalic.ttf");
break;
case BOLD:
tf = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-Bold.ttf");
break;
case BOLD_ITALIC:
tf = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-BoldItalic.ttf");
break;
case ITALIC:
tf = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-Italic.ttf");
break;
case LIGHT:
tf = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-Light.ttf");
break;
case LIGHT_ITALIC:
tf = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-LightItalic.ttf");
break;
case MEDIUM:
tf = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-Medium.ttf");
break;
case MEDIUM_ITALIC:
tf = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-MediumItalic.ttf");
break;
case REGULAR:
tf = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-Regular.ttf");
break;
case THIN:
tf = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-Thin.ttf");
break;
case THIN_ITALIC:
tf = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-ThinItalic.ttf");
break;
case CONDENSED_BOLD:
tf = Typeface.createFromAsset(context.getAssets(), "fonts/RobotoCondensed-Bold.ttf");
break;
case CONDENSED_BOLD_ITALIC:
tf = Typeface.createFromAsset(context.getAssets(), "fonts/RobotoCondensed-BoldItalic.ttf");
break;
case CONDENSED_ITALIC:
tf = Typeface.createFromAsset(context.getAssets(), "fonts/RobotoCondensed-Italic.ttf");
break;
case CONDENSED_LIGHT:
tf = Typeface.createFromAsset(context.getAssets(), "fonts/RobotoCondensed-Light.ttf"); 
break;
case CONDENSED_LIGHT_ITALIC:
tf = Typeface.createFromAsset(context.getAssets(), "fonts/RobotoCondensed-LightItalic.ttf"); 
break;
case CONDENSED_REGULAR:
tf = Typeface.createFromAsset(context.getAssets(), "fonts/RobotoCondensed-Regular.ttf"); 
break;

default:
break;
}
cache.put(type.name(), tf);
}
return cache.get(type.name());
}
}

public enum FontType
{
BLACK, BLACK_ITALIC, BOLD, BOLD_ITALIC, ITALIC, LIGHT, LIGHT_ITALIC, MEDIUM, MEDIUM_ITALIC, REGULAR, THIN, THIN_ITALIC, CONDENSED_BOLD, CONDENSED_BOLD_ITALIC, CONDENSED_ITALIC, CONDENSED_LIGHT, CONDENSED_LIGHT_ITALIC, CONDENSED_REGULAR;
}

}
ну и затем создадим класс RobotoTextView:

Код: Выделить всё

import com.example.buhg.Typefaces.FontType;

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.widget.TextView;

public class RobotoTextView extends TextView {

public RobotoTextView(Context context, AttributeSet attrs, int defStyle) {
	
    super(context, attrs, defStyle);
    if (!isInEditMode()) {
    	   

        final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SomeStyle);
        final String customFont = a.getString(R.styleable.SomeStyle_font);
        FontType typeA=FontType.THIN;
        typeA=FontType.valueOf(customFont);
        setTypeface(Typefaces.get(context, typeA));
    }
    
}

public RobotoTextView(Context context, AttributeSet attrs) {
	   this(context, attrs, 0);
    
}

public RobotoTextView(Context context) {
	 this(context, null);
}


}
typeA=FontType.valueOf(customFont); - если мы укажем в TextView что в первом коде неправильное название шрифта то именно здесь вылетит ошибка. Мои названия указаны в классе Typefaces:

Код: Выделить всё

public enum FontType
{
BLACK, BLACK_ITALIC, BOLD, BOLD_ITALIC, ITALIC, LIGHT, LIGHT_ITALIC, MEDIUM, MEDIUM_ITALIC, REGULAR, THIN, THIN_ITALIC, CONDENSED_BOLD, CONDENSED_BOLD_ITALIC, CONDENSED_ITALIC, CONDENSED_LIGHT, CONDENSED_LIGHT_ITALIC, CONDENSED_REGULAR;
}
Надеюсь кому то это поможет сэкономить то время что я потратил :)
И вопросик к более опытным - все верно я сделал? :)

update:
забыл указать что еще мы создаем файл attrs.xml и кидаем его в папку values.

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="SomeStyle">
    <attr name="font" format="string" />
</declare-styleable>
</resources>

Re: шрифты

Добавлено: 13 дек 2013, 23:57
adarash
Молодец. Одно забыл - иди проспись))))

Re: шрифты

Добавлено: 14 дек 2013, 00:31
парень
что-то не так сделал? Или это юмор - который я уже не понимаю? :)