С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

Самодельный Scroll - Программирование Android

11.04.2014, 23:41. Просмотров 1378. Ответов 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;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2014, 23:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Самодельный Scroll (Программирование Android):

Scroll Listview - Программирование Android
Подскажите как убрать скролл в компоненте Listview

Scroll listview - Программирование Android
Доброй ночи всем. Есть активити со следующим layout. <?xml version="1.0" encoding="utf-8"?> <LinearLayout...

Scroll, как в Instagram - Программирование Android
Кто-нибудь подскажет как сделать скролл как в инстаграме? то есть, чтобы заголовок был прикреплен пока просматривается фото,...

Android Listview Scroll - Программирование Android
Здравствуйте, я написал код ведьма может загрузить JSON и шоу ListView (он работает идеально), но моя проблема: когда я пытаюсь прокрутить...

Scroll - как заставить скроллиться - Программирование Android
Здравствуйте. Появилась проблема: на активити много разных view. Когда тапишь в элемент с клавиатурой (например, EditText) открывается...

Как запретить использовать Scroll руками? - Программирование Android
Ребят нужна помощь, я создал стандартный горизонтальный ScrollView, но управляю им через методы ScrollTo, вопрос в том: Как запретить...

11
spydark91
85 / 85 / 2
Регистрация: 03.03.2011
Сообщений: 1,873
12.04.2014, 00:28 #2
определяйте где прикоснулись к экрану, выше текста или ниже
в зависимости от этого будет знак разный, плюс смещение или минус
попробуйте разрешать смещение координат когда ACTION_MOVE происходит второй раз

и ваш метод будет работать с апи 11, если не ошибаюсь (тк setY раньше не определен)
1
phpk
26 / 26 / 6
Регистрация: 15.05.2013
Сообщений: 1,082
12.04.2014, 12:03  [ТС] #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;
    }
}
0
phpk
26 / 26 / 6
Регистрация: 15.05.2013
Сообщений: 1,082
25.05.2014, 23:20  [ТС] #4
подскажите пожалуйста, как теперь к этому коду прикрутить замедление после прокрутки?
Т.е. коснулись пальцем экрана, прокрутили в нужное место, и после отжатия прокрутка должна не сразу остановиться, а с замедлением, допустим через 2 секунды должна остановиться!
Это наверно надо создавать дополнительный поток?
Даже не знаю, как надо делать замедление. Раньше с таким не сталкивался!

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

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

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

Добавить scroll view в собственный вью - Программирование Android
Я создал класс, наследуемый от вью, добавил его в разметку. Теперь я хочу программно при создании моего вью добавить в него скролл вью....

При scroll'e не пролистываются объекты, имеющие компонент scroll rect - Unity, Unity3D
Есть главная панель со scroll rect'ом для горизонтального scroll'а и event trigger'ом (для проверки пролистывания) с дочерними объектами,...

OFF scroll на body > ON scroll children - jQuery
Добрый день. Возник вопрос как сделать так чтоб при на ведении на элемент событие scroll работало в этом элементе, и не срабатывало на...

Самодельный бумбокс - Аудио, усилители звука
Завалялось у меня много ненужной автомобильной акустики. Вот я и решил осуществить давнюю мечту - смастерить большую колонку для дачных...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.