Форум программистов, компьютерный форум CyberForum.ru

Вписать текст в одну строку - Android

Восстановить пароль Регистрация
 
Antohsa
8 / 12 / 0
Регистрация: 18.10.2016
Сообщений: 112
24.11.2016, 00:04     Вписать текст в одну строку #1
Здравствуйте, всем.

Вывожу большие числа. Как бы сделать так, чтобы они всегда выводились в одну строку... то есть чем больше число, тем меньше шрифт? Числа от 2 до 30 знаков... Можно ли без перебора это как-то вычитать? Ширину поля в пикселях могу получить, длину выводимой строки тоже знаю, как бы теперь эти параметры связать? Видимо связать надо с setTextSize?]

Заранее, спасибо.

Добавлено через 5 минут
Соответственно, если меняется ориентации экрана - поле для вывода становится в два раза длиннее и хотелось бы шрифт тоже сделать побольше...

Добавлено через 5 часов 11 минут
Почти решил задачу... Выяснил сколько пикселей занимает один символ в зависимости от sp

Сделал такой тест:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
 
        main =  (LinearLayout) findViewById(R.id.main);
        lparams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        for (int i=0; i<100; i++) {
            t = new TextView(this);
            t.setTextSize(i);
            t.setText("9");
            t.setLayoutParams(lparams);
            main.addView(t);
        }
    }
 
    public void showWidth(View view) {
        int w;
        for (int i=0; i<main.getChildCount()-1; i++) {
            w = main.getChildAt(i).getWidth();
            ((TextView) main.getChildAt(i)).append(" - "+Integer.toString(w)+" - "+Integer.toString(i));
            Log.d(TAG, Integer.toString(w)+" - "+Integer.toString(i));
        }
    }
В компоновке есть кнопка. По нажатии срабатывает showWidth();
В логе:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
11-23 23:56:43.020 17953-17953/ru.ant.spsize D/OUT: 1 - 0
11-23 23:56:43.020 17953-17953/ru.ant.spsize D/OUT: 2 - 1
11-23 23:56:43.020 17953-17953/ru.ant.spsize D/OUT: 3 - 2
11-23 23:56:43.020 17953-17953/ru.ant.spsize D/OUT: 5 - 3
11-23 23:56:43.021 17953-17953/ru.ant.spsize D/OUT: 7 - 4
11-23 23:56:43.021 17953-17953/ru.ant.spsize D/OUT: 8 - 5
11-23 23:56:43.021 17953-17953/ru.ant.spsize D/OUT: 10 - 6
11-23 23:56:43.021 17953-17953/ru.ant.spsize D/OUT: 12 - 7
11-23 23:56:43.021 17953-17953/ru.ant.spsize D/OUT: 13 - 8
11-23 23:56:43.021 17953-17953/ru.ant.spsize D/OUT: 15 - 9
11-23 23:56:43.021 17953-17953/ru.ant.spsize D/OUT: 17 - 10
11-23 23:56:43.022 17953-17953/ru.ant.spsize D/OUT: 19 - 11
11-23 23:56:43.022 17953-17953/ru.ant.spsize D/OUT: 20 - 12
11-23 23:56:43.022 17953-17953/ru.ant.spsize D/OUT: 22 - 13
11-23 23:56:43.022 17953-17953/ru.ant.spsize D/OUT: 24 - 14
11-23 23:56:43.022 17953-17953/ru.ant.spsize D/OUT: 25 - 15
11-23 23:56:43.022 17953-17953/ru.ant.spsize D/OUT: 27 - 16
11-23 23:56:43.022 17953-17953/ru.ant.spsize D/OUT: 29 - 17
11-23 23:56:43.022 17953-17953/ru.ant.spsize D/OUT: 30 - 18
В итоге вычислил, что ширина одного символа достаточно точно равна w = 1,675*sp;
TextView.setTextSize() - задает размер текста именно в sp.
Теперь зная сколько символов в строке я могу рассчитать нужную ширину поля, а следовательно и нужный sp.

Но это для моего экрана.... Как sp зависит от плотности экрана? Или от разрешения?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
 Аватар для vxg
2667 / 1678 / 158
Регистрация: 13.01.2012
Сообщений: 6,271
24.11.2016, 10:31     Вписать текст в одну строку #2
Цитата Сообщение от Antohsa Посмотреть сообщение
Как sp зависит от плотности экрана?
Java
1
2
3
4
5
6
7
        DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);
        
        float w = metrics.widthPixels;
        float h = metrics.heightPixels;
        float pxPerDp = metrics.density;
        float pxPerSp = metrics.scaledDensity;
Antohsa
8 / 12 / 0
Регистрация: 18.10.2016
Сообщений: 112
24.11.2016, 16:44  [ТС]     Вписать текст в одну строку #3
vxg, спасибо.... у меня (1080х1920) получилось pxPerDp = pxPerSp = 3.0

Но значение sp не совсем корректно себя ведет...

Указываю размер 10sp, но ширина одного символа получатся 17, высота 41. Причем высота почти всегда равна 4*sp, но почему то не 3*sp.

У меня не запускается эмулятор и нет другого Android устройства для теста.

Дорогие форумчане, кто может запустить данную программу и посмотреть, сколько у него получается sp в пикселях, а также ширину и высоту одного символа ("9"). Надо смотреть логи по тегу "OUT".

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_activity"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="ru.ant.spsize.MainActivity"
    android:orientation="vertical"
    >
    <Button
        android:text="Button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/button"
        android:onClick="showWidth"/>
 
    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">
 
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:id="@+id/main"
            />
 
    </ScrollView>
 
 
</LinearLayout>
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package ru.ant.spsize;
 
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
 
public class MainActivity extends AppCompatActivity {
    LinearLayout main;
    TextView t;
    LinearLayout.LayoutParams lparams;
    final String TAG="OUT";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        main =  (LinearLayout) findViewById(R.id.main);
        lparams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        for (int i=0; i<=100; i++) {
            t = new TextView(this);
            t.setTextSize(i);
            t.setText("0");
            t.setPadding(0,0,0,0);
            t.setLayoutParams(lparams);
            main.addView(t);
        }
    }
    public void showWidth(View view) {
        int w,h;
        for (int i=0; i<main.getChildCount(); i++) {
            w = main.getChildAt(i).getWidth();
            h = main.getChildAt(i).getHeight();
            ((TextView) main.getChildAt(i)).append(" w = "+Integer.toString(w)+" h = "+ Integer.toString(h) + " sp= " + Integer.toString(i));
            Log.d(TAG, "w="+Integer.toString(w)+" h="+ Integer.toString(h) + " sp=" + Integer.toString(i));
        }
        DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);
        float ws = metrics.widthPixels;
        float hs = metrics.heightPixels;
        float pxPerDp = metrics.density;
        float pxPerSp = metrics.scaledDensity;
        Log.d(TAG, Float.toString(pxPerSp)+" = " + Float.toString(pxPerDp));
    }
}
Заранее, большое спасибо...
vxg
Модератор
 Аватар для vxg
2667 / 1678 / 158
Регистрация: 13.01.2012
Сообщений: 6,271
24.11.2016, 17:03     Вписать текст в одну строку #4
Antohsa, символы бывают разные - большие и малые, с отростками вверх и / или вниз или без них. может поэтому вы не получаете точной цифры. Указываемый размер это скорее всего размер знакоместа, может даже с учётом отступа. Кроме того некоторые шрифты не моноширинные то есть разные символы в них имеют разную ширину
Паблито
не спать!
1798 / 1532 / 477
Регистрация: 12.05.2014
Сообщений: 5,580
Завершенные тесты: 1
24.11.2016, 17:19     Вписать текст в одну строку #5
Цитата Сообщение от Antohsa Посмотреть сообщение
спасибо.... у меня (1080х1920) получилось pxPerDp = pxPerSp = 3.0
высчитать dp/sp можно только зная разрешение крана в пикселях и его диагональ, иначе никак

экран 5" с 1920*1080 и экран 10" с таким же разрешением будут иметь совершенно разные показатели плотности точек

читать тут https://developer.android.com/traini...densities.html
пока не наступит прояснение

Добавлено через 1 минуту
за все время пока висит тема, можно было 100500 раз нагуглить в инете или тут на форуме код класса, который сам ресайзит текст от размера контейнера
Antohsa
8 / 12 / 0
Регистрация: 18.10.2016
Сообщений: 112
24.11.2016, 17:54  [ТС]     Вписать текст в одну строку #6
Паблито, я далеко не сразу пишу на форум, я пытаюсь сначала найти ответ "общедоступными" методами... если знаете решение - не томите, ткните носом, пожалуйста...

Добавлено через 1 минуту
Цитата Сообщение от Паблито Посмотреть сообщение
Я читал... и не раз...
Паблито
не спать!
1798 / 1532 / 477
Регистрация: 12.05.2014
Сообщений: 5,580
Завершенные тесты: 1
24.11.2016, 17:59     Вписать текст в одну строку #7
да вот хотя бы, оттуда можно просто выдрать класс https://github.com/grantland/android...tTextView.java и подправить под свои нужды
https://github.com/grantland/android-autofittextview
Antohsa
8 / 12 / 0
Регистрация: 18.10.2016
Сообщений: 112
24.11.2016, 18:46  [ТС]     Вписать текст в одну строку #8
Закипел... вынуть, то что надо не представляется мною возможным... сам процесс ресайзинга сложен... там класс и хелпер под 1000 строк... у меня само приложение столько не наберет, наверное... =)))

Подскажите, как мне полностью вынуть с ГитХаба этот виджет и подключить к студио? Буду использовать в готовом виде.....
Паблито
не спать!
1798 / 1532 / 477
Регистрация: 12.05.2014
Сообщений: 5,580
Завершенные тесты: 1
24.11.2016, 18:55     Вписать текст в одну строку #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
ну тогда у них на заглавной странице написано как подключить
https://github.com/grantland/android-autofittextview

там же и пример использования есть

Добавлено через 2 минуты
http://stackoverflow.com/questions/5...-within-bounds
рейтинг ответа выше крыши

я обычно не ищу на SO, но писать такой виджет с нуля точно не стал бы
Antohsa
8 / 12 / 0
Регистрация: 18.10.2016
Сообщений: 112
24.11.2016, 18:59  [ТС]     Вписать текст в одну строку #10
Паблито, все что на главной написано, я понял... и как работать понял... я просто с ГитХабом никогда не работал... архив я скачал, дальше то что? =))))) сорри, за тупость...
Паблито
не спать!
1798 / 1532 / 477
Регистрация: 12.05.2014
Сообщений: 5,580
Завершенные тесты: 1
24.11.2016, 19:15     Вписать текст в одну строку #11
ничего там не нужно качать
1. прописать в build.gradle
XML
1
compile 'me.grantland:autofittextview:0.2.+'
Вписать текст в одну строку
2. используем в разметке
XML
1
2
3
4
5
6
    <me.grantland.widget.AutofitTextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:lines="1"
        android:text="Длинный большой текст, надо уместить в строку."
        android:textSize="40sp" />
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.11.2016, 20:45     Вписать текст в одну строку
Еще ссылки по теме:

Android Текст в виджете
Текст в одну строку Android
Могу ли я поделить одну активность на две независимых части? Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Antohsa
8 / 12 / 0
Регистрация: 18.10.2016
Сообщений: 112
24.11.2016, 20:45  [ТС]     Вписать текст в одну строку #12
Спасибо... Не знал, что все так просто.... буду пробовать...

Добавлено через 1 час 29 минут
Все получилось!! СПАСИБО!
Yandex
Объявления
24.11.2016, 20:45     Вписать текст в одну строку
Ответ Создать тему
Опции темы

Текущее время: 03:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru