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

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
phpk
25 / 25 / 6
Регистрация: 15.05.2013
Сообщений: 1,046
#1

Самодельный Scroll - Android

11.04.2014, 23:41. Просмотров 1217. Ответов 11
Метки нет (Все метки)

Пытаюсь сделать скролл без использования ScrollView, программно.
Это чисто для тренировки сделал себе задачу:
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
49
public class MainActivity extends Activity 
              implements OnTouchListener
{
    LinearLayout ly;
    int flag = 0;
    TextView txt1, txt2;
    float yyy = 0, y = 0, tmpy1, tmpy2;
    StringBuilder str = new StringBuilder();
 
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        ly = new LinearLayout(this);
        ly.setOrientation(1);
        txt1 = new TextView(this);
        txt2 = new TextView(this);
 
        txt1.setText("hello");            // обычный текст
        txt2.setText("world");           // который надо передвигать скролом
        ly.setOnTouchListener(this);
 
        ly.addView(txt1);
        ly.addView(txt2);
        setContentView(ly);
    }
 
 
    @Override
    public boolean onTouch(View v, MotionEvent event)
    {
        float mov;
        flag++;
        if (event.getAction() == MotionEvent.ACTION_MOVE)          // событие прокрутки
        {
            y = event.getY();             // координата касания
            tmpy1 = txt1.getY();        //  координаты
            tmpy2 = txt2.getY();        //                текста
            mov = y - yyy;                // mov - значение смещения текста
            //if(flag == 1) mov = 0;
            tmpy1 = tmpy1 + mov;
            tmpy2 = tmpy2 + mov;
            txt1.setY(tmpy1);
            txt2.setY(tmpy2);
                                  yyy = y;
        }
        return true;
    }
}
текст находится в самом верху экрана. При касании в любой точке экрана текст перемещается по оси y в эту точку!?
А надо чтобы при касании текст оставался на своём месте соответственно! И потом при перемещении пальца надо чтобы текст двигался следом за пальцем.

Какую формулу надо вписать вместо
Java
1
2
3
mov = y - yyy;
tmpy1 = tmpy1 + mov;
tmpy2 = tmpy2 + mov;
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2014, 23:41     Самодельный Scroll
Посмотрите здесь:

Delphi самодельный класс
PHP самодельный cron
Самодельный прогрессбар C++ Builder
Android Scroll Listview
Android Listview Scroll Android
OFF scroll на body > ON scroll children jQuery
Android Scroll, как в Instagram
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
spydark91
85 / 85 / 2
Регистрация: 03.03.2011
Сообщений: 1,872
12.04.2014, 00:28     Самодельный Scroll #2
определяйте где прикоснулись к экрану, выше текста или ниже
в зависимости от этого будет знак разный, плюс смещение или минус
попробуйте разрешать смещение координат когда ACTION_MOVE происходит второй раз

и ваш метод будет работать с апи 11, если не ошибаюсь (тк setY раньше не определен)
phpk
25 / 25 / 6
Регистрация: 15.05.2013
Сообщений: 1,046
12.04.2014, 12:03  [ТС]     Самодельный Scroll #3
Цитата Сообщение от spydark91 Посмотреть сообщение
попробуйте разрешать смещение координат когда ACTION_MOVE происходит второй раз
вроде что-то получилось, благодарю:
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
49
50
51
52
53
public class MainActivity extends Activity 
              implements OnTouchListener
{
    LinearLayout ly;
    int flag = 0;
    TextView txt1, txt2;
    float yyy = 0, y = 0, tmpy1, tmpy2;
 
     @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        ly = new LinearLayout(this);
        ly.setOrientation(1);
        txt1 = new TextView(this);
        txt2 = new TextView(this);
 
        txt1.setText("hello");            // обычный текст
        txt2.setText("world");           // который надо передвигать скролом
        ly.setOnTouchListener(this);
 
        ly.addView(txt1);
        ly.addView(txt2);
        setContentView(ly);
    }
 
 
    @Override
    public boolean onTouch(View v, MotionEvent event)
    {
        float mov;
        if (event.getAction() == MotionEvent.ACTION_MOVE)          // событие прокрутки
        {
            flag++;
            y = event.getY();             // координата касания
            tmpy1 = txt1.getY();        //  координаты
            tmpy2 = txt2.getY();        //                текста
            mov = y - yyy;                // mov - значение смещения текста
            if( flag == 1 ) mov = 0;
            tmpy1 = tmpy1 + mov;
            tmpy2 = tmpy2 + mov;
            txt1.setY(tmpy1);
            txt2.setY(tmpy2);
            yyy = y;
        }
         if (event.getAction() == MotionEvent.ACTION_UP)
         {
             flag == 0;
             yyy = 0;
         }
        return true;
    }
}
phpk
25 / 25 / 6
Регистрация: 15.05.2013
Сообщений: 1,046
25.05.2014, 23:20  [ТС]     Самодельный Scroll #4
подскажите пожалуйста, как теперь к этому коду прикрутить замедление после прокрутки?
Т.е. коснулись пальцем экрана, прокрутили в нужное место, и после отжатия прокрутка должна не сразу остановиться, а с замедлением, допустим через 2 секунды должна остановиться!
Это наверно надо создавать дополнительный поток?
Даже не знаю, как надо делать замедление. Раньше с таким не сталкивался!

За ранее благодарю!
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,502
25.05.2014, 23:55     Самодельный Scroll #5
Боюсь мало кто здесь с подобным сталкивался :-(
Сам подбное уже пол года пишу - пока немного криво! Много раз подобное спрашивал - ответов почти небыло...

Я бы сделал таймер на операцию сдвиг. Вы отжали - запустили таймер. Он еще 2 секунды по Вашей формуле крутит список. Можно попробовать сделать затухание вместо наглого 5dp в 100 мс и стоп через 2 секунды. Но для этого надо вычислить/знать прошлую скорость.

Жаль, так и не понял как сделать своего наследника от списка со своим методом отрисовки/управления скролла. Там есть все - и расчеты позиции/размеров скролла, и обработки прокрутки, и плавное торможение, и обработка прокрутки за пределы списка... простор для фантазии, но увы...
NiRamz
211 / 211 / 16
Регистрация: 26.12.2010
Сообщений: 691
26.05.2014, 12:38     Самодельный Scroll #6
Цитата Сообщение от Tester64 Посмотреть сообщение
Жаль, так и не понял как сделать своего наследника от списка со своим методом отрисовки/управления скролла. Там есть все - и расчеты позиции/размеров скролла, и обработки прокрутки, и плавное торможение, и обработка прокрутки за пределы списка... простор для фантазии, но увы...
Что бы написать свой список, не обязательно наследоваться от стандартного ListView, от этого простор для фантазии не ограничется. Для более точной обработки скроллов и флингов (когда мотнули и отпустили), есть класс GestureDetector, которому мы скармливаем все события касаний и он их обрабатывает.
phpk
25 / 25 / 6
Регистрация: 15.05.2013
Сообщений: 1,046
26.05.2014, 13:02  [ТС]     Самодельный Scroll #7
Цитата Сообщение от NiRamz Посмотреть сообщение
Для более точной обработки скроллов и флингов (когда мотнули и отпустили), есть класс GestureDetector, которому мы скармливаем все события касаний и он их обрабатывает.
а как сделать с помощью GestureDetector плавное затухание прокрутки?
NiRamz
211 / 211 / 16
Регистрация: 26.12.2010
Сообщений: 691
26.05.2014, 13:03     Самодельный Scroll #8
Почитайте про него, поищите мануалы и попытайтесь сделать, если что то станет не понятно - спрашивайте. От готового решения толку мало будет.
phpk
25 / 25 / 6
Регистрация: 15.05.2013
Сообщений: 1,046
26.05.2014, 13:32  [ТС]     Самодельный Scroll #9
тогда другой вопрос по коду, представленному выше.
если этой проге дать допустим список файлов, который показывается вертикально, и не вмещается на экран, то название самого нижнего файла может не вместиться и отображаться наполовину!
И при прокрутке это отображение наполовину сохраняется, т.е. те файлы которые не вместились не отображаются, а который отображается наполовину, так и остаётся отображаться наполовину при прокрутке вниз.
Каждое название файла я присваиваю отдельному TextView, и оперирую его getX(), setX()
Как сделать чтобы отображались все файлы, которые не вмещаются на экран при прокрутке?
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,502
26.05.2014, 15:13     Самодельный Scroll #10
Цитата Сообщение от NiRamz Посмотреть сообщение
Что бы написать свой список, не обязательно наследоваться от стандартного ListView, от этого простор для фантазии не ограничется. Для более точной обработки скроллов и флингов (когда мотнули и отпустили), есть класс GestureDetector, которому мы скармливаем все события касаний и он их обрабатывает.
У меня немного другая задача. Стандартные касания/слайды меня устраивают. Мне нужна своя ОТРИСОВКА скролла. Не установка xml файла вместо ползунка и подложки методом растягивания. А именно отрисовка. А получить точные координаты и размеы ползунка в пикселах (а не в количестве строк видимых/всего) - проблематично. Особенно если строки разной высоты. Как и заменить метод отрисовки. Пока рисую в панели рядом со списком (скрыв основной ползунок). Но точность сильно хромает. И хотя в глубинах исходников нашел упоминания размеров и вызов метода отрисовки(подменить бы), но сквозь предков его получить не вышло...
phpk
25 / 25 / 6
Регистрация: 15.05.2013
Сообщений: 1,046
28.05.2014, 20:20  [ТС]     Самодельный Scroll #11
вопрос в силе!
Как сделать, чтобы название файла отображалось полностью, не наполовину?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.05.2014, 21:05     Самодельный Scroll
Еще ссылки по теме:

Scroll listview Android
Как запретить использовать Scroll руками? Android
Добавить scroll view в собственный вью Android
Android Scroll - как заставить скроллиться
Самодельный бумбокс

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

Или воспользуйтесь поиском по форуму:
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,502
28.05.2014, 21:05     Самодельный Scroll #12
Цитата Сообщение от phpk Посмотреть сообщение
отображалось полностью, не наполовину
Если у вас кастомный список, то сделайте поле куда выводится текст с переносимыми строками.
Искать лень - как-то связано с lines line count в xml... если то что нужно, то поищу...
Yandex
Объявления
28.05.2014, 21:05     Самодельный Scroll
Ответ Создать тему
Опции темы

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