2015-03-30 6 views
0

Как маскировать изображение, например, мы можем масштабировать/масштабировать/поворачивать фоновое изображение, но не маску?Android Image Masking with Rotate & Scale

mask

я должен быть в состоянии, чтобы увеличить изображение в этой маске, но это масштабирование всего изображения.

Предложите мне способ достичь этого, я создаю приложение для создания коллажа.

collage

Синий цвет фона макета.

белого цвета для маски

Я могу достичь этого типа макета с маскировкой, но когда я применяю MultiTouchListener масштабирования и масштабирование, он будет масштабировать изображение целиком с маской, а не изображение внутри Это.

private void getMaskedBitmap() { 

    Bitmap bgBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.background_drawable); 
    ImageView bg = (ImageView) findViewById(R.id.bg); 
    bg.setImageBitmap(bgBitmap); 

    Bitmap.Config conf = Bitmap.Config.ARGB_8888; 
    Bitmap emptyBitmap = Bitmap.createBitmap(bgBitmap.getWidth(), bgBitmap.getHeight(), conf); 
    Canvas canvasBmp = new Canvas(bgBitmap); 


    ImageView mImageView = (ImageView) findViewById(R.id.troll_face); 

    Bitmap original = BitmapFactory.decodeResource(getResources(), R.drawable.random_drawable); 

    Bitmap mask = BitmapFactory.decodeResource(getResources(), R.drawable.mask_drawable); 

    original = Bitmap.createScaledBitmap(original, mask.getWidth(), mask.getHeight(), true); 

    Bitmap result = Bitmap.createBitmap(mask.getWidth(), mask.getHeight(), Config.ARGB_8888); 

    Canvas mCanvas = new Canvas(result); 
    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); 
    mCanvas.drawBitmap(original, 0, 0, null); 
    mCanvas.drawBitmap(mask, 0, 0, paint); 
    paint.setXfermode(null); 

    mImageView.setImageBitmap(result); 
    //mImageView.setScaleType(ScaleType.FIT_XY); 
    mImageView.setBackgroundResource(R.drawable.background_drawable); 

    bg.setOnTouchListener(new MultiTouchListener()); 

    mImageView.invalidate(); 


} 

Исключение на линии

Холст canvasBmp = новый холст (bgBitmap);

java.lang.IllegalStateException: Неизменный растровый передается Canvas конструктор

+0

пут emptyBitmap в холст вместо bgBitmap. Как Canvas canvasBmp = new Canvas (emptyBitmap); – Androider

+0

@pokerface Мне нужно создать пользовательский вид только в MainActivity? – SkyWalker

+0

ваш код выглядит не очень хорошо. Как вы можете использовать canvasBmp вместо mCanvas – Androider

ответ

1

Я не могу предоставить вам код, но вот то, что вы должны сделать:

  1. Получить фоновое изображение в виде растрового изображения и нарисуйте его на холсте вида.

  2. Создайте новый (пустой) растровый файл того же размера (используйте Bitmap.Config.ARGB_8888) и получите его холст, здесь вы нарисуете маску.

    Canvas canvasBmp = new Canvas (bmp);

  3. Теперь нарисуйте bmp на холсте. Итак, вы можете получить эффект маски на изображении.

  4. Zoom (re-size и т. Д. Независимо от того, что вы хотите) растровое изображение фона.

  5. Invalidate Ваш взгляд, и выполните все шаги снова

+0

Маскирующее изображение содержит прозрачность, так что я могу изменить цвет фона. Таким образом, фоновое изображение отсутствует. – SkyWalker

+0

Синий цветное изображение не фон? И создавая изображение с конфигурацией ARGB_8888, вы можете достичь прозрачности. – Androider

+0

Если вы используете синий фон в качестве фона представления, попробуйте не делать этого. Вместо этого нарисуйте его на холсте вида. – Androider