шрифты

Интерфейс, диалоги, темы, стили, меню
Ответить
парень
Сообщения: 223
Зарегистрирован: 30 мар 2013, 22:52

шрифты

Сообщение парень » 12 дек 2013, 19:07

Как добавить шрифт в свое предложение?

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

Бьем рекорды русских топов :)

Могу ответить на любые вопросы по маркетингу и развитию.

Аватара пользователя
trew
Сообщения: 450
Зарегистрирован: 28 сен 2013, 17:34

Re: шрифты

Сообщение trew » 12 дек 2013, 19:39

парень писал(а):Как добавить шрифт в свое предложение?
Если нельзя добавить шрифт, то можно ли Рисовать их программно?
Это больше, чем вы спрашивали :)
Рассказано как правильно добавлять шрифты.
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.

парень
Сообщения: 223
Зарегистрирован: 30 мар 2013, 22:52

Re: шрифты

Сообщение парень » 13 дек 2013, 05:21

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

а использовать только программно? Или можно его указывать в XML ?
Мой первенец: MyMoney. Менеджер расходов

Бьем рекорды русских топов :)

Могу ответить на любые вопросы по маркетингу и развитию.

парень
Сообщения: 223
Зарегистрирован: 30 мар 2013, 22:52

Re: шрифты

Сообщение парень » 13 дек 2013, 05:43

Можно ли поумолчанию сделать шрифт, типа в стиле или в теме?
Мой первенец: MyMoney. Менеджер расходов

Бьем рекорды русских топов :)

Могу ответить на любые вопросы по маркетингу и развитию.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: шрифты

Сообщение rezak90 » 13 дек 2013, 08:38

парень писал(а):Можно ли поумолчанию сделать шрифт, типа в стиле или в теме?
видимо ты мою статью так и не понял
R.id.team
Политика на форуме запрещена

Аватара пользователя
adarash
Сообщения: 333
Зарегистрирован: 17 июл 2013, 09:59

Re: шрифты

Сообщение adarash » 13 дек 2013, 10:00

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

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

парень
Сообщения: 223
Зарегистрирован: 30 мар 2013, 22:52

Re: шрифты

Сообщение парень » 13 дек 2013, 10:28

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

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

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

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

Бьем рекорды русских топов :)

Могу ответить на любые вопросы по маркетингу и развитию.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: шрифты

Сообщение rezak90 » 13 дек 2013, 11:08

парень писал(а):а я спрашиваю есть ли способы чтобы в xml у эллемента я пишу например: font-famili:Roboto-italic и тогда это будет такой то шрифт???
есть, но опять таки ты не понял статью, если сделать как ты то будет утечка памяти
R.id.team
Политика на форуме запрещена

Аватара пользователя
adarash
Сообщения: 333
Зарегистрирован: 17 июл 2013, 09:59

Re: шрифты

Сообщение adarash » 13 дек 2013, 11:20

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

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

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

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

парень
Сообщения: 223
Зарегистрирован: 30 мар 2013, 22:52

Re: шрифты

Сообщение парень » 13 дек 2013, 15:38

так. ребят. что за комментарии? обьясните мне тогда.

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

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

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

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

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

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

Надеюсь что-то из мною написанного понятно :) (2 сутки как не спал еще...)
Мой первенец: MyMoney. Менеджер расходов

Бьем рекорды русских топов :)

Могу ответить на любые вопросы по маркетингу и развитию.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: шрифты

Сообщение rezak90 » 13 дек 2013, 15:43

лучше проспись и потом задавай вопросы
R.id.team
Политика на форуме запрещена

парень
Сообщения: 223
Зарегистрирован: 30 мар 2013, 22:52

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 разметки, просто задаем стиль вьюшке.

Это так?
Мой первенец: MyMoney. Менеджер расходов

Бьем рекорды русских топов :)

Могу ответить на любые вопросы по маркетингу и развитию.

парень
Сообщения: 223
Зарегистрирован: 30 мар 2013, 22:52

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>
Мой первенец: MyMoney. Менеджер расходов

Бьем рекорды русских топов :)

Могу ответить на любые вопросы по маркетингу и развитию.

Аватара пользователя
adarash
Сообщения: 333
Зарегистрирован: 17 июл 2013, 09:59

Re: шрифты

Сообщение adarash » 13 дек 2013, 23:57

Молодец. Одно забыл - иди проспись))))

парень
Сообщения: 223
Зарегистрирован: 30 мар 2013, 22:52

Re: шрифты

Сообщение парень » 14 дек 2013, 00:31

что-то не так сделал? Или это юмор - который я уже не понимаю? :)
Мой первенец: MyMoney. Менеджер расходов

Бьем рекорды русских топов :)

Могу ответить на любые вопросы по маркетингу и развитию.

Ответить