Посоветуйте, пожалуйста, утилиты (доступные для скачивания) для преобразования шрифта
в заголовочный файл *.h с массивом, содержащим растр для всех нужных символов для использования
во встраиваемых системах.
Типа такого: Freescale Embedded GUI Converter Utility 2.0 (судя по всему, его так
просто не скачать).
Ответы
Ответ 1
Нашел ответ на stackoverflow. Предлагается использовать утилиту convert из imagemagick.
Например команда:
convert -resize 7x13\! -font /Library/Fonts/Arial.ttf -pointsize 10 label:A A.xbm
генерирует побитовое представление буквы A:
#define A_width 7
#define A_height 13
static char A_bits[] = {
0x00, 0x00, 0x04, 0x0C, 0x0A, 0x0A, 0x1E, 0x1F, 0x11, 0x11, 0x00, 0x00,
0x00, };
Допустим, я указываю все размеры шрифтов в rem единицах, далее я при определенном
размере экрана задаю уменьшение шрифта, но выходит так, что шрифты, которые до этого
уже были маленькими, стали еще меньше, до такой степени, что они более нечитабельны.
Вот пример:
html {
font-size: 10px;
}
h1 {
font-size: 4rem;
}
h2 {
font-size: 3rem;
}
h3 {
font-size: 2.5rem;
}
h4 {
font-size: 2rem;
}
p {
font-size: 1.4rem;
}
@media screen and (max-width: 600px) {
html {
font-size: 6px;
}
}
Simple text
Simple text
Simple text
Simple text
Simple text
Вопрос в том, что делать в таких случаях? Как правильно поступать? Для маленьких
шрифтов задавать значения размера в абсолютных величинах?
Ответы
Ответ 1
Подходов для динамической типографики может быть много, я бы на вашем месте обратил
внимание на возможности функции calc() и, может быть, на зависимость размера шрифта
от ширины экрана — простейшая формула font-size: calc(1rem + 1vw), с деталями коэффициентов
надо уже экспериментировать. Также можете поинтересоваться темой CSS-шлюзов.
В вашем конкретном случае получается так, что вы задаете базовый размер шрифта 6
пикселей — потому естественно, что текст будет очень мелким. Вот пример, как этого
частично можно избежать с применением функции calc() и цсс-переменных. Надо добавить
увеличивающий коэффициент к тем значениям, которые становятся слишком мелкими на маленьких
экранах, в то время как на больших оставить его равным единице.
html {
font-size: 10px;
--font-ratio: 1;
}
h1 {
font-size: 4rem;
}
h2 {
font-size: 3rem;
}
h3 {
font-size: 2.5rem;
}
h4 {
color: red;
font-size: calc(2rem * var(--font-ratio));
}
p {
color: red;
font-size: calc(1.4rem * var(--font-ratio));
}
@media screen and (max-width: 600px) {
html {
font-size: 6px;
--font-ratio: 1.25;
}
}
Есть строка
string text = "𝚊𝚗𝚊 𝚝𝚎𝚝𝚢𝚊𝚗𝚊 𝚊𝚗𝚊 𝚝𝚎𝚝𝚢𝚊𝚗𝚊 𝚊𝚗𝚊 𝚝𝚎𝚝𝚢𝚊𝚗𝚊";
как из нее получить оригинальний текст без шрифтов ?
вместо
𝚊𝚗𝚊 𝚝𝚎𝚝𝚢𝚊𝚗𝚊 𝚊𝚗𝚊 𝚝𝚎𝚝𝚢𝚊𝚗𝚊 𝚊𝚗𝚊 𝚝𝚎𝚝𝚢𝚊𝚗𝚊
будет
ana tetyana ana tetyana ana tetyana
Ответы
Ответ 1
Вероятно, вам подойдёт одна из форм нормализации:
var text = "𝚊𝚗𝚊 𝚝𝚎𝚝𝚢𝚊𝚗𝚊 𝚊𝚗𝚊 𝚝𝚎𝚝𝚢𝚊𝚗𝚊 𝚊𝚗𝚊 𝚝𝚎𝚝𝚢𝚊𝚗𝚊";
// text.Length = 65
text = text.Normalize(NormalizationForm.FormKD);
// text.Length = 35
FormKC тоже даёт длину 35.
Ссылки на то, что такое нормализация: подробно на английском, чуть-чуть на русском.
Создаю динамически элемент TextView. Нужно установить шрифт, который использует остальная
часть программы. При вызове этого кода приложение падает.
TextView textDis = new TextView(this.getContext());
textDis.setPadding(16, 16, 16, 16);
textDis.setTextColor(getResources().getColor(R.color.colorBlack));
textDis.setTextSize(18);
//Ошибочный код ниже:
textDis.setTypeface(getResources().getFont(R.font.fira_sans), Typeface.BOLD);
Спасибо за помощь!
Ответы
Ответ 1
Для шрифтов рекомендую использовать папку assets и устанавливать вот так:
textDis.setTypeface(Typeface.createFromAsset(getAssets(), "my_font_bold.ttf");
Кроме того, чтобы избежать лагов (а если у вас много текстов со своим шрифтом они
будут), рекомендую шрифт кэшировать, например так:
public class TypeFaces {
//---Кэширование шрифта---
private static final Hashtable cache = new Hashtable();
public static Typeface get(Context c, int type) {
String name;
if (type == 1)
name = "my_font.ttf";
else
name = "my_font_bold.ttf";
synchronized (cache) {
if (!cache.containsKey(name)) {
String path = name;
try {
Typeface t = Typeface.createFromAsset(c.getAssets(), path);
cache.put(name, t);
} catch (Exception e) {
e.printStackTrace();
}
}
return cache.get(name);
}
}
}
И использовать так:
textDis.setTypeface(TypeFaces.get(this, 2));
Если у вас много текстов, самым лучшим вариантом будет создать кастомный TextView,
где в init() шрифт будет будет выставляться автоматически.
Либо можно воспользоваться методом из support библиотеки:
textDis.setTypeface(ResourcesCompat.getFont(context, R.font.my_font));
Я нашёл в интернете шрифт, который хочу использовать при написании текста в документе
Word.
Я могу этот шрифт добавить в Windows. Но, если я отправлю этот документ другому человеку,
у которого этот шрифт не установлен, то что будет?
Что надо: чтобы человек, который получил этот документ, видел текст в корректном
виде, без дополнительной установки шрифтов в Windows.
Это возможно? Если да, то как?
Ответы
Ответ 1
Внедрите шрифт, если вы хотите поделиться документом.
Установив новый шрифт, вы сможете использовать его только на своем компьютере и принтере.
Если вам нужно поделиться документом, содержащим новый шрифт, с каким-либо человеком,
такой шрифт на другом компьютере отображаться не будет (только если этот шрифт не установлен
на другом компьютере). Чтобы решить эту проблему, внедрите шрифт в документ; в этом
случае шрифт будет отображаться на любом компьютере. Имейте в виду, что внедрение шрифта
в документ приведет к увеличению размера файла документа (так как он будет включать
файлы шрифтов).
В Word нажмите «Файл» – «Параметры».
Нажмите «Сохранение».
Поставьте флажок у «Внедрить шрифты в файл».
В выпадающем меню выберите открытый документ.
Подумайте, хотите ли вы внедрить только те знаки, которые используются в текущем
документе. Это позволит вам уменьшить размер файла документа, особенно если вы используете
только несколько знаков нового шрифта.
Сохраните и поделитесь документом с другими пользователями. Шрифты будут автоматически
внедрены в документ при его сохранении.
Источник: https://ru.wikihow.com/добавить-шрифт-в-Microsoft-Word
Долго искал код для того чтобы сделать кастомный шрифт на все приложение
и наконец то нашел его! Огромное спасибо Глебу Кравченко!
Ссылка на источник: http://dajver.blogspot.com/2014/10/blog-post.html
Ответы
Ответ 1
Суть в том, что нам необходимо создать класс-утилиту которая будет создавать TypeFace
и конвертировать все вьюхи в нужный нам шрифт, вот как он будет выглядеть:
import android.content.Context;
import android.graphics.Typeface;
import java.lang.reflect.Field;
public class TypefaceUtil {
public static void overrideFont(Context context, String defaultFontNameToOverride,
String customFontFileNameInAssets) {
try {
final Typeface customFontTypeface = Typeface.createFromAsset(context.getAssets(),
customFontFileNameInAssets);
final Field defaultFontTypefaceField = Typeface.class.getDeclaredField(defaultFontNameToOverride);
defaultFontTypefaceField.setAccessible(true);
defaultFontTypefaceField.set(null, customFontTypeface);
} catch (Exception e) {}
}
}
Затем необходимо создать папку assets и в ней создать папку fonts для наших шрифтов.
Далее нужно добавить эту строку в главное активити, в метод onCreate:
TypefaceUtil.overrideFont(getApplicationContext(), "SANS_SERIF", "fonts/Roboto-Regular.ttf");
Вместо "Roboto-Regular.ttf" вы указываете свой шрифт.
Также можно сделать этот код на какую-нибудь кнопку.
И в заключении добавляете в файл styles.xml эти строки:
Все! Запускаете приложение и наслаждаетесь)
В opera 9.64 не подключается шрифт.
@font-face {
font-family: 'PT Sans';
font-style: normal;
font-weight: 400;
src: local('PT Sans'), local('PTSans-Regular'),
url(../fonts/37660512ac27f770b4231a4d31c0ae96.eot),
url(../fonts/37660512ac27f770b4231a4d31c0ae96.eot?#iefix) format('embedded-opentype'),
url(../fonts/37660512ac27f770b4231a4d31c0ae96.woff) format('woff'),
url(../fonts/37660512ac27f770b4231a4d31c0ae96.ttf) format('truetype'),
url(../fonts/37660512ac27f770b4231a4d31c0ae96.svg) format('svg');
}
Скорее всего из-за того, что не поддерживается в ней CSS3 (@font-face).
В консоли никаких ошибок нет. Это как-то исправимо?
Ответы
Ответ 1
Действительно, в Opera 9.64 согласно официальной документации движка Presto еще не
реализована поддержка CSS font-face, она появляется с версии Presto 2.2 а это Opera
10.0/Opera Mobile 9.7 И то, судя по отзывам она ужасно глючит в 10-11 версиях.
Правда если это как-то поможет, частично поддерживается font-face для svg, то есть
Вы можете попробовать загрузить svg-шрифт для текста внутри svg. На этом решения которые
мне удалось найти, заканчиваются.
Если у мсье много свободного времени и любви к искусству, он может детектить версию
браузера и при виде старой оперы показывать версию с контентом засунутым внутрь svg.
Главное детям это не показывайте.
Ответ 2
@font-face доступен в ранних версиях CSS. Попробуйте указать абсолютный путь для
подключаемых шрифтов. Также есть мнение, что Opera отказывается подключать шрифты когда
имя пользователя Windows написано кириллицей.
Дана задача: Запросить у пользователя число от 1 до 10. Вывести его на страницу прописью
10 раз в столбик, увеличивая размер шрифта на 6 пунктов.
Вот pastebin как я пытался её решить. https://pastebin.com/2gZrBLmX.
Помогите пожалуйста!
num = prompt('Enter number from 1 to 10')
if ((num > 10) || (num < 1)) {
alert('Error. Type number from 1 to 10')
} else {
for (var q = 1; q <= 10; q++) {
document.write("" + num)
for (var y = 1; y <= 10; y++) {
document.getElementById('res' + y).style.fontSize = fontSize + "50px";
}
}
}
body {
position: absolute;
width: 100%;
top: 40%;
text-align: center;
}
Ответы
Ответ 1
Вообщем-то у вас хороший код, только в этой строчке вам нужно додумать логику
document.getElementById( 'res' + y).style.fontSize = fontSize + "50px";
Вам нужно завести переменную на размер шрифта, в каждой итерации цикла её увеличивать,
и потом делать fontSize+"px".
Кроме того возможно ваши два цикла объединить в один. Для этого, например можно задавать
стили inline, например .
Ответ 2
Размер шрифта можно получить с помощью getComputedStyle()
Ну а далее я бы сделал так :
var num = prompt('Enter number from 1 to 10');
var size = parseFloat(window.getComputedStyle(document.body, null).getPropertyValue('font-size'));
if (num > 10 || num < 1) {
alert('Error. Type number from 1 to 10');
} else {
for (var i = 1; i <= 10; i++) {
var div = document.createElement('div');
div.innerText = num;
div.style.fontSize = size + 'px';
document.body.append(div);
size += 5;
}
}
Ответ 3
Приветствую. JS для решения данной задачи не нужен. CSS (SCSS) достаточно. Если по
какой-то причине препроцессор не используется (не верю), тогда можно воспользоваться
переменными css или, в крайнем случае, скопировать выход после sass-а:
.preview {
@for $i from 1 through 10 {
> div:nth-child(#{$i}) {
font-size: 1px * $i * 6;
}
}
}
https://codepen.io/rasdaniil/pen/KZNgyP
Ответ 4
К сожалению, у меня не работает с window.getComputedStyle, хоть и на сайте всё показывает...
var num = prompt('Enter number from 1 to 10');
var size = parseFloat(window.getComputedStyle(document.body, null).getPropertyValue('font-size'));
if (num > 10 || num < 1) {
alert('Error. Type number from 1 to 10');
} else {
for (var i = 1; i <= 10; i++) {
var div = document.createElement('div');
div.innerText = num;
div.style.fontSize = size + 'px';
document.body.append(div);
size += 5;
}
}
На англоязычном стаке задавал вопрос о проблемах подключения шрифта через @font-face.
Один из ответов советовал, что нужно подключать гугл-шрифт - это надежный и более
быстрый способ подключения шрифта.
В этом я сомневаюсь, так как мы зависим от стороннего ресурса - расстояния до него,
скорости работы и доступности. Возможно, я чего-то не знаю, подскажите, пожалуйста
Ответы
Ответ 1
Для начала, стандартные плюсы и минусы CDN:
+ Используется многими сайтами, поэтому весьма вероятно, что будет взято из кэша
браузера, что позволит сэкономить на количестве запросов к серверу и объёме загружаемых
данных.
+ Снижает нагрузку на сервер, поскольку ресурс теперь отдаётся не им, а сторонним
(в данном случае гугловским) сервером.
+ Позволяет увеличить число потоков одновременной загрузки. Браузеры используют ограничение
- не более 8 потоков загрузки на один домен. Но CDN принадлежит другому домену, поэтому
получается 8 потоков на твой сайт и ещё по 8 на каждый чужой домен.
Минусы, в основном, сводятся к зависимости от стороннего ресурса:
− Если он по какой-то причине недоступен, то у тебя на сайте шрифта не будет.
Для скриптов часто делается фоллбек.
− Если CDN вдруг начнёт отдавать что-то другое, пользователи увидят результат раньше
тебя. Для собственного сервера ведь ты сначала проверишь, что изменилось и только потом
изменённые файлы окажутся у пользователей.
Пример такой проблемы: Как загрузить шрифт Roboto v15?.
? Теперь есть два сайта, которые можно пытаться взломать. Впрочем, не думаю. что
это актуально для шрифтов, да и у гугловских серверов должна быть надёжная защита.
Но в случае подмены скрипта все сайты, использующие его, окажутся под угрозой.
Хотя, от этого в некоторой мере помогает перманентное кэширование - клиенты, у которых
файл уже есть в кэше, на сервер за ним даже не пойдут.
− Если свой сервер находится в локальной/корпоративной сети, то скорость доступа
к нему выше, чем к CDN. Кроме того, с ним можно работать даже если интернет недоступен.
Теперь что касается именно шрифтов:
? Гуглошрифты позволяют указать набор интересующих тебя символов, что позволит сократить
объём файлов шрифта. С другой стороны, чем более хитрый набор ты укажешь, тем меньше
вероятность, что нужный файл уже будет в кэше браузера.
+ Скорее всего, гуглошрифты уже оптимизированы под использование на веб-сайтах. Не могу
сказать, как именно, но на 90% уверен, что если это возможно, то они об этом позаботились.
Ответ 2
Гугл шрифты используют многие сайты и поэтому есть вероятность того, что у пользователя
в кеше уже хранится шрифт и при заходе на Ваш сайт он будет взят их кеша.
Если сохранять на своём сервере, то это лишний трафик и запросы.
Большинство людей в интернете советуют для этого следующую конструкцию:
SpannableString s = new SpannableString("My Title");
s.setSpan(new TypefaceSpan(this, "My_Font.ttf"), 0, s.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
getSupportActionBar().setTitle(s);
Но у меня горит красным (this, "My_Font.ttf"). Нашёл на англицком StackOverFlow брата
по несчастью, ему посоветовали:
please get the activity/application context and pass it to
constructor rather than this as this will give currently running class
while you need the current context.
Я пытался. Сначала писал MyActivity.getApplicationContext(); вместо this. Он сказал
non static method cannot be referenced from static context.
Потом перед конструкцией писал Context context; context = getApplicationContext();
и в скобках Context context вместо this. В этом случае он подчёркивал уже пробел между
Context и context. Я чувствую, что хожу вокруг да около, но всё никак не попадаю. Что
делать?
UPDATE#1
Нашёл полный код применения конструкции. Красным больше ничто не подчёркивается,
но Activity вылетает.
class TypefaceSpan extends MetricAffectingSpan {
/** An LruCache for previously loaded typefaces. */
private LruCache sTypefaceCache = new LruCache(5);
private Typeface mTypeface;
/**
* Load the {@link Typeface} and apply to a spannable.
*/
public TypefaceSpan(Context context, String typefaceName) {
mTypeface = sTypefaceCache.get(typefaceName);
if (mTypeface == null) {
mTypeface = Typeface.createFromAsset(context.getApplicationContext()
.getAssets(), String.format("fonts/%s", typefaceName));
// Cache the loaded Typeface
sTypefaceCache.put(typefaceName, mTypeface);
}
}
@Override
public void updateMeasureState(TextPaint p) {
p.setTypeface(mTypeface);
}
@Override
public void updateDrawState(TextPaint tp) {
tp.setTypeface(mTypeface);
}}
Context context;
context = getApplicationContext();
SpannableString s = new SpannableString("My Title");
s.setSpan(new TypefaceSpan(context, "FDMedian.ttf"), 0, s.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
getSupportActionBar().setTitle(s);
UPDATE#2
логи с ошибками:
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
FATAL EXCEPTION: main
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.morpheus.sketc_000.morpheuscompanygames/com.morpheus.sketc_000.morpheuscompanygames.Activity2}:
java.lang.RuntimeException: native typeface cannot be made
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
at android.app.ActivityThread.access$600(ActivityThread.java:141)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
at android.os.Handler.dispatchMessage(Handler.java:99)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
at android.os.Looper.loop(Looper.java:137)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
at android.app.ActivityThread.main(ActivityThread.java:5103)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
at java.lang.reflect.Method.invokeNative(Native Method)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
at java.lang.reflect.Method.invoke(Method.java:525)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
at dalvik.system.NativeStart.main(Native Method)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
Caused by: java.lang.RuntimeException: native typeface cannot be made
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
at android.graphics.Typeface.(Typeface.java:175)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
at android.graphics.Typeface.createFromAsset(Typeface.java:149)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
at com.morpheus.sketc_000.morpheuscompanygames.Activity2$1TypefaceSpan.(Activity2.java:35)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
at com.morpheus.sketc_000.morpheuscompanygames.Activity2.onCreate(Activity2.java:54)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
at android.app.Activity.performCreate(Activity.java:5133)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
at android.app.ActivityThread.access$600(ActivityThread.java:141)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
at android.os.Handler.dispatchMessage(Handler.java:99)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
at android.os.Looper.loop(Looper.java:137)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
at android.app.ActivityThread.main(ActivityThread.java:5103)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
at java.lang.reflect.Method.invokeNative(Native Method)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
at java.lang.reflect.Method.invoke(Method.java:525)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
at dalvik.system.NativeStart.main(Native Method)
Ответы
Ответ 1
Есть несколько причин, которые могут вызвать java.lang.RuntimeException: native typeface
cannot be made:
используете неправильное расширение
разместили шрифты в папке с ресурсами (корень assets), а не внутри
assets/fonts/
не добавили файл с шрифтами
имя файла с шрифтом должен быть написан строчными буквами(например, надо
переименовать MyFont.ttf в myfont.ttf)
Как увеличить расстояние между буквами и сделать еще менее жирным текст?
Font font = new Font("Courier New", 10, FontStyle.Regular);
SolidBrush brush = new SolidBrush(Color.Black);
graf.DrawString("Надпись", font, brush, 130, 16);
Ответы
Ответ 1
Скорее всего, объект Graphics был получен из класса изображения. Что-то вроде:
var img = new Bitmap(...);
graf = Graphics.FromImage(img);
При этом у него заданы определённые значения свойств, которые приводят к рендерингу
текста жирным и на вид слипшимся.
Задайте свойство:
graf.TextRenderingHint = TextRenderingHint.AntiAlias;
Попробуйте разные значения.
Ответ 2
Как увеличить расстояние между буквами
Например, используя для рисования текста функции GDI вместо GDI+:
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Runtime.InteropServices;
namespace WindowsFormsTest1
{
public partial class Form1 : Form
{
[DllImport("gdi32.dll")]
public static extern int SetTextCharacterExtra(
IntPtr hdc,
int nCharExtra
);
[DllImport("gdi32.dll")]
static extern bool TextOut(IntPtr hdc, int nXStart, int nYStart,
string lpString, int cbString);
[DllImport("gdi32.dll")]
public static extern IntPtr SelectObject(IntPtr hdc, IntPtr hgdiobj);
IntPtr hfont;
public Form1()
{
InitializeComponent();
Font font = new Font("Courier New", 10, FontStyle.Regular);
hfont = Font.ToHfont();
}
private void panel1_Paint(object sender, PaintEventArgs e)
{
IntPtr hdc = e.Graphics.GetHdc();
try
{
var res = SetTextCharacterExtra(hdc, 10); //расстояние между символами
IntPtr prev_font = SelectObject(hdc, hfont);
string str = "Надпись";
TextOut(hdc, 130, 16, str, str.Length);
SelectObject(hdc, prev_font);
}
finally
{
e.Graphics.ReleaseHdc(hdc);
}
}
}
}
Здесь написано, что чтобы использовать свои шрифты нужно их превращать в картинку
с помощью битмапа и вставлять в виджет эту картинку. Вопрос 5-и летней давности, неужели
эта проблема так и не решена? Английские шрифты в Android Studio приятные, а вот кириллические
шрифты явно не доработаны. Есть ли какой-то способ без костылей свои шрифты внедрить?
Ответы
Ответ 1
Есть способ, выдолжны добавить свои шрифты в папку assets в папке приложения (где
хранится папка java и папка ресурсов), если её нету, то создайте в том месте где описано
выше.
Пример исползования:
textView.setTypeface(Typeface.createFromAsset(getAssets(), "tahoma.ttf"));
Этот вопрос касается Icomoon в целом.
Не могу разобраться почему scss так компилит символы, но они работают, если в пути
к шрифту указан не только шрифт, но и кэш шрифта.
Связанный вопрос: что это за кэш?
$icomoon-font-path: "fonts" !default;
$icon-bell: "\e900";
$icon-like: "\e901";
$icon-paceholder: "\e902";
$icon-search: "\e903";
$icon-star: "\e904";
$icon-vision: "\e905";
$icon-vision-off: "\e906";
$icon-angle-left: "\e907";
$icon-angle-right: "\e908";
$icon-arrow-right: "\e909";
$icon-angle-bottom: "\e90a";
$icon-chat-angle-bottom: "\e90b";
$icon-chat-angle-top: "\e90c";
@import "variables";
@font-face {
font-family: 'Icomoon';
src: url('#{$icomoon-font-path}/Icomoon.eot?r3waic');
src: url('#{$icomoon-font-path}/Icomoon.eot?r3waic#iefix') format('embedded-opentype'),
url('#{$icomoon-font-path}/Icomoon.ttf?r3waic') format('truetype'),
url('#{$icomoon-font-path}/Icomoon.woff?r3waic') format('woff'),
url('#{$icomoon-font-path}/Icomoon.svg?r3waic#Icomoon') format('svg');
font-weight: normal;
font-style: normal;
}
[class^="icon-"], [class*=" icon-"] {
/* use !important to prevent issues with browser extensions that change fonts */
font-family: 'Icomoon' !important;
speak: none;
font-style: normal;
font-weight: normal;
font-variant: normal;
text-transform: none;
line-height: 1;
/* Better Font Rendering =========== */
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-bell {
&:before {
content: $icon-bell;
}
}
.icon-like {
&:before {
content: $icon-like;
}
}
.icon-paceholder {
&:before {
content: $icon-paceholder;
}
}
.icon-search {
&:before {
content: $icon-search;
}
}
.icon-star {
&:before {
content: $icon-star;
}
}
.icon-vision {
&:before {
content: $icon-vision;
}
}
.icon-vision-off {
&:before {
content: $icon-vision-off;
}
}
.icon-angle-left {
&:before {
content: $icon-angle-left;
}
}
.icon-angle-right {
&:before {
content: $icon-angle-right;
}
}
.icon-arrow-right {
&:before {
content: $icon-arrow-right;
}
}
.icon-angle-bottom {
&:before {
content: $icon-angle-bottom;
}
}
.icon-chat-angle-bottom {
&:before {
content: $icon-chat-angle-bottom;
}
}
.icon-chat-angle-top {
&:before {
content: $icon-chat-angle-top;
}
}
Ответы
Ответ 1
Sass при компиляции utf-8 юникод файлов - переводит подобные вашим последовательности
в юникод-символы. Почему вы видите квадраты вместо символов в редакторе? Потому что
в вашем моноширинном шрифте эти символы не отрисованы. Но они отрисованы в шрифте Icomoon,
который подключается на сайте, и там в итоге символы корректно отображаются.
Резюмируя: Это нормальное поведение, и по поводу скомпилированных символов беспокоиться
не стоит.
Однако, если вдруг ваши файлы хранятся в ASCII-кодировке - Sass все равно будет
компилировать символы в них, хотя по логике - не должен. На гитхабе уже 3 года висит
открытый тикет по теме. Можно почитать, но разумный способ решения - перевести свои
стили в utf-8-кодировку.
Ответ 2
Это известная бага, можно экранировать, например так:
$icon-like: "e901";
@function unicode($str) {
@return unquote("\"")+unquote(str-insert($str, "\\", 1))+unquote("\"");
}
.icon-like {
&:before {
content: unicode($icon-like);
}
}
А ещё достаточно компактно и изящно получается, если использовать списки, а не отдельные
переменные:
$icons: (
bell: "e900",
like: "e901",
paceholder: "e902",
search: "e903",
star: "e904",
vision: "e905",
vision-off: "e906",
angle-left: "e907",
angle-right: "e908"
);
@each $name, $str in $icons {
.icon-#{$name}:before {
content: unquote("\"")+unquote(str-insert($str, "\\", 1))+unquote("\"");
}
}
Имеется шрифт с несколькими видами толщины:
Museo Sans Cyrl 100
Museo Sans Cyrl 500
Museo Sans Cyrl 900
Подключаю следующим образом, но не работает:
@font-face {
font-family: "Museo Sans Cyrl";
src: url("../fonts/Museo Sans Cyrl 100.ttf") format(truetype);
font-weight: 100;
}
@font-face {
font-family: "Museo Sans Cyrl";
src: url("../fonts/Museo Sans Cyrl 500.ttf") format(truetype);
font-weight: 500;
}
@font-face {
font-family: "Museo Sans Cyrl";
src: url("../fonts/Museo Sans Cyrl 900.ttf") format(truetype);
font-weight: 900;
}
Работает только тогда, когда каждый отдельно пропишу с указанием толщины:
@font-face {
font-family: "Museo Sans Cyrl 900";
src: url("../fonts/Museo Sans Cyrl 900.ttf") format(truetype);
font-weight: 900;
} ...
Может, я чего-то не знаю о подключении?
Ответы
Ответ 1
Плохая практика плодить разные имена одного того же шрифта, еще и прописывать им
разные жирности. Такой код плохо поддерживается. Новый разработчик должен знать все
ваши "придуманные" названия несуществующих шрифтов, и при добавлении нового начертания,
или изменении шрифта может может появиться много работы. Если шрифт один, он должен
быть один и у него может быть несколько начертаний.
Вообще не прописывать жирность не получится, и совершенно не ясно зачем это делать.
По умолчанию в браузере, в нормализе или в резет жирность всегда будет прописана и
как правило это - 400 т.е. normal. Вы этот шрифт не добавляете, и соответственно по
умолчанию вы обращаетесь к этому шрифту с таким начертанием, а его нет. Либо добавьте
по умолчанию жирность 500, либо добавьте этот шрифт с жирностью 400.
Вот пример подключения в вашем случае.
@font-face {
font-family: 'Museo Sans Cyrl';
src: url('MuseoSansCyrl-100.eot');
src: url('MuseoSansCyrl-100.woff2') format('woff2'), url('MuseoSansCyrl-100.woff')
format('woff'), url('MuseoSansCyrl-100.ttf') format('truetype'), url('MuseoSansCyrl-100.svg#MuseoSansCyrl-100')
format('svg'), url('MuseoSansCyrl-100.eot?#iefix') format('embedded-opentype');
font-weight: 100;
font-style: normal;
}
@font-face {
font-family: 'Museo Sans Cyrl';
src: url('MuseoSansCyrl-500.eot');
src: url('MuseoSansCyrl-500.woff2') format('woff2'), url('MuseoSansCyrl-500.woff')
format('woff'), url('MuseoSansCyrl-500.ttf') format('truetype'), url('MuseoSansCyrl-500.svg#MuseoSansCyrl-100')
format('svg'), url('MuseoSansCyrl-500.eot?#iefix') format('embedded-opentype');
font-weight: 500;
font-style: normal;
}
@font-face {
font-family: 'Museo Sans Cyrl';
src: url('MuseoSansCyrl-900.eot');
src: url('MuseoSansCyrl-900.woff2') format('woff2'), url('MuseoSansCyrl-900.woff')
format('woff'), url('MuseoSansCyrl-900.ttf') format('truetype'), url('MuseoSansCyrl-900.svg#MuseoSansCyrl-100')
format('svg'), url('MuseoSansCyrl-900.eot?#iefix') format('embedded-opentype');
font-weight: 900;
font-style: normal;
}
body {
position: relative;
font-family: 'Museo Sans Cyrl', sans-serif;
font-weight: 500;
}
h1 {
font-weight: 900;
}
i {
font-weight: 100;
}
И уберите пробелы в именах файлов.
Ответ 2
Абсолютно такая же проблема с этим же шрифтом. Все испробовал, попробовал для интереса
твой способ с указанием толщины шрифта в названии, и заработало.
@font-face {
font-family: 'Museo Sans Cyrl 500';
src: url('Museo_Sans_Cyrillic/MuseoSansCyrl_500.otf') format('otf');
font-weight: 500;
.nav {
font-family: 'Museo Sans Cyrl 500';
Ответ 3
У вас же разные файлы с шрифтами а пробуете прописать всех под одно имя
для каждого Font-Family дайте отдельное имя.
Например:
@font-face {
font-family: "Museo Sans Cyrl twing";
src: url("../fonts/Museo Sans Cyrl 100.ttf") format(truetype);
font-weight: 100;
}
@font-face {
font-family: "Museo Sans Cyrl Regular";
src: url("../fonts/Museo Sans Cyrl 500.ttf") format(truetype);
font-weight: 500;
}
@font-face {
font-family: "Museo Sans Cyrl Bold";
src: url("../fonts/Museo Sans Cyrl 900.ttf") format(truetype);
font-weight: 900;
}
Ответ 4
В общем, товарищи, такая дичь. Не знаю, чем это объяснимо, надеюсь, кто-нибудь объяснит,
но работает у меня только следующим образом:
@font-face {
font-family: "Museo Sans Cyrl";
src: url("../fonts/MuseoSansCyrl100.ttf") format(truetype),
url("../fonts/MuseoSansCyrl100.woff") format(woff),
url("../fonts/MuseoSansCyrl100.woff2") format(woff2);
font-weight: 300;
font-style: normal;
}
@font-face {
font-family: "Museo Sans Cyrl";
src: url("../fonts/MuseoSansCyrl500.ttf") format(truetype),
url("../fonts/MuseoSansCyrl500.woff") format(woff),
url("../fonts/MuseoSansCyrl500.woff2") format(woff2);
font-weight: 500;
font-style: normal;
}
@font-face {
font-family: "Museo Sans Cyrl";
src: url("../fonts/MuseoSansCyrl900.ttf") format(truetype),
url("../fonts/MuseoSansCyrl900.woff") format(woff),
url("../fonts/MuseoSansCyrl900.woff2") format(woff2);
font-weight: 700;
font-style: normal;
}
h1 {
font-family: "Museo Sans Cyrl 700";
}
h2 {
font-family: "Museo Sans Cyrl 500";
}
Только когда толщина подписывается в конце названия.
Пользуясь гайдами, пытаюсь собрать все свои стили в одну сборку на Webpack.
Имеется главный файл, в него импортируется другой, в котором несколько правил @font-face
с путями к файлам шрифтов. При сборке Webpack выдаёт ошибку по этим путям, говорит:
нужен специальный загрузчик:
ERROR in ./fonts/a_coppergothcaps-bold.ttf Module parse failed:
Unexpected character ' ' (1:0) You may need an appropriate loader to
handle this file type. (Source code omitted for this binary file)
Но мне не то чтобы нужно (или нужно?) добавлять эти файлы в сборку. Мне достаточно,
если в сборке останутся эти правила, и браузер сам подключит шрифты по ссылкам в них.
Как сказать Webpack, чтобы не пытался обрабатывать эти пути, но просто вставлял их,
как есть?
Или я неправильно вижу решение проблемы? Может, я шрифтами неправильно распоряжаюсь?
Вот такие правила в конфиге:
module: {
rules: [
{
test: /\.scss$/,
use: ExtractTextPlugin.extract({
fallback: 'style-loader',
use: ['css-loader', 'sass-loader']
})
}
]
},
Ответы
Ответ 1
Ссылка на полный конфиг
Вот мой способ подключения шрифтов для SCSS:
{
test: /\.(eot|svg|ttf|woff|woff2)$/,
use: [
{
loader: 'file-loader?name=./assets/fonts/webfonts/[name].[ext]'
},
{
loader: 'file-loader?name=./assets/fonts/Roboto/[name].[ext]'
}
]
}
Что бы это заработало нужно установить file-loader
После этого нужно загрузить шрифты в SCSS:
@font-face {
font-family: 'Roboto Black';
src: url("/fonts/Roboto/Roboto-Black.ttf");
}
Настройки webpack-dev-server:
devServer: {
contentBase: [path.resolve(__dirname, "build"), path.resolve(__dirname, "assets")],
compress: true,
port: 4200,
historyApiFallback: true,
noInfo:true
}
UPDATE 1
У меня описания шрифтов находятся в файле src/fonts.scss и файл src/variable.scss
для хранения переменных размеров, цветов и т.п.
В variable.scss импортируется fonts.scss -> @import "/fonts.scss"; и после этого
в любом другом файле стилей можно импортировать variable.scss.
В определении шрифтор должен указываться не относительный путь до файла, а url.
Можно протестировать корректность вводимого адреса в браузере, например http://localhost:4200/fonts/Roboto/Roboto-Black.ttf,
если было предложено сохранить файл значит все правильно.
Ответ 2
module: {
rules: [
{
test: /\.(svg|png|gif|jpg)$/,
exclude: /fonts/,
loader: 'file-loader',
options: {
name: '[name].[ext]'
}
}, {
test: /\.(ttf|eot|woff|svg|woff2)$/,
use: {
loader: "file-loader",
options: {
name: `${PATHS.assets}css/fonts/[name].[ext]`,
}
}
},plugins: [
new CopyWebpackPlugin([{
from: `${PATHS.source}/img`,
to: `${PATHS.assets}img`
}, {
from: `${PATHS.source}/static`,
to: ''
}])
]}
Дабы избежать конфликта, я сделал так, благодарю что подняли этот вопрос, а также
за данные на него ответы.
Как получить список доступных в системе шрифтов и, например, закинуть его в ComboBox
на форме?
Ответы
Ответ 1
Свойство Fonts типа TStrings содержит список шрифтов, доступных на данном компьютере.
Его можно использовать в приложении, чтобы проверять, имеется ли на компьютере тот
или иной шрифт.
Например, можно поместить в приложении компонент TComboBox (поле со списком) и в
обработчике события OnCreate формы поместить туда перечень всех доступных шрифтов:
ComboBox1.Items := Screen.Fonts;
ComboBox1.ItemIndex := 0;
Тогда в нужный момент можно выбрать подходящий шрифт из списка. Для этого в обработчик
события OnClick или OnChange списка можно вставить следующий оператор:
Memo1.Font.Name := ComboBox1.Items[ComboBox1.ItemIndex];
Я занимаюсь разработкой сайтов, дизайнов для них и скриптов довольно долго. И конечно
же, непосредственно, создание дизайна почти не обходится без добавление разнообразных
иконок, будь то иконка play или menu.
В 2012 году для таких целей использовали, почти везде и у меня в том числе, иконки
картинками png, gif. Но, с нашими инновациями и усовершенствованием старых функций,
теперь большинство сайтов перешли на рисование иконок шрифтом (font) или же на svg.
Это позволяет сократить вес всех изображений и сделать их гибкими под разные размеры.
Но всё же, какие иконки лучше: svg или font? По моему мнению, лучше SVG, так как
легче в использовании и имеет собственные плюшки.
Какие иконки использовать: svg или font?
Ответы
Ответ 1
Svg потому что:
Это векторный формат.
Иконка может быть многоцветной.
Svg можно инлайнить в html и стилизовать при помощи css.
Css позволяет добавить некую интерактивность в иконку.
Svg можно анимировать.
Нет проблем со скринридерами.
Не возникает проблем, если по какой-то причине браузер использует дефаултный шрифт.
Ответ 2
После долгого использования шрифтов-иконок, перешел на SVG и понял, что конкретно
их различает по моему мнению:
Легкость в освоении и использовании - тут лучше шрифты с иконками, так как нет ничего
проще, вставить готовые конкретные названия иконок в CSS элемента, либо ещё проще,
установить библиотеку шрифтов и просто менять класс элемента.
Но теперь про функциональность и возможности - тут несомненно, как мне кажется, побеждает
именно SVG, потому что с ним можно делать множество трансформаций и анимаций.
Размер - собственно эти 2 технологии популярны тем, что занимают очень маленький
размер памяти, и оба хорошо справляются со своей задачей.
Что в итоге, мне кажется, что лучше все же SVG, так как он имеет больше возможностей
для дальнейшего его изменения, а потребляет примерно столько же ресурсов.
Ответ 3
Шрифт на то и сделан, чтобы хорошо отображать мелкие символы и значки. Браузер будет
гораздо лучше отображать значки в формате шрифта, чем в SVG. Он подстроится под тип
экрана, настройки сглаживания шрифтов.
Посмотрите мой пример. Я взял иконку из Font Awesome, выдернул ее из svg шрифта и
вставил в inline svg. Специально для минусующих я сделал ее Pixel-Perfect
Покрутите размер шрифта, чтобы убедиться, что шрифт сохраняет четкость при масштабировании
(что и не удивительно), a SVG хорош только на 14px и на достаточно больших размерах:
$('input').on("change click",function(){
$('p').css('font-size',$('input').val()+'px')
})
p {
font-size: 16px;
}
svg {
width: 1em;
height: 1em;
}
.fa {
font-size: 1em;
}
- Это шрифт
- Это SVG
Поскольку иконка сделана 14 на 14px а мне нужно 16px, я увеличиваю SVG и тут получается
размытая лажа. (Естественно, 14px выглядят одинаково хорошо, но в этом и дело, получается,
я не могу масштабировать SVG!) Никто не говорит, что SVG это плохо, SVG - это картинка
и ведет себя так, как вела бы себя картинка.
А шрифт на мелких размерах, сохраняет читаемость благодаря хинтингу.
В SVG теряются детали, смазываются края, в общем, выглядит коряво. Конечно, всегда
есть возможность сделать "Pixel-perfect" SVG (располагать вектор ровно по пикселям),
чтобы картинка была четкой на нужном размере. Но тогда куда денется хваленая гибкость
вектора? Что если потребуется немного увеличить иконку? А что если дизайнер нарисует
вам кривой вектор?
Выходит SVG - это хорошее решение только для программиста. Для программиста, которому
плевать как выглядит конечный продукт. С другой стороны, если вы будете делать идеальные
"Pixel-perfect" иконки и не будете изменять их размер, SVG не будет хуже (но практика
показывает обратное)
И, кстати, SVG еще и медленнее отрисовывается.
В консоли линукса (elementary) полетели шрифты, во всех остальных приложениях шрифты
нормальные, устанавливал всё для msf и VirualBox, вот скрин:
Ответы
Ответ 1
Так как по Elementary OS пока не так много ответов в русскоязычном StackOverflow,
переведу ответ с англоязычного ресурса, ссылку в комментариях на который предоставил
KoVadim.
Чтобы изменить шрифт в терминале, вам нужен dconf-editor.
Установите его, если вы еще этого не сделали:
sudo apt install dconf-tools
Запустите его и следуйте по пути:
org > gnome > desktop > interface > monospace-font-name
Введите название нужного шрифта и размер шрифта. Например: Anonymous Pro 11.
Вы также можете использовать команду:
gsettings set org.pantheon.terminal.settings font 'Anonymous Pro 11'
в терминале, вместо dconf-editor.
Как удалить ненужные символы в шрифте формата TTF?
У меня есть шрифт, там много ненужных для меня символов. Могу ли я как-то удалить
их отуда?
Ответы
Ответ 1
Скачиваем бесплатную программу FontForge.
Запускаем ее и выбираем нужный шрифт.
С зажатым Shift мышью выбираем нужные символы.
Инвертируем выделение: Правка→Выделить→Инвертировать выделение
Удаляем ненужные символы: Кодировка→Отцепить и удалить символы...
Вместо символов должны появиться зачеркнутые квадраты:
Сохраняем шрифт.
Основано на ответе к вопросу: "how to remove characters from a font file?"