ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Drawable & mutate
    과거...../개발일지 2011. 1. 20. 10:15


    오늘은 모에 대해 작성해 볼까..생각하는 도중...drawable에 대해 고민하던 일이 생각나서 몇 글자 끄적끄적 거린다!
    먼저 코드부터 작성한 후 설명을~

    TestDrawableMain.java
     
    package com.park.testdrawable;
    
    import android.app.Activity;
    import android.content.pm.ApplicationInfo;
    import android.content.pm.PackageManager;
    import android.content.pm.PackageManager.NameNotFoundException;
    import android.graphics.PorterDuff.Mode;
    import android.graphics.drawable.Drawable;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.TextView;
    
    public class TestDrawableMain extends Activity {
        /** Called when the activity is first created. */
    	
    	private Button button01;
    	private TextView textView01,textView02,textView03,textView04;
    	
    	
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
            
            button01 = (Button)findViewById(R.id.Button01);
            textView01 = (TextView)findViewById(R.id.TextView01);
            textView02 = (TextView)findViewById(R.id.TextView02);
            textView03 = (TextView)findViewById(R.id.TextView03);
            textView04 = (TextView)findViewById(R.id.TextView04);
            
            init();
            
            
            button01.setOnClickListener(new OnClickListener() {
    			@Override
    			public void onClick(View arg0) {
    				
    				
    
    				
    			}
    		});
            
        }
    
    
    	private void init() {
    		
    		
    		PackageManager manager = getPackageManager();
    		int red = 0x88FF0000; 
    		int green = 0x7700FF00; 
    		int blue = 0x880000FF;
    		int nu = 0x00000000;
    		//ApplicationInfo applicationinfo = manager.getApplicationInfo("com.google.android.voicesearch", PackageManager.GET_META_DATA);
    		 Drawable drawable;
    		try {
    			drawable = manager.getApplicationIcon("com.google.android.voicesearch");			
    			drawable.setColorFilter(red, Mode.SRC_ATOP);
    			textView01.setCompoundDrawablesWithIntrinsicBounds(null, drawable, null, null);
    			drawable.setColorFilter(green, Mode.SRC_ATOP);
    			textView02.setCompoundDrawablesWithIntrinsicBounds(null, drawable, null, null);
    			drawable.setColorFilter(blue, Mode.SRC_ATOP);
    			textView03.setCompoundDrawablesWithIntrinsicBounds(null, drawable, null, null);
    			drawable.setColorFilter(nu, Mode.SRC_ATOP);
    			textView04.setCompoundDrawablesWithIntrinsicBounds(null, manager.getApplicationIcon("com.google.android.voicesearch"), null, null);
    		} catch (NameNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    	}
            
    }
    --main.xml--
     
    
    
    	
    
    
    	
    	
    	
    	
    	
    
    
    

    특별한 내용은 없다. 코드로 보면 안드로이드 내부 어플리케이션인 voicesearch의 아이콘을 가져와서 칼라필터를 적용시켜
    각각의 textview의 아이콘들을 변경해주는 코드이다.

    하지만 테스트 해보면 무엇인가 이상하다는 생각을 할 것이다.!
    int a=1;
    System.out.print(a);
    a++;
    System.out.print(a);
    a++;
    출력값은 1 2  <--이런식으로 출력되는 것이 맞지만 위의 코드를 돌려보면 drawable에 상태를 중간 중간 변경해서 적용했는데도
    불구하고 모든 textview에 적용된 아이콘들의 상태가 일괄적이다는 것!!!

    그래서 몇시간 삽질하다가 검색한 결과!!!
    안드로이드는 최적화를 위해서 drawable은 내부에서 같은 상수값을 공유한다는 것!!

    위의 코드에서 각각의 textview에 drawable 상태값을 다르게 주려면
    각각의drawable 인스턴스를 생성한후 mutate() 함수를 호출해서 적용해주어야 된다.




Designed by Tistory.