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:
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();
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;
}
}
.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.