2011-12-25 8 views
30

初心者の質問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 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(); 
+0

これは私をここにポイントする良い方法でした!これは分かりませんが、ちょっと見て回りましょう。 – Shaunak

+2

これはちょうど私を救ったので、受け入れられた答えとしてこれを入れなければなりません! – DeeV

+0

与えられた答えは元の質問に答えていない、私はまだレイヤーリストxmlを使用してマスクレイヤーを宣言できるかどうか疑問に思っています –

答えて

-3

.pngファイルはアルファチャンネルを持つことができ、全体ImageViewのを置き換えるために、コードを使用して私の目標を達成した瞬間にあなたがそれらを作成するときに含まアンドロイドはこれを使ってあなたが説明したように画像を分離することができます。

GIMPまたはPhotoshopなどの追加のチャンネルを作成するか、使用する画像エディタを使用します。これはモノクロのチャンネル(白から黒の256色)です。マスクするセクションを選択します。OUTアルファチャンネルをクリックし、選択エリアを黒で塗りつぶします。選択範囲を反転し、まだアルファチャンネルに置き、白で塗りつぶします。 .pngファイルを保存し、アルファ(効果的に32ビット)で24ビットとしてエクスポートします。ファイルが正しくレンダリングされるはずです。

+4

アルファチャンネルイメージを作成するのは簡単ですが、マスクとして –

+1

@エリクそれは方法で質問ではありません:D –

7

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

    } 
+0

リンク404エラー.. –

関連する問題