Пользовательский вид Android: установите размер холста для переноса растрового изображения

У меня есть пользовательский вид, в котором есть Canvas. Я использую этот холст, чтобы показать на нем растровое изображение, а затем я могу рисовать по растровому изображению при касании. Когда я загружаю растровое изображение, оно намного больше, чем размер представления, и я не вижу всего растрового изображения (это изображение, сделанное камерой). Я попытался создать масштабированное растровое изображение, а затем нарисовать его на холсте, но в этом случае растровое изображение меньше, и холст занимает все доступное пространство макета. Я добавляю это представление программно, а не в макет xml. Я установил это для представления, но не работает:

fdvImage = new ImageEditingView(this, b);
RelativeLayout.LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
lp.addRule(RelativeLayout.CENTER_IN_PARENT, 1);
fdvImage.setLayoutParams(lp);

и это мой конструктор представлений:

public ImageEditingView(Context c, Bitmap b) {
    super(c);
    this.setMinimumHeight(0);

    mBitmap = Bitmap.createScaledBitmap(b, b.getWidth()/2, b.getHeight()/2, true);
    mCanvas = new Canvas(mBitmap);
}

и в onDraw у меня есть это:

protected void onDraw(Canvas canvas) {
    canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
}

Итак, мой вопрос: почему холст занимает все пространство макета, даже если растровое изображение меньше, чем оно?


person nikmin    schedule 09.04.2013    source источник


Ответы (1)


Используйте этот код для рисования растрового изображения

canvas.drawBitmapMesh(yourBitmap, 1, 1,vertices, 0, null, 0,
                                        paint);

Сделайте вершины в соответствии с вашим представлением

[ИЗМЕНИТЬ]

    float[] vertices = new float[8];
 vertices[0]=0; vertices[1]=0; vertices[2]=100; vertices[3]=0;
 vertices[4]=0;vertices[5]=200; vertices[6]=100; vertices[7]=200;

измените 100 на ширину и 200 на высоту

person Arun C    schedule 09.04.2013
comment
что поставить вместо вершин? Как сделать эти вершины? - person nikmin; 09.04.2013
comment
это нормально, но у меня есть одна проблема. Представление создается в onCreate, и у меня нет ширины и высоты, которые должны быть у изображения. Представление добавляется внутри относительного макета, но я не могу получить ширину и высоту, потому что это вызывается в onCreate. - person nikmin; 09.04.2013
comment
используйте onWindowFocusChanged, чтобы получить высоту и ширину - person Arun C; 10.04.2013
comment
Это оно. Я получаю размеры макета в onWindowFocusChanged и рисую растровое изображение на холсте там. Мне не нужен canvas.drawBitmapMesh. Поскольку у меня есть размеры, я создаю масштабированное растровое изображение, а затем рисую его. - person nikmin; 10.04.2013