Слои Холста Android SurfaceView



Я пытаюсь сделать приложение, в котором вы можете взять изображение и применить "наклейки" (несколько растровых изображений) к изображению. Затем позвольте пользователю преобразовать (перевести, масштабировать и вращать) каждую отдельную "наклейку". В настоящее время я использую SurfaceView и Canvas, чтобы нарисовать каждое растровое изображение к этому Canvas. Он позволяет пользователю непосредственно преобразовать растровое изображение, и это растровое изображение обращается к функции Canvas on в функции onDraw(). Хотя в настоящее время я могу эффективно манипулировать только последней "наклейкой", которая была нарисованный.



Я хотел бы сделать так, чтобы пользователь мог непосредственно манипулировать каждой отдельной "наклейкой". Таким образом, моя текущая мысль заключается в том, что мне придется создать несколько слоев (т. е. слоев Photoshop) наклеек и определить во время onTouchEvent(), к какой наклейке прикасаются, принести этот слой в переднюю часть стека и манипулировать этим слоем. Чтобы сделать это, я думаю, что мне придется создать несколько объектов Canvas для использования в качестве слоев, а затем нарисовать каждую "наклейку" в один Canvas. Тогда onTouchEvent вызовет getDrawingCache() на каждом Canvas, чтобы определить, к какому стикеру прикасаются, вызывая getPixel() в этом кэше чертежей и определяя, прозрачен ли пиксель или нет.



Мой вопрос, по существу, заключается в том, как я буду рисовать все эти Canvas объекты в SurfaceView? И это лучший способ добиться желаемого эффекта?



Я знаю, что SurfaceView берет только один Canvas, поэтому я должен был бы заранее нарисовать каждый Canvas к одному Canvas? И если это так, будет ли каждый из этих Canvas объектов держать их превращения в такт, когда я их сливаю? Или мне придется манипулировать растровым изображением внутри каждого объекта Canvas вместо самого объекта Canvas?

563   1  

1 ответ:

SurfaceView не принимает холст, он предоставляет холст-обратите внимание, что холст-это возвращаемое значение из lockCanvas(), а не аргумент. (Это аргумент к unlockCanvasAndPost(), что несколько неудачно.)

Я думаю, что лучший способ сделать то, что вы хотите,-это использовать закадровые растровые изображения, для которых вы создаете свой собственный холст. Сделайте все ваши рендеринги вне экрана,а затем Блит составленное растровое изображение на SurfaceView с помощью одного вызова рисования растрового изображения.

Я должен также указать что, если вы используете onDraw(), вы рискуете отрисоваться на части вида, а не на поверхности. Я рекомендую против суб-причислять SurfaceView не, если вы собираетесь рисовать на. Если вы думаете, что onDraw() - это то, что вы на самом деле хотите, то вы должны рассмотреть возможность использования пользовательского представления и избежать ненужных накладных расходов поверхности.

Comments

    Ничего не найдено.