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

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

Войти
Регистрация
Восстановить пароль
 
geometria
1 / 1 / 0
Регистрация: 13.01.2013
Сообщений: 98
#1

canvas.rotate - Программирование Android

14.06.2013, 03:20. Просмотров 924. Ответов 3
Метки нет (Все метки)

Данный код работает не стабильно на разных устройствах.

Под разные плотности экрана (ldpi, mdpi, hdpi, xhdpi) в каждую папку был положен файл с возрастающим разрешением как сказано в developer.android.com 75px-100px-150px-200px
Но, протестировав на эмуляторе устройство (mdpi 5.1" 480*800) и устройство (mdpi 3.2" 320*480) получила смещение во вращении. Код работает стабильно без разбивки файла по папкам drawable на устройствах ldpi и hdpi до 4х дюймов, даже одно и тоже разрешение экрана 480*800 на устройстве 4" hdpi - работает, а на 5.1" mdpi -нет.

Подскажите, пожалуйста, что не так в этом коде? И как сделать чтоб на всех аппаратах работало стабильно?

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
int rotation = 1;
               
        private void draw() {
            SurfaceHolder holder = getSurfaceHolder();
            Canvas c = null;
            try {
                c = holder.lockCanvas();
                int w = c.getWidth();//берем ширину экрана
                int h = c.getHeight();//высоту
                if (c != null) {
                    Paint p = new Paint();
                    p.setAntiAlias(false);
                    rotation += 6;
                    if (rotation > 360) {rotation = 1;}
                    
c.drawBitmap(bg, 0, 0, p);//фон
c.rotate(rotation, w*100/228, h*100/216); //44% от ширины и 46% от высоты, соответствует 210, 370 на устройстве с разрешением 480*800px
c.drawBitmap(pic, w*100/228-(w*156/1000), h*100/216-(w*156/1000), p);//соотв. 135,295  (156 это разница между верхней и этой строчкой (210-135) деленное на ширину экрана)     pic - картинка 100*100px
c.rotate(-rotation, w*100/228, h*100/216); //возвращаем холст
                }
            } finally {
                if (c != null)
                    holder.unlockCanvasAndPost(c);
            }
            mHandler.removeCallbacks(mUpdateDisplay);
            if (mVisible) {
                mHandler.postDelayed(mUpdateDisplay, 20);
            }
 
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.06.2013, 03:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос canvas.rotate (Программирование Android):

Canvas - Программирование Android
Хочу разобраться в канвасе. Полазил по интернету, не нашел никакого простейшего материала про движение обьектов созданных в канвасе по...

Intent в Canvas - Программирование Android
в private void draw нужно использовать переменную T из соседнего класса я использую, строка с примечанием, но выдает ошибку подскажите...

Столкновения на canvas - Программирование Android
Здравствуйте. Задача определить позиции столкновения для 2 объектов-рисунков .png, которые при этом еще и вращаются...

Потоки. Canvas - Программирование Android
Добрый день. Подскажите, как реализовать обработку изменения цвета с помощью потоков? Не могу разобраться как обратиться package...

Использование canvas - Программирование Android
Интересует насколько глупо использовать слудующий метод рисование и как тогда быть. Есть игра где все происходит в координатной системе....

Canvas и Activity - Программирование Android
Есть класс наследующийся от activity. из которого переходишь в класс который рисует спрайты. Спрайты рисуются в потоке, собственно есть...

3
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
14.06.2013, 04:13 #2
Java
1
2
c.rotate(rotation, w/2, h/2);
c.drawBitmap(pic, 0, 0, p);
0
geometria
1 / 1 / 0
Регистрация: 13.01.2013
Сообщений: 98
16.06.2013, 21:04  [ТС] #3
V0v1k, и что мне прикажете с Вашим кодом делать?
Задача ставилась так: нарисовать картинку 100*100px в 44% справа от ширины экрана и в 44% сверху от высоты экрана любого устройства будь то большой планшет или самый маленький смартфон. И повернуть эту картинку (rotation += 6) вокруг своей оси. Думала в комментариях было ясно написано...
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
16.06.2013, 21:31 #4
а, ну здесь вращается канвас, поэтому немного другой результат получается чем вы ожидаете
попробуйте поэкспериментировать с методом drawBitmap(Bitmap bitmap, Matrix matrix, Paint paint), matrix используйте для рутейшена.

Добавлено через 16 минут
а, ну так вы вращаете канвас не вокруг середины рисунка, а вокруг его левого верхнего угла.
Java
1
c.rotate(rotation, w*100/228 + imageW/2, h*100/216 + imageH/2);
0
16.06.2013, 21:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2013, 21:31
Привет! Вот еще темы с ответами:

Canvas и Button - Программирование Android
можно ли в канвасе на холсте разместить view-элементы? кнопки к примеру или textview.

Canvas в JPEG - Программирование Android
Всем Привет! пытаюсь сохранить все что нарисовано на канве в джпег-файл. Глубоко не загугливаясь обнаружил следующий материал:...

Android canvas - Программирование Android
Как передать параметры в класс с методом onDraw? Этот самый класс мне нужно вызвать в xml! я так то сделал вложеный класс, и...

Карта на Canvas - Программирование Android
Здравствуйте! Решил попробовать написать игру под андроид, до этого писал пару приложений несложных. Суть игры рассказывать не буду,...


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

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

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