web-dev-qa-db-ja.com

Android-レイヤーリストXML定義内で直接アルファマスクを宣言することは可能ですか?

初心者の質問

ImageViewのソースとして使用するこのlayers.xmlがあります。そして2つの画像、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アルファチャネルを使用して画像をクリッピングします。 enter image description here

それは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();
31
Shlomi Schwartz

マスク画像を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;
    }

  }
7
Fattie