#android #image-manipulation
#Android #обработка изображений
Вопрос:
Всем доброго дня
Я надеялся, что вы могли бы помочь мне разобраться в концепциях понимания того, как добавить изображение в холст в onTouchEvent, реализованном в представлении. На данный момент это то, что я придумал.
parent — это действие, в котором создается экземпляр этого настраиваемого представления и в которое он добавляется.
@Override
protected void onDraw(Canvas canvas)
{
// TODO Auto-generated method stub
super.onDraw(canvas);
}
public void insertImage()
{
if (parent.selected_icon.contentEquals("image1"))
{
image = getResources().getDrawable(R.drawable.image1);
}
else if (parent.selected_icon.contentEquals("image1"))
{
image = getResources().getDrawable(R.drawable.image2);
}
else if (parent.selected_icon.contentEquals("iamge3"))
{
image = getResources().getDrawable(R.drawable.image3);
}
Rect srcRect = new Rect(0, 0, image.getIntrinsicWidth(),
image.getIntrinsicHeight());
Rect dstRect = new Rect(srcRect);
Bitmap bitmap = Bitmap.createBitmap(image.getIntrinsicWidth(),
image.getIntrinsicHeight(), Bitmap.Config.ALPHA_8);
Canvas canvas = new Canvas();
canvas.drawBitmap(bitmap, srcRect, dstRect, null);
invalidate();
}
Комментарии:
1. Это здорово / хорошо отформатировано для вашего первого вопроса. Добро пожаловать в Stack Overflow!
2. второе else if указывает image1, а не image2
Ответ №1:
Когда вы хотите нарисовать поверх вида, вы должны сделать это в onDraw()
, используя Canvas
переданный там. Это Canvas
уже привязано к Bitmap
, который является фактическим рисунком вашего представления.
Я должен был сделать что-то подобное, и мой подход был таким:
- У меня был список «объектов, которые нужно нарисовать поверх представления» в качестве члена класса.
- всякий раз, когда я добавлял что-то в этот список, я вызывал
invalidate()
, чтобы этоonDraw()
вызывалось. - Мой
onDraw()
выглядел так:
…
protected void onDraw(Canvas canvas) {
super.onDraw(canvas); // the default drawing
for(ThingToBeDrawn thing : mListOfThingsToBeDrawn) {
thing.drawThing(canvas); // draw each thing over the view
}
}
Canvas
Это просто инструмент, используемый для рисования Bitmap
, и он работает совершенно иначе, чем SurfaceView
.
Комментарии:
1. Я полностью согласен, используйте canvas.drawBitmap() внутри вашего метода onDraw().
2. bigstones, не могли бы вы рассказать, пожалуйста, как выглядит метод invalidate() и где его вызвать? Заранее спасибо.
3. У меня есть растровое изображение в MainActivity. есть пользовательский вид, который расширяет View, и да, у него есть метод onDraw (). Но как я должен перенести мою растровую переменную в MainActivity в пользовательский вид?
4. @Donato точно так же, как вы поступили бы с любым классом Java: получите ссылку на свой пользовательский вид в activity и используйте параметр, подобный
customView.setMyBitmap(myBitmap)
, или передайте его в конструкторе, если вы добавляете вид программно. Почему понижающий голос?5. @bigstones вы должны отредактировать свой ответ, чтобы я мог удалить отрицательный отзыв. Я был просто разочарован тем, что вижу вопросы, которые у меня есть, и ответы, которые не отвечают на вопрос, который, как я думал, был задан.