Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
haribo
41 / 41 / 3
Регистрация: 26.05.2013
Сообщений: 160
#1

Ресайз фигуры - Программирование Android

12.09.2013, 11:57. Просмотров 423. Ответов 5
Метки нет (Все метки)

Есть фигура. Квадрат. Отображаю при помощи Path. Path составляю из массива точек.
При пинче хочу ресайзить фигуру (делать крупнее, мельче).
Как ресайзю сейчас: для каждой точек квадрата (а их четыре) сечу новые X+Y, их вычисляю обычным способом.

http://www.cyberforum.ru/android-dev/thread1328029.html
Проблема: При таком ресайзе фигура уезжает, то есть поскольку x и y все точек увеличивается/уменьшается фигура уезжает.

Вопрос: Как надо?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.09.2013, 11:57
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Ресайз фигуры (Программирование Android):

Перемещение фигуры по canvas
Нужно сделать перемещение фигуры пальцем. Круг и квадрат сделал, а с...

Вращение фигуры в SurfaceView
Сейчас фигура вращается с помощью функции glRotate, все работает, и она...

ProgressBar в виде фигуры человечка
Здравствуйте. Подскажите как реализовать такой progressbar. Спасибо.

Определение граний произвольной закрытой фигуры
При написании игры, столкнулся с проблемой. Для простоты приведу упрощенный...

Ресайз
Добрый день! Есть такая проблема. Имеется скрипт, который меняет размеры...

5
vxg
Модератор
3229 / 2032 / 319
Регистрация: 13.01.2012
Сообщений: 7,884
12.09.2013, 12:32 #2
Цитата Сообщение от haribo Посмотреть сообщение
их вычисляю обычным способом
интересно каким? по идее надо, например, так: левый верхний угол фигуры остается неподвижным, тогда: координаты трех оставшихся точек вычисляются как текущее расстояние от них до опорной точки по соответвующе оси умноженное на масштабный коэффициент.
1
haribo
41 / 41 / 3
Регистрация: 26.05.2013
Сообщений: 160
12.09.2013, 14:16  [ТС] #3
Цитата Сообщение от vxg Посмотреть сообщение
интересно каким? по идее надо, например, так: левый верхний угол фигуры остается неподвижным, тогда: координаты трех оставшихся точек вычисляются как текущее расстояние от них до опорной точки по соответвующе оси умноженное на масштабный коэффициент.
Именно так, только левый верхний угол тоже вычисляется. Если его не вычислять, то точки разъезжаются по какой-то причине и это уже не квадрат.
Плюс ко всему, назрел еще один вопрос, почему-то ресайз ОЧЕНЬ быстрый, малеший pinch дает огромный ресайз.

Ресайз вычисляю следующим образом:
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
@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction() & MotionEvent.ACTION_MASK) {
        ...
        case MotionEvent.ACTION_MOVE: {
                ...
                float newMovingDist = spacing(event);
                if (newMovingDist > stdDist) {
                        for (FigurePoint point : pointList) {
                            point.setX((int) (newMovingDist / movingDist * point.getX()));
                            point.setY((int) (newMovingDist / movingDist * point.getY()));
                        }
                        invalidate();
                }
}
 
private float spacing(MotionEvent event) {
    float x = 0;
    float y = 0;
    try {
        x = event.getX(0) - event.getX(1);
        y = event.getY(0) - event.getY(1);
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
        Log.d(TAG, "pointerIndex exception");
    }
    return FloatMath.sqrt(x * x + y * y);
}
pointsList - содержит точки фигуры (квадрат, треугольник)
0
vxg
Модератор
3229 / 2032 / 319
Регистрация: 13.01.2012
Сообщений: 7,884
12.09.2013, 14:44 #4
Цитата Сообщение от haribo Посмотреть сообщение
по какой-то причине
надо полагать они едут от того что левый верхний угол имеет координаты отличные от 0,0 - нельзя координаты тупо умножать на масштабирующий коэффициент. новая координата должна быть вычислена как
x_new = x_base + (x_old - x_base) * k;
то же самое для y
базовую точку выбирайте любую - будет казаться что фигура меняет размер будучи закрепленной за эту точку. что бы размер изменялся не слишком быстро подберите k. как его получить по прикосновению - отдельная тема. я не разу с прикосновением не работал. если вы про тот вид когда человек сводит/разводит два пальца, то наверное надо получать отношение между исходной и текущей дистанцией. причем перезаписывать координаты фигуры только после того как пользователь отпустил. иначе она лавинообразно увеличится/уменьшится
1
haribo
41 / 41 / 3
Регистрация: 26.05.2013
Сообщений: 160
12.09.2013, 18:01  [ТС] #5
del

Добавлено через 16 минут
Цитата Сообщение от vxg Посмотреть сообщение
иначе она лавинообразно увеличится/уменьшится
именно так и нужно, уменьшение/увеличение не после отпускания пальцев, а во время пинча.
Если что, могу рассказать как это делается (код представлен выше)
0
vxg
Модератор
3229 / 2032 / 319
Регистрация: 13.01.2012
Сообщений: 7,884
12.09.2013, 19:10 #6
лучше расскажите)
0
12.09.2013, 19:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2013, 19:10
Привет! Вот еще темы с решениями:

Ресайз картинок
Привет! Можно ли средствами РНР изменять размеры картинок как есть, т.е., - ...

Ресайз канваса
Столкнулся с такой проблемой: Загружаю в канвас изображение; Теперь, если...

Ресайз изображения
Есть изображение, такого вида: увеличиваю(делаю ресайз) его в 2 раза в...

ресайз CDialog
Привет, народ! Помогите новичку. Работаю с CDialog. Нужно чтобы окно могло...


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

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

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