8.03.2016 / 13:59 | |
aNNiMON Супервизор Сейчас: Offline
Имя: Витёк Регистрация: 11.01.2010
| Не могу придумать, как модуль canvas реализовать. Нужно отрисовывать всё в UI-потоке на кастомной вьюшке. Другую активити не создашь, приходится держать на одном экране и вьюшку и редактор с консолью. Но на деле получается так, хотя я вроде очищаю фон во вьюшке. Хотелось, чтобы всё было менее костыльно и перекрывало ActionBar. Any ideas? __________________
let live |
8.03.2016 / 16:19 | |
Naik Пользователь Сейчас: Offline
Имя: %name% Регистрация: 14.03.2010
| aNNiMON, AlertDialog?
|
8.03.2016 / 16:22 | |
aNNiMON Супервизор Сейчас: Offline
Имя: Витёк Регистрация: 11.01.2010
| Naik, не, не вариант. Потом ещё события нажатий вешать надо, а диалог только мешать будет.
__________________
let live |
8.03.2016 / 16:27 | |
Naik Пользователь Сейчас: Offline
Имя: %name% Регистрация: 14.03.2010
| aNNiMON, public void toggleCanvasMode(boolean show) {
toolbar.setVisibility(show? View.GONE : View.VISIBLE);
canvasLayout.setVisibility(show? View.VISIBLE : View.GONE);
}
|
8.03.2016 / 16:35 | |
aNNiMON Супервизор Сейчас: Offline
Имя: Витёк Регистрация: 11.01.2010
| Naik, ты не поверишь, так и делаю. Но без тулбара, не очень хочется support-lib тянуть только ради этого. Есть какие-то упрощённые решения?
__________________
let live |
8.03.2016 / 16:52 | |
Naik Пользователь Сейчас: Offline
Имя: %name% Регистрация: 14.03.2010
| aNNiMON, Проблема в том что ActionBar не скрывается? Так может он и нужен, остановить программу кнопку сделать например там. Можно ещё на фрагменты разбить канвас и текстовый режим
Изменено Naik (8.03 / 16:54) (всего 2 раза) |
8.03.2016 / 17:29 | |
aNNiMON Супервизор Сейчас: Offline
Имя: Витёк Регистрация: 11.01.2010
| Naik, с фуллскрином этот код помог. А фон просвечивался из-за того, что я вьюшку поместил не над EditText и TextView, а под ними. __________________
let live |
8.03.2016 / 19:35 | |
aNNiMON Супервизор Сейчас: Offline
Имя: Витёк Регистрация: 11.01.2010
| Проблема: вьюшка не успевает проинициализироваться. Вызывается метод инициализации, в котором вьюшка ставится в VISIBLE, добавляется listener, чтобы выполнять код в onDraw, где при первой прорисовке должен создаться bitmap и другой canvas, на котором будем рисовать. private void init() {
bitmap = null;
cv.setVisibility(View.VISIBLE);
CanvasView.setListener(this);
cv.invalidate();
}
protected void onDraw(CanvasView cv, Canvas c) {
if (bitmap == null) {
// тут получаем размеры вьюшки, создаём bitmap и canvas
}
c.drawColor(WHITE);
c.drawBitmap(bitmap, 0, 0);
}
Вылетает NPE при попытке нарисовать линию и только потом вызывается onDraw, где инициализируется bitmap. Похоже, что cv.invalidate() не блокирует поток, что логично. Вопрос в том, как мне вовремя вызвать onDraw? Блокировать основной поток не получится, потому что вьюшка тоже в нём должна отрисовываться, соответственно deadlock будет. __________________
let live |
8.03.2016 / 20:10 | |
aNNiMON Супервизор Сейчас: Offline
Имя: Витёк Регистрация: 11.01.2010
| Хм, попробую ещё SurfaceView, как советуют здесь. __________________
let live |
8.03.2016 / 20:19 | |
Naik Пользователь Сейчас: Offline
Имя: %name% Регистрация: 14.03.2010
| aNNiMON, рисуй в буфер, должно помочь
|