Android - est-il possible de déclarer un masque alpha directement dans la définition XML de layer-list?

Un newbie question

j'ai ces couches.xml que j'utilise comme source pour une ImageView. Et deux images, masque.png et image.jpg

Couches

.xml:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <bitmap  android:src="@drawable/image" android:gravity="center"/>
    </item>
    <item>
        <bitmap  android:src="@drawable/mask" android:gravity="center"/>
    </item>
</layer-list>

ImageView:

<ImageView
 android:id="@+id/img_B"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:src="@drawable/layers"/>

au moment où la sortie est juste le png au-dessus de l'image. Je voudrais que le png agisse comme un masque, découpant l'image en utilisant le canal alpha png comme ça: enter image description here

Est-ce possible directement dans le xml, ou dois-je le faire par code?

Merci pour vos conseils ;)

mise à jour: au moment où j'ai atteint mon objectif en utilisant le code pour remplacer tout ImageView

ImageView img = (ImageView) findViewById(imgID);

Canvas canvas = new Canvas();
Bitmap mainImage = BitmapFactory.decodeResource(getResources(), R.drawable.img);
Bitmap mask = BitmapFactory.decodeResource(getResources(), R.drawable.mask);
Bitmap result = Bitmap.createBitmap(mainImage.getWidth(), mainImage.getHeight(), Bitmap.Config.ARGB_8888);

canvas.setBitmap(result);
Paint paint = new Paint();
paint.setFilterBitmap(false);

canvas.drawBitmap(mainImage, 0, 0, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
canvas.drawBitmap(mask, 0, 0, paint);
paint.setXfermode(null);

img.setImageBitmap(result);
img.invalidate();
30
demandé sur JJD 2011-12-25 20:06:43

2 réponses

Placez votre image de masque dans le dossier drawable-nodpi.

sinon, la mise à l'échelle sera erronée.

voici un exemple de code d'une application. Après la caméra, il ajoute un masque.

public void onActivityResult(int requestCode, int resultCode, Intent data)
  {
  if (requestCode == REQUEST_IMAGE_CAPTURE) // && resultCode == RESULT_OK )
    {

    try
      {
      Bitmap cameraBmp = MediaStore.Images.Media.getBitmap(
          State.mainActivity.getContentResolver(),
          Uri.fromFile(Utils.tempFileForAnImage())
                                );

      cameraBmp = ThumbnailUtils.extractThumbnail(cameraBmp, 256, 256);

      Matrix m = new Matrix();
      m.postRotate(Utils.neededRotation(Utils.tempFileForAnImage()));
      // NOTE incredibly useful trick for cropping/resizing square
      // http://stackoverflow.com/a/17733530/294884

      cameraBmp = Bitmap.createBitmap(cameraBmp,
          0, 0, cameraBmp.getWidth(), cameraBmp.getHeight(),
          m, true);


      // so, cameraBmp is now a Bitmap.  Let's add the mask!!
      // see Shiomi Schwartz's original!! /q/android-is-it-possible-to-declare-an-alpha-mask-directly-within-layer-list-xml-definition-43988/"baos" ... we want PNG in this case ..
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      result.compress(Bitmap.CompressFormat.PNG, 0, baos);

      imageBytesRESULT = baos.toByteArray();
      // typically you want the result as image bytes, example to send to Parse

      } catch (FileNotFoundException e)
      {
      e.printStackTrace();
      } catch (IOException e)
      {
      e.printStackTrace();
      }

    return;
    }

  }
7
répondu Fattie 2018-02-16 10:47:32

.png fichiers peuvent avoir un canal alpha inclus lorsque vous les créez et Android pouvez l'utiliser pour isoler l'image comme vous l'expliquez.

créez un canal supplémentaire dans GIMP ou Photoshop ou n'importe quel éditeur d'image que vous utilisez. Ce sera un canal monochrome (256 teintes de blanc à noir). Faites une sélection de la section que vous voulez masquer cliquez sur le canal alpha et remplissez la zone de sélection avec du noir. Inverser la sélection, toujours dans le canal alpha, et remplir avec la couleur blanche. Enregistrez et exportez le fichier .png en 24 bits avec alpha (en fait 32 bits). Votre fichier doit être rendu correctement.

-3
répondu Solone 2014-06-02 09:29:37