Android2012. 1. 13. 14:43

[목표]


- 메인 액티비티에서 투명 액티비티를 띄운다.

- 투명 액티비티에 버튼을 하나 넣고, 터치하면 간단하게 Toast 메시지를 띄운다.
- 버튼 이외의 투명 공간을 터치하면, 투명 액티비티를 종료한다.



[투명 액티비티를 위한 style 만들기]


/res/values/style.xml 파일을 생성해서, 아래의 코드를 삽입한다.

name으로 지정한, "Theme.Transparent"는 투명 액티비티를 생성할 때, AndroidManifest.xml에서 사용될 이름이다.

<resources>
    <style name="Theme.Transparent" parent="android:Theme">
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:colorBackgroundCacheHint">@null</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowAnimationStyle">@android:style/Animation</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:backgroundDimEnabled">true</item>
    </style>
</resources>

Line 09 : "<item name="android:backgroundDimEnabled">true</item>" 설정은 투명 액티비티의 빈공간의 Dim(어둑한) 처리 여부를 지정한다. true일 경우, 빈 공간이 약간 어두운 톤으로 채워진다. false일 경우 깔끔하게 투명처리된다.


[정의한 투명 Theme, 액티비티에 적용하기]

이제, 아래와 같이 AndroidManifest.xml에 투명액티비티를 새로 정의한다.

<application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        ...
        <activity
            android:label="@string/app_name"
            android:name=".TransparentActivity"
            android:theme="@style/Theme.Transparent">
        </activity>
</application>
Line 08 : 위에서 정의한 style(theme)를 적용한다.

안드로이드에서 제공하는 투명 윈도우 테마를 사용할 수도 있는데,
8번 라인을 아래 코드로 대체하면 되지만, 세밀한 설정을 위해서라면 사용자가 직접 정의해서 사용해야 한다.
android:theme="@android:style/Theme.Translucent.NoTitleBar"


[투명 액티비티 구현하기]

이제, 투명 액티비티 클래스를 만든다.



public class TransparentActivity extends Activity implements OnClickListener {

	private int mDeviceScreenWidth;
	private int mDeviceScreenHeight;
		
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.transparent_activity);
		
		Display display = ((WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
		mDeviceScreenWidth = display.getWidth();
		mDeviceScreenHeight = display.getHeight();
		
		ImageButton btnAuth = (ImageButton) findViewById(R.id.imgbtn_do_sth);
		btnAuth.setOnClickListener(this);
	}
	
	@Override
	public void onClick(View v) {
		int id = v.getId();
		switch (id) {
		case R.id.imgbtn_do_sth:
			Toast.makeText(this, "Button Clicked!!!!", Toast.LENGTH_SHORT).show();
			break;
		default:
			break;
		}
	}
	
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		if (event.getAction() == MotionEvent.ACTION_DOWN) {
        	
			int x = (int)event.getX();
			int y = (int)event.getY();
        	
        	Bitmap bitmapScreen = Bitmap.createBitmap(mDeviceScreenWidth, mDeviceScreenHeight, Bitmap.Config.ARGB_8888);
        	
        	if(x < 0 || y < 0)
        		return false;
        	
        	int ARGB = bitmapScreen.getPixel(x, y);

        	if(Color.alpha(ARGB) == 0) {
        		finish();
        	}

            return true;
        }
        return false;
	}
}

Line 12,13 : 디바이스의 화면 크기를 미리 기억해둔다.
Line 24 : 버튼을 클릭하면 간단히 Toast 메시지를 띄운다.
Line 32 : 버튼을 제외한 투명한 공간을 터치했을 때의 동작을 정의한다. 터치한 위치의 RGB값이 투명한 경우 Activity를 종료(finish())한다.


[다운로드]
    전체코드


[참고자료(이미지)]
 http://trac.pcbsd.org/browser/pcbsd/branches/7.1/system-overlay/PCBSD/local/kde4/share/apps/ksplash/Themes/Galileo/600x400/background.png?rev=3811

http://www.iconarchive.com/show/blawb-icons-by-arrioch/android-icon.html



Posted by 데브로망스