Android – 是否有可能直接在层列表XML定义内声明一个alpha蒙版?

一个新手问题

我有这个我用作ImageView的源的layers.xml。 和两个图像,mask.png和image.jpg

layers.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"/> 

目前的输出只是图像上的png。 我想PNG作为一个面具,使用png alpha通道剪辑图像,如下所示: 在这里输入图像说明

这是可能的直接在XML中,或者我必须做的代码?

谢谢你的build议 ;)

更新:目前我已经实现了使用代码replace整个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(); 

Solutions Collecting From Web of "Android – 是否有可能直接在层列表XML定义内声明一个alpha蒙版?"

把你的蒙版图像放在文件夹drawable-nodpi中。

否则,缩放将是错误的。

以下是应用程序中的一些示例代码。 照相机后,它添加一个面具。

 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!! http://stackoverflow.com/questions/8630365 Bitmap mask = BitmapFactory.decodeResource( getResources(), R.drawable.mask_android_256); // NOTE THE MASK ** MUST ** BE IN YOUR nodpi folder Bitmap result = Bitmap.createBitmap( 256,256, Bitmap.Config.ARGB_8888); Canvas cc = new Canvas(); cc.setBitmap(result); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); cc.drawBitmap(cameraBmp, 0, 0, null); cc.drawBitmap(mask, 0,0, paint); // so, cameraBmp is now a Bitmap but it has been masked yourImageViewForTheUser.setImageBitmap(result); // make a "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; } } 

非常方便的参考图像: http : //www.piwai.info/transparent-jpegs-done-right/

.png文件在创build时可以包含一个alpha通道,Android可以使用它来隔离图像。

在GIMP或Photoshop或任何图像编辑器中创build一个额外的频道。 这将是一个单色通道(白色到黑色的256个阴影)。 select你想要遮盖的部分OUT点击Alpha通道,并用黑色填充select区域。 反转select,仍在alpha通道中,并填充白色。 保存并导出.png文件为24位,使用alpha(实际上是32位)。 你的文件应该正确渲染。