2011-12-25 137 views
30

一個新手問題Android - 是否可以直接在層列表XML定義中聲明alpha遮罩?

我有這個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:

<ImageView 
android:id="@+id/img_B" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:src="@drawable/layers"/> 

目前的產量僅僅是PNG在圖像上。 我想PNG作爲掩模,使用PNG alpha通道像這樣剪取的圖像: 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(); 
+0

這是一個很好的方式指向我在這裏!不確定這一點,但讓我環顧一下並回復你。 – Shaunak

+2

你必須把這作爲一個接受的答案,因爲這只是救了我! – DeeV

+0

給定的答案不回答原來的問題,我仍然想知道是否可以使用圖層列表xml –

回答

-3

.png文件可以在創建時會包含一個alpha通道實現了目標的那一刻Android可以使用它來隔離圖像。

在GIMP或Photoshop或任何您使用的圖像編輯器中創建額外的頻道。這將是一個單色通道(白色到黑色256個陰影)。選擇你想要遮蔽的部分OUT點擊alpha通道並用黑色填充選擇區域。反轉選擇,仍在alpha通道中,並用白色填充。使用alpha(有效32位)保存並導出.png文件爲24位。你的文件應該正確渲染。

+4

來聲明遮罩層,很容易創建一個Alpha通道圖像,我問的是如何使用這個alpha通道作爲面具 –

+1

@Erik它不是一個問題的方式: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錯誤.. –