2011-12-25 25 views
30

Câu hỏi mới cho người mớiAndroid - Có thể tuyên bố mặt nạ alpha trực tiếp trong định nghĩa XML danh sách lớp không?

Tôi có layer.xml này mà tôi sử dụng làm nguồn cho ImageView. Và hai hình ảnh, mask.png và 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"/> 

Tại thời điểm đầu ra chỉ là png lên ảnh. Tôi muốn các png để hoạt động như một chiếc mặt nạ, cắt hình ảnh bằng cách sử dụng kênh alpha png như vậy: enter image description here

Là có thể trực tiếp trong xml, hoặc tôi phải làm điều đó bằng cách mã?

Cảm ơn lời khuyên của bạn;)

update: tại thời điểm tôi đạt được mục tiêu của tôi sử dụng mã để thay thế toàn bộ 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

đó là cách hay để chỉ cho tôi ở đây! Không chắc chắn về điều này, nhưng hãy để tôi nhìn xung quanh một chút và lấy lại cho bạn. – Shaunak

+2

Bạn phải đặt câu trả lời này là một câu trả lời được chấp nhận vì điều này vừa mới cứu tôi! – DeeV

+0

Câu trả lời cho trước không trả lời được câu hỏi ban đầu, tôi vẫn tự hỏi liệu một lớp mặt nạ có thể được khai báo bằng cách sử dụng danh sách lớp xml –

Trả lời

-3

.png tập tin có thể có một kênh alpha bao gồm khi bạn tạo ra chúng và Android có thể sử dụng nó để cô lập hình ảnh khi bạn giải thích.

Tạo kênh phụ trong GIMP hoặc Photoshop hoặc bất kỳ trình chỉnh sửa hình ảnh nào bạn sử dụng. Đây sẽ là một kênh đơn sắc (256 sắc thái từ trắng đến đen). Thực hiện lựa chọn phần bạn muốn che dấu OUT, nhấp vào kênh alpha và tô màu vùng chọn bằng màu đen. Đảo ngược vùng chọn, vẫn ở trong kênh alpha và tô nó bằng màu trắng. Lưu và xuất .png tệp dưới dạng bit 24 bit với alpha (hiệu quả 32 bit). Tệp của bạn sẽ hiển thị chính xác.

+4

hay không dễ dàng để tạo hình ảnh kênh alpha, tôi đã hỏi về cách sử dụng kênh alpha này như một mặt nạ –

+1

@Erik Nó không phải là một câu hỏi bằng cách: D –

7

Đặt hình ảnh mặt nạ của bạn trong thư mục drawable-nodpi.

Nếu không, việc chia tỷ lệ sẽ sai.

Dưới đây là một số mã ví dụ từ một ứng dụng. Sau khi máy ảnh nó thêm một mặt nạ.

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

lỗi 404 liên kết .. –

Các vấn đề liên quan