Android - 是不是可以直接在层列表 XML 定义中声明 alpha 掩码?

Posted

技术标签:

【中文标题】Android - 是不是可以直接在层列表 XML 定义中声明 alpha 掩码?【英文标题】:Android - Is it possible to declare an alpha mask directly within layer-list XML definition?Android - 是否可以直接在层列表 XML 定义中声明 alpha 掩码? 【发布时间】:2012-01-27 15:47:49 【问题描述】:

一个新手问题

我有这个 layers.xml 用作 ImageView 的源。 还有两张图片,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
 android:id="@+id/img_B"
 android:layout_
 android:layout_
 android:src="@drawable/layers"/>

目前输出只是图像上的 png。 我希望 png 充当蒙版,使用 png alpha 通道剪切图像,如下所示:

这可能直接在 xml 中,还是我必须通过代码来完成?

感谢您的建议;)

更新: 目前我使用代码替换整个 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();

【问题讨论】:

这是将我指向这里的好方法!不确定,但让我看看四周,然后再回复你。 您必须将此作为可接受的答案,因为这救了我! 给定的答案没有回答原始问题,我仍然想知道是否可以使用 layer-list xml 声明遮罩层 【参考方案1】:

把你的蒙版图片放到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://***.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://***.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;
    

  

【讨论】:

【参考方案2】:

.png 文件可以在您创建它们时包含一个 Alpha 通道,Android 可以按照您的说明使用它来隔离图像。

在 GIMP 或 Photoshop 或您使用的任何图像编辑器中创建一个额外的通道。这将是一个单色通道(256 种白色到黑色)。选择要屏蔽的部分 OUT 单击 alpha 通道并用黑色填充选择区域。反转选择,仍然在 Alpha 通道中,并用白色填充它。将 .png 文件保存并导出为 24 位,带 alpha(实际上是 32 位)。您的文件应该正确呈现。

【讨论】:

创建一个alpha通道图像很容易,我问的是如何使用这个alpha通道作为蒙版 @Erik 顺便说一句,这不是一个问题:D

以上是关于Android - 是不是可以直接在层列表 XML 定义中声明 alpha 掩码?的主要内容,如果未能解决你的问题,请参考以下文章

android 中如何设置Spinner点击后弹出的下拉列表的宽度样式

是否可以减少android中的页面数量?

Android XML:设备更改时布局行更改

Android 是不是可以在 XML 文件中定义地图?

在 android 中直接使用 XMPP - XEP xml 请求

Android Xml 视图参考