2011-12-25 3 views
30

새내기 질문안드로이드 - 레이어 목록 XML 정의 내에서 알파 마스크를 직접 선언 할 수 있습니까?

ImageView의 소스로 사용하는 layers.xml이 있습니다. 그리고 두 개의 이미지, 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> 

이미지 뷰 : 출력 이미지를 통해 바로 PNG입니다 순간

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

. 나는 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 파일이 당신이 그들을 만들 때 알파 채널이 포함되어있을 수 있습니다 전체 이미지 뷰를 대체하는 코드를 사용하여 내 목표를 달성 순간 안드로이드는 당신이 설명하는대로 그것을 사용하여 이미지를 고립시킬 수 있습니다.

김프 또는 포토샵 또는 사용하는 이미지 편집기에서 추가 채널을 만드십시오. 흑백 채널 (흰색에서 검은 색 256 가지 음영)입니다. 마스크 할 섹션을 선택하십시오. OUT 알파 채널을 클릭하고 선택 영역을 검은 색으로 채 웁니다. 알파 채널에서 선택 영역을 뒤집은 다음 흰색으로 채 웁니다. .png 파일을 저장하고 24 비트로 알파 (사실상 32 비트)로 내 보냅니다. 파일이 올바르게 렌더링되어야합니다.

+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 오류 .. –