Добавление изображения на холст в Android

#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 вы должны отредактировать свой ответ, чтобы я мог удалить отрицательный отзыв. Я был просто разочарован тем, что вижу вопросы, которые у меня есть, и ответы, которые не отвечают на вопрос, который, как я думал, был задан.