В этом уроке:
- работаем с Path
Click here to read this article!
Урок 143. Рисование. Path
Урок 143. Рисование. Path
Последний раз редактировалось damager82 29 май 2017, 23:19, всего редактировалось 8 раз.
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Урок 143. Рисование. Path
У меня с этим drawPath связаны самые болезненные воспоминания. Дело в том, что drawPath может в какой-то момент взять и перестать рисовать линию. Хотя нет, он будет её рисовать, но невидимую. Если выставить к примеру ему заливку, то заливку будет видно, а вот саму линию нет. Теперь более подробно:
Есть такой параметр getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
так вот, он с API 11. Если его выставить, то с устройствами API которых >=11, проблем не возникает. Проблемы возникают когда API<11. У нас drawPath попросту перестает работать. Canvas отказывалась отрисовывать. Если убрать этот параметр, то всё нормально. Я не смог понять природу этого глюка, но я потратил около недели, дабы понять причину неработоспособности. Спрашивается, причем тут drawPath и ActionBar? Понятия не имею. Я изучил исходники, дошел до нативного кода, занимался дебаггингом, но ничего не нашел. Дальше начал изучать нативный код Canvas, но вот отдебажить его уже не представлялось возможности. Дальше начал писать с нуля приложение на подобие нашего, добавлять потихоньку функционал. Сначала грешил на баги в osmdroid, грешил на баги либы ActionBar v7, на проблемы фрагментов во фрагментах, но вот путь джедая вывел меня на этот параметр.
Да, он с API 11, но не всегда это можно заметить, а он проглатывает этот параметр, не указывая нам никаких ошибок.
Есть такой параметр getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
так вот, он с API 11. Если его выставить, то с устройствами API которых >=11, проблем не возникает. Проблемы возникают когда API<11. У нас drawPath попросту перестает работать. Canvas отказывалась отрисовывать. Если убрать этот параметр, то всё нормально. Я не смог понять природу этого глюка, но я потратил около недели, дабы понять причину неработоспособности. Спрашивается, причем тут drawPath и ActionBar? Понятия не имею. Я изучил исходники, дошел до нативного кода, занимался дебаггингом, но ничего не нашел. Дальше начал изучать нативный код Canvas, но вот отдебажить его уже не представлялось возможности. Дальше начал писать с нуля приложение на подобие нашего, добавлять потихоньку функционал. Сначала грешил на баги в osmdroid, грешил на баги либы ActionBar v7, на проблемы фрагментов во фрагментах, но вот путь джедая вывел меня на этот параметр.
Да, он с API 11, но не всегда это можно заметить, а он проглатывает этот параметр, не указывая нам никаких ошибок.
Re: Урок 143. Рисование. Path
http://developer.android.com/guide/topi ... accel.html
"Beginning in Android 3.0 (API level 11), the Android 2D rendering pipeline supports hardware acceleration"
можно посмотреть как меняется Canvas.isHardwareAccelerated() от включения ActionBar
"Beginning in Android 3.0 (API level 11), the Android 2D rendering pipeline supports hardware acceleration"
можно посмотреть как меняется Canvas.isHardwareAccelerated() от включения ActionBar
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Урок 143. Рисование. Path
Если это на мое сообщение, то это никак не влияло на проблему. Hardware acceleration порождало другую проблему в этом случае, но порождало если мне память не изменяло на версиях API>=14, и связано было с отключенной опцией. Тут другая проблема была.
- dmitriy4leex
- Сообщения: 4
- Зарегистрирован: 29 июн 2013, 14:45
Re: Урок 143. Рисование. Path
Хотел бы немножко отметить по поводу "Домашнего задания" в данном уроке:
"В качестве задания предлагаю вам вспомнить Урок 102 про касания и сделать приложение, в котором будет нарисована прямая, а касаясь экрана пальцем ее можно будет искривлять в сторону точки касания"
Как ни старался, а при помощи onTouch() замутить такую операцию у меня не получилось. Помогло следующее:
У кого получилось сделать это при помощи onTouch() - огромная просьба отписать
"В качестве задания предлагаю вам вспомнить Урок 102 про касания и сделать приложение, в котором будет нарисована прямая, а касаясь экрана пальцем ее можно будет искривлять в сторону точки касания"
Как ни старался, а при помощи onTouch() замутить такую операцию у меня не получилось. Помогло следующее:
Код: Выделить всё
class DrawView extends View {
//переменные для координат
float x = 0;
float y = 0;
//прямо в классе DrawView реализуем метод onTouchEvent() без присвоения OnTouchListener,
//затем вызываем invalidate(), который, в сою очередь, вызовет onDraw()
@Override
public boolean onTouchEvent(MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN){
x = event.getX();
y = event.getY();
invalidate();
}
return true;
}
Re: Урок 143. Рисование. Path
Все получилось. Примерно так. Здесь dv - это сохраненная ссылка на объект DrawView.
Код: Выделить всё
@Override
public boolean onTouch(View v, MotionEvent event) {
dv.point1.set(
Float.valueOf(event.getX()).intValue(),
Float.valueOf(event.getY()).intValue()
);
dv.invalidate();
return true;
}