이미지 효과로 이미지 크기의 절반을 반대 되는 이미지를 만들고,
그 반대된 이미지에 대해서는 반사 된 듯한 효과를 주는 소스 입니다.


package com.android.reflection2;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuffXfermode;
import android.graphics.Bitmap.Config;
import android.graphics.PorterDuff.Mode;
import android.graphics.Shader.TileMode;
import android.os.Bundle;
import android.widget.ImageView;

public class Reflection extends Activity {
	/** Called when the activity is first created. */

	ImageView view1;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		view1 = (ImageView) findViewById(R.id.ImageView01);

		Bitmap bitmapOriginal = BitmapFactory.decodeResource(getResources(),
				R.drawable.android);

		int nWidth = bitmapOriginal.getWidth();
		int nHeight = bitmapOriginal.getHeight();

		Matrix matrix = new Matrix();
		matrix.preScale(1, -1);

		Bitmap bitmapReflection = Bitmap.createBitmap(bitmapOriginal, 0,
				nHeight / 2, nWidth, nHeight / 2, matrix, false);

		Bitmap bitmapOrigianlAndReflection = Bitmap.createBitmap(nWidth,
				(nHeight + nHeight / 2), Config.ARGB_8888);

		Canvas canvas = new Canvas(bitmapOrigianlAndReflection);
		canvas.drawBitmap(bitmapOriginal, 0, 0, null);
		Paint deafaultPaint = new Paint();
		canvas.drawRect(0, nHeight, nWidth, nHeight + 5, deafaultPaint);
		canvas.drawBitmap(bitmapReflection, 0, nHeight + 5, null);

		Paint paint = new Paint();
		LinearGradient shader = new LinearGradient(0, bitmapOriginal
				.getHeight(), 0, bitmapOrigianlAndReflection.getHeight() + 5,
				0x70ffffff, 0x00ffffff, TileMode.CLAMP);
		paint.setShader(shader);
		paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
		canvas.drawRect(0, nHeight, nWidth, bitmapOrigianlAndReflection
				.getHeight() + 5, paint);

		view1.setImageBitmap(bitmapOrigianlAndReflection);
	}
}

결과 화면은 이런 식으로 나옵니다.



안드로이드에서 이미지 효과를 주는 방법으로 상하/좌우 반전 이미지를 만드는 방법에 대해서 설명해 보겠습니다.
처음에는 이런 효과를 만들 대... Image Processing을 해야 하는거 아닌지 고민을 하게 되었었는데.
친절하게도.. 안드로이드 SDK에 이런 효과를 주는 기능이 있었습니다.
찾아보면...다 나오더군요 ㅎㅎ

Matrix matrix = new Matrix();


이 클래스를 이요하여 효과를 주면 되겠습니다.

코드는.

//원본 이미지 Bitmap
Bitmap originalImg = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
//좌우반전 이미지 효과 및 Bitmap 만들기
Matrix sideInversion = new Matrix();
sideInversion.setScale(-1, 1);
Bitmap sideInversionImg = Bitmap.createBitmap(originalImg, 0, 0,
	originalImg.getWidth(), originalImg.getHeight(), sideInversion, false);

//상하반전 이미지 효과 및 Bitmap 만들기
Matrix updownInversion = new Matrix();
updownInversion.setScale(1, -1);
Bitmap updownInversionImg = Bitmap.createBitmap(originalImg, 0, 0,
	originalImg.getWidth(), originalImg.getHeight(), updownInversion, false);
		
imageView1.setImageBitmap(originalImg);
imageView2.setImageBitmap(sideInversionImg);
imageView3.setImageBitmap(updownInversionImg);

이렇게 하면 됩니다.
이걸 포스트를 만들다 보니... 안드로이드 Bitmap에 대해서 써야 하는거 아닌지 하는 생각이 들기도 하는구요.
이런식으로 했을 경우 결과 화면은

이런 결과 화면이 보이게 됩니다.
예제 소스도 첨부 합니다
참고하시기 바랍니다. :)


안드로이드에서 레이아웃을 만들 때 반투명 효과를 줄 필요가 있지요.
이미지에 alpha값을 넣어서는 그것을 backgound로 넣어서는 효과를 줄 수도 있지만,
Paint클래스에 있는 setAlpha라는 메소드를 이용해서 alpha값을 넣어서 반투명 효과를 줄 수가 있습니다.
레이아웃이나 다른 여러가지에도 반투명 효과는 동일하게 주어질 수 있는 것이죠.

방법은

Paint paint = new Paint();
paint.setColor(Color.Black);
paint.setAlpha(50);

이런식으로 객체를 만들어서 이것을 배경으로 사용하시면 됩니다.

결과 화면은

이런 화면이 만들어지게 됩니다.



안드로에드에서 버튼에 대한 효과를 주는 방법이 있습니다.
ImageButton에 효과를 주는 방법인데... 구글 안드로이드 개발 사이트에서도 명시 되어 있습니다.
그런데 보면서 좀... 혼라?? 스러웠다고 해야 할까요... 그래서 좀 정리를 해볼려고 합니다.

To indicate the different button states (focused, selected, etc.), you can define a different image for each state. E.g., a blue image by default, an orange one for when focused, and a yellow one for when pressed. An easy way to do this is with an XML drawable "selector."

영어는 잘 못하지만.. 대충 내용은 focused, selected, normal 상태의 버튼을 정의하고 싶으면 xml에다 selector라는 것을 사용해서 미리 정의라하는... 그런 내용이죠... 버튼 색상이 나오는데... 그것에 대한 내용은 
이 두 곳에 가시면 설명을 볼 수 있습니다.

그리고는 설명에서는 이렇게 xml을 정의하라고 나옵니다.
      
                
                
            

그리고는 res/drawable/ 폴더에다가 만들어서 사용하라는 내용은 있는데... 저의 짧은 지식으로는 정확하게 이해하기가 힘들더군요... 

예전에는 안드로이드 개발할 때 /res 밑에 drawable 폴더가 1개밖에 없었던 기억이 있었는데... 지금은 기본 프로젝트를 생성해도 /res 밑에 drawable 폴더가 "/res/drawable-hdpi", "/res/drawable-mdpi", "/res/drawable-ldpi" 이렇게 3개가 존재합니다. 구글 document에서는 /res/drawable/ 에다가 xml을 만들라고 합니다...
그럼 그렇게 하면 됩니다... ㅜㅜ/// 정말 말 그대로 하면 되는데... 괜히 /res/drawable-hdpi... mdpi... ldpi... 이런데다가 만들어봐서 했는데 안되더군요 ㅋㅋ

그림에서 보는 것 처럼.. /res/drawable/ 폴더를 만들고 그 곳에 원하는 xml파일을 만듭니다... 예를 들어서 
"play_button.xml"이라는 파을을 만들고 안의 내용을
      
                
                
            

이렇게 안의 내용을 정의 해 두고...
play_button_pressed와 play_button_focused.. 그리고 play_button_normal은... drawable-hdpi, mdpi, ldpi에 paly_button_pressed.png, play_button_focused.png, play_button_noraml.png 로 된 이미지 파일이 있어야 합니다. 

그런 다음에... Layout에서 ImageButton을 만들고 그곳에서 ImageButton의 property의 "Background"에다가
@drawable/play_button 이라고 입력하면 끝납니다.

이 방법때문에... 좀 힘들게 진행했네요... 어떻게 보면...정말 간단한건데...

이젠... 이생각이 듭니다... 그럼 ImageButton마다 일일이 이런 xml을 파일을 만들어 줘야 하는건지... 그럼 하나의 Activity안에 ImageButton이 10개면... 버튼 10개에 대한 xml을 따로 만들어 줘야 하는건지... ㅎㅎ
더 쉽게 하는 방법이 있는지 찾아 봐야 겠습니다... ㅜㅜ///
허접한 설명이였습니다 ㅎ



음악을 스트리밍 하다가..볼륨을 조절 할 일이 생기게 되었을 경우.
안드로이드에 볼륨 조절하는 버튼이 있지만...
스트리밍 중에 화면에서 SeekBar를 통해서 조절을 하는 방법도 있다.
AudioManager 클래스에 있는 메소드를 이용하면 가능.

1. 볼륨 조절 버튼으로 조절 하기.

public boolean onKeyDown(int keyCode, KeyEvent event) {                  
        AudioManager mAudioManager = 
            (AudioManager)getSystemService(AUDIO_SERVICE);
        switch (keyCode) {
        case KeyEvent.KEYCODE_VOLUME_UP :
            mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,
                                             AudioManager.ADJUST_RAISE, 
                                             AudioManager.FLAG_SHOW_UI);
                return true;
        case KeyEvent.KEYCODE_VOLUME_DOWN:
            mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, 
                                             AudioManager.ADJUST_LOWER, 
                                             AudioManager.FLAG_SHOW_UI);
                return true;
        case KeyEvent.KEYCODE_BACK:
            return true;
        }

        return false;
   }

    public boolean onKeyUp(int keyCode, KeyEvent event) {
        AudioManager mAudioManager = 
           (AudioManager)getSystemService(AUDIO_SERVICE);
        switch (keyCode) {
        case KeyEvent.KEYCODE_VOLUME_UP :
            mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, 
                                             AudioManager.ADJUST_SAME, 
                                             AudioManager.FLAG_SHOW_UI);
                return true;
        case KeyEvent.KEYCODE_VOLUME_DOWN:
            mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, 
                                             AudioManager.ADJUST_SAME, 
                                             AudioManager.FLAG_SHOW_UI);
                return true;
        case KeyEvent.KEYCODE_BACK:
            this.finish();
            return true;
        }
        return false;
    }
2. 화면에서 SeekBar를 통해서 조절하기
seekVolumn = (SeekBar) findViewById(R.id.SeekBar_Volumn);
		final AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
		int nMax = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
		int nCurrentVolumn = audioManager
				.getStreamVolume(AudioManager.STREAM_MUSIC);

		seekVolumn.setMax(nMax);
		seekVolumn.setProgress(nCurrentVolumn);

		seekVolumn.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

			@Override
			public void onStopTrackingTouch(SeekBar seekBar) {
				// TODO Auto-generated method stub

			}

			@Override
			public void onStartTrackingTouch(SeekBar seekBar) {
				// TODO Auto-generated method stub

			}

			@Override
			public void onProgressChanged(SeekBar seekBar, int progress,
					boolean fromUser) {
				// TODO Auto-generated method stub
				audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,
						progress, 0);
			}
		});


http에 request를 보냈는데.. 서버에서 url주소를 redirect해서 보내주는 경우가 있지요. 그럼 개발자가 입력한 주소로는
요청이 안되는 경우가 생깁니다. 이걸 해결하기위해서는 javaj에서 redirect된 주소로 다시 요청을 해줘야 합니다.
방법은

private InputStream openConnectionCheckRedirects(URLConnection c) throws IOException 
{
   boolean redir;
   int redirects = 0;
   InputStream in = null;
   do 
   {
      if (c instanceof HttpURLConnection) 
      {
         ((HttpURLConnection) c).setInstanceFollowRedirects(false);
      }
      in = c.getInputStream(); 
      redir = false; 
      if (c instanceof HttpURLConnection) 
      {
         HttpURLConnection http = (HttpURLConnection) c;
         int stat = http.getResponseCode();
         if (stat >= 300 && stat <= 307 && stat != 306 &&
            stat != HttpURLConnection.HTTP_NOT_MODIFIED) 
         {
            URL base = http.getURL();
            String loc = http.getHeaderField("Location");
            URL target = null;
            if (loc != null) 
            {
               target = new URL(base, loc);
            }
            http.disconnect();
            if (target == null || !(target.getProtocol().equals("http")
               || target.getProtocol().equals("https"))
               || redirects >= 5)
            {
               throw new SecurityException("illegal URL redirect");
            }
            redir = true;
            c = target.openConnection();
            redirects++;
         }
      }
   } 
   while (redir);
   return in;
}

public void makeConnection(URL url){
   URLConnection conn = url.openConnection();
   InputStream is = openConnectionCheckRedirects(conn);

   /* request에 대한 결과 처리 부분*/

   is.close();
}

이런식으로 하면 되겠습니다. 서버에서 제공하는 api가 redirect된 주소로 해서 보내주는 경우가 많기에... 이 방법을 써서 해결하게 되었습니다.






안드포이드 어플 안에서 키보드를 보이게 할 때와 보이지 않게 할 때가 있습니다.
간단히 검색을 하기 위헤서 EditText에 글자를 입력하고 Enter를 입력하고 나서는 바로 키보드가 보이지 않게 한다던지 할때... 없애주면 좋겠지요... 그렇게 하기 위해서는 아래와 같은 방법으로 하게 되면 됩니다.

키보드 보이게 하기

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
imm.showSoftInput(editText, 0);


키보드 숨기기
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0); 






안드로이드도 아이폰처럼 기기를 옆으로 돌렸을 때 화면이 따라 회전하는 기능을 갖고 있습니다. 어떨 때 보면 좋은 기능이기도 하지만, 어떨 때에는 필요치 않는 기능이기도 합니다. 세로의 화면 상태에서만 기능을 사용하고 싶다면 "portrait"으로 설정해 두어야 하는데, AndroidManifest.xml 파일안에 Activity 설정 정보를 수정해 주어야만 합니다.

설정방법은 AndroidManifest.xml파일을 선택하시고 난 다음에
탭부분에서 Application을 선택하게 됩니다.
그러고 난 다음 그림과 같이 해당 Activity를 선택하고 나서 Screen orientation에서 portrait을 선택해 주시고 저장하시면 됩니다.

xml의 내용을 보시게 되면
android:screenOrientation="portrait"

이 내용이 추가된 것을 확인하실 수 있습니다.



+ Recent posts