Вниз  Android-программирование (1-ые посты)
- 8.03.2016 / 13:59
aNNiMON
  Супервизор

aNNiMON 
Сейчас: Offline
Не могу придумать, как модуль canvas реализовать. Нужно отрисовывать всё в UI-потоке на кастомной вьюшке. Другую активити не создашь, приходится держать на одном экране и вьюшку и редактор с консолью. Но на деле получается так, хотя я вроде очищаю фон во вьюшке. Хотелось, чтобы всё было менее костыльно и перекрывало ActionBar. Any ideas?
__________________
 let live
- 8.03.2016 / 16:19
Naik
  Пользователь

Naik 
Сейчас: Offline
aNNiMON, AlertDialog?
- 8.03.2016 / 16:22
aNNiMON
  Супервизор

aNNiMON 
Сейчас: Offline
Naik, не, не вариант. Потом ещё события нажатий вешать надо, а диалог только мешать будет.
__________________
 let live
- 8.03.2016 / 16:27
Naik
  Пользователь

Naik 
Сейчас: Offline
aNNiMON,
  1. public void toggleCanvasMode(boolean show) {
  2.     toolbar.setVisibility(show? View.GONE : View.VISIBLE);
  3.     canvasLayout.setVisibility(show? View.VISIBLE : View.GONE);
  4. }
  :gg:
- 8.03.2016 / 16:35
aNNiMON
  Супервизор

aNNiMON 
Сейчас: Offline
Naik, ты не поверишь, так и делаю. Но без тулбара, не очень хочется support-lib тянуть только ради этого. Есть какие-то упрощённые решения?
__________________
 let live
- 8.03.2016 / 16:52
Naik
  Пользователь

Naik 
Сейчас: Offline
aNNiMON, Проблема в том что ActionBar не скрывается? Так может он и нужен, остановить программу кнопку сделать например там. Можно ещё на фрагменты разбить канвас и текстовый режим

Изменено Naik (8.03 / 16:54) (всего 2 раза)
- 8.03.2016 / 17:29
aNNiMON
  Супервизор

aNNiMON 
Сейчас: Offline
Naik, с фуллскрином этот код помог.

А фон просвечивался из-за того, что я вьюшку поместил не над EditText и TextView, а под ними. :gg:
__________________
 let live
- 8.03.2016 / 19:35
aNNiMON
  Супервизор

aNNiMON 
Сейчас: Offline
Проблема: вьюшка не успевает проинициализироваться.

Вызывается метод инициализации, в котором вьюшка ставится в VISIBLE, добавляется listener, чтобы выполнять код в onDraw, где при первой прорисовке должен создаться bitmap и другой canvas, на котором будем рисовать.

  1. private void init() {
  2.     bitmap = null;
  3.     cv.setVisibility(View.VISIBLE);
  4.     CanvasView.setListener(this);
  5.     cv.invalidate();
  6. }
  7.  
  8. protected void onDraw(CanvasView cv, Canvas c) {
  9.     if (bitmap == null) {
  10.          // тут получаем размеры вьюшки, создаём bitmap и canvas
  11.     }
  12.     c.drawColor(WHITE);
  13.     c.drawBitmap(bitmap, 0, 0);
  14. }

Вылетает NPE при попытке нарисовать линию и только потом вызывается onDraw, где инициализируется bitmap.
Похоже, что cv.invalidate() не блокирует поток, что логично.

Вопрос в том, как мне вовремя вызвать onDraw? Блокировать основной поток не получится, потому что вьюшка тоже в нём должна отрисовываться, соответственно deadlock будет.
__________________
 let live
- 8.03.2016 / 20:10
aNNiMON
  Супервизор

aNNiMON 
Сейчас: Offline
Хм, попробую ещё SurfaceView, как советуют здесь.
__________________
 let live
- 8.03.2016 / 20:19
Naik
  Пользователь

Naik 
Сейчас: Offline
aNNiMON, рисуй в буфер, должно помочь
Наверх  Всего сообщений: 4453
Фильтровать сообщения
Поиск по теме
Файлы топика (184)