Android2010. 1. 20. 16:25

 워낙에 외우는게 귀찮은지라 기본적으로 생성이 안되는 오버라이드된 메소드들은 기억나는건 치고 기억안나는것은 이전소스를 참조하거나 어찌어찌 더 귀찮은 방법으로 찾아 적고 있었는데 이클립스에 기본적으로 override or implement 된 메소드들을 자동 생성해 주는 방법이 있었다. 이걸 이제 알아 사용하다니... ㅜㅠ
역시 코딩하다 답답하고 뭔가 안풀릴때는 이것저것 만져보는 뻘짓을 해주면 먼가 알게된다 ㅋㅋㅋ

Eclipse - [Source]-[Override/Implement Methods...] 선택



이렇게 하면 현재 선택되어진 곳의 오버라이드되는 메소드들이 나오며 원하는 메소드의 체크박스를 클릭한 후에 OK버튼을 누르면 자동으로 메소드가 생성된다. 아~ 이 편한걸 이제야 알다니 ㅜㅠ;;;
Posted by ™설야
Android2010. 1. 20. 16:04

         
  

 좌측 이미지가 기본적인 다이얼로그를 사용했을때 보여지는 형태이다. 뒷배경이 살짝 어두워지면서 다이얼로그가 팝업되는 형식이다. 우측의 이미지가 뒷배경이 어두워지는거 + Blur 형식으로 뿌옇게 변하게 되는 형식의 다이얼로그 팝업이다.

dialog = new Dialog(BlurDialogTest.this);
dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND,
WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
dialog.setContentView(R.layout.dialog);
dialog.setTitle("다이얼로그");
dialog.show();

dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND,
WindowManager.LayoutParams.FLAG_BLUR_BEHIND);

이 부분이 뒷 배경에 blur 형식의 효과로 지정해주는 부분이다.
이런 효과 말고도 API를 참조 하면 더 많은 효과들을 볼수 있다.
http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html

Posted by ™설야
Android2010. 1. 20. 10:02



<메뉴창을 올린다>-<Settings>-<Language&keyboard>-<Select locale>-<한국어>

 여태 에뮬레이터는 그저 코딩후 결과 확인창 정도로 생각하다가 막히는게 있어서 에뮬레이터를 이것저것 만지다 보니 한국어로 설정할 수 있는 곳이 있었다. ㅡ.,ㅡ;;; Android SDK 2.1 버전 나오고 테스트했으며 보니깐 2.0.1 버전에서도 한국어 설정이 가능하다. 나만 모르고 있었던건가.. ㅜㅠ;;
 그다지 영문을 쓰면서 불편한 점은 없었지만 한국어로 설정되니깐 왠지 반갑다.

영문설정된 기본페이지



메뉴를 열어 언어및 키보드 설정창으로 들어간다.


반가운 한국어~~



설정 완료 후 우리나라 언어로 변경된 기본 페이지와 메뉴창




'Android' 카테고리의 다른 글

이클립스 오버라이드된 메소드 자동생성 방법  (0) 2010.01.20
다이얼로그 : 뒷배경 흐리게 처리하기  (0) 2010.01.20
우연치 않게...  (0) 2010.01.18
Day 5 : Gesture Test  (0) 2010.01.12
Day 4 : onTouchEvent 테스트  (0) 2009.12.31
Posted by ™설야
Android2010. 1. 18. 18:42


 열심히 안드로이드 빨간책을 공부하는데 지진정보를 가져오는 소스코드를 실행해보니 몇일전 아이티 강진에 이은 여진이 오늘도 발생했다는것을 직접 확인해 볼 수 있었다. 아이티 뿐만 아니라 전세계 여러곳에서 지진이 수차례 발생되는걸 보니 무서워진다.

 안드로이드 빨간책(프로페셔널 안드로이드 애플리케이션 개발 /저:리토 마이어) 이거 생각의외로 난이도가 있는 책이다. 이것저것 소스코드 가져다 공부하면 되겠지 했던 생각을 뒤집어 놓았고 머릿속에 집어넣어야 할 것도 산떠미처럼 불어나 버렸다.
Posted by ™설야
Android2010. 1. 12. 10:25

 테트리스 게임을 한번 만들어보고자 키 입력이 아닌 터치를 이용해 테트리스의 조각을 이동시키고 변형 시켜 보려고 제스쳐동작에 대한 기능을 알아보았으나 정보가 많지 않았다 나의 검색신공은 구글 안드로이드 홈피에서 제공하는 소스와 샘플 소스. 하지만 여간 알아먹질 못하것고 내가 필요한 기능만 추려서 간단히 알아보고자 기존 샘플 소스에서 변형시켜 만들어 보았다.

 

 이 소스의 기능은 제스쳐 이름을 입력 받고 제스쳐 오버레이에 동작된 제스쳐를 ADD를 시켜 추가 시키고 TEST  버튼을 눌러 ADD시킨 제스쳐 동작이 제대로 작동하는지만 알아보는 테스트 이다.

 

초기화면)

초기 화면에서 제스쳐 동작을 취해 ADD버튼을 눌렀을때의 화면.

 

 

TEST 화면)

ADD시킨 제스쳐를 취하면 해당 제스쳐의 입력했던 이름이 출력되게 하였다.


 하지만 정작 만들어놓고 보니 내가 테트리스 게임을 터치형식의 게임으로 만들 때 구지 필요하지 않을 것 같다. 게임의 하단 부분에 터치반응 사각영역을 넣고 터치가 입력된 곳과 끝난곳의 위치를 계산하여 테트리스 블록을 드랍시키는 형식으로도 충분히 가능할 것 같기 때문이다. 그래도 제스쳐란 기능에 대해서 알아 볼 수 있어 매우 유용했단 생각이든다.

  만들 때 해결 못한 부분이 있는데 제스쳐를 ADD 시킬때 파일을 만들어 그 안에 제스쳐의 이름과 동작을 저장하는데 a라는 이름의 제스쳐를 ADD시킨 후 새로운 b라는 이름의 제스쳐를 등록시키면 TEST해보면 제일 나중에 등록된 b라는 이름의 제스쳐 밖에 동작을 안하게 된다. 이건 더 공부해야할 문제인듯 하다.



제스쳐 등록시키기

    public void addGesture() {
        final EditText gName = (EditText) findViewById(R.id.et_name);	//제스쳐 이름 입력창
        final CharSequence name = gName.getText();						//제스쳐 이름 가져오기
		try {
	        if (name.length() == 0) {//제스쳐 이름의 길이가 0 이면 에러메세지를 보여준다.
	            Toast.makeText(this, "You must enter a name", Toast.LENGTH_LONG).show();
	            return;
	        }
	        GestureLibrary gLib = GestureLibraries.fromPrivateFile(this, "myGesture");
        	gLib.addGesture(name.toString(), mGesture);
	        gLib.save();
		} catch (Exception e) {
	        Log.e("Failure","Gesture no save");
		}
        Toast.makeText(this, name+" saved", Toast.LENGTH_LONG).show();
    }



사용된 제스쳐 오버레이

    


    





소스 저장



'Android' 카테고리의 다른 글

안드로이드 에뮬레이터 한글 설정  (0) 2010.01.20
우연치 않게...  (0) 2010.01.18
Day 4 : onTouchEvent 테스트  (0) 2009.12.31
Day 4 : 이미지 그려주기 테스트  (0) 2009.12.31
Day 4 : 2D 를 표현하기 위한 기본 코드  (0) 2009.12.31
Posted by ™설야
Android2009. 12. 31. 21:26

 
public boolean onTouchEvent(MotionEvent event) { 
	iClickGetX = (int)event.getX();//터치된 곳의 x좌표
	iClickGetY = (int)event.getY();//터치된 곳의 y좌표
	ActionValue = event.getAction();//터치 액션값 
	
	if( ActionValue == MotionEvent.ACTION_DOWN ){//터치 하고 있을때
	sAction = "ACTION DOWN";
	}else if( ActionValue == MotionEvent.ACTION_UP ){//터치 하지 않을때
	sAction = "ACTION UP";
	}else if( ActionValue == MotionEvent.ACTION_MOVE){//터치된 상태에서 이동중(드래그)
	sAction = "ACTION MOVE";
	}
	return super.onTouchEvent(event);
}
요 메소드를 가지고 화면에 터치한곳으로 움직이는 이미지를 그려보았다.
이번 글작성은 SyntaxHighlighter를 티스토리에 적용시켜 코드를 뿌려주는 테스트 또한 해보았다. ㅋㅋ  

결과물

'Android' 카테고리의 다른 글

우연치 않게...  (0) 2010.01.18
Day 5 : Gesture Test  (0) 2010.01.12
Day 4 : 이미지 그려주기 테스트  (0) 2009.12.31
Day 4 : 2D 를 표현하기 위한 기본 코드  (0) 2009.12.31
Tip. Key 에 대한 정의 지정해주기.  (0) 2009.12.30
Posted by ™설야
Android2009. 12. 31. 16:04

PNG 파일을 불러와 그려주고 크기변경하고 이미지 자르기 테스트

작성코드

DrawTest.java

    protected void onDraw(Canvas cvs){

        

        Paint paint = new Paint();

        paint.setColor(Color.argb(iA, iR, iG, iB));

      

        Bitmap iOrigin = getImage(R.drawable.img_test);

        Bitmap iResize = resizeImage(iOrigin, 50, 200);

        Bitmap iClip = clipImage(iOrigin, 21,5, 58, 32);

        

        cvs.drawBitmap(iOrigin, 0, 0, paint);

        cvs.drawBitmap(iResize, iOrigin.getWidth(), 0, paint);

        cvs.drawBitmap(iClip, iOrigin.getWidth()+iResize.getWidth(), 0, paint);

        

    }

    /**

     * Get Bitmap

     * @param resId Resource ID

     * @return 비트맵 넘겨주기

     */

    public Bitmap getImage(int resId){

        return BitmapFactory.decodeResource(getResources(), resId);

    }

    /**

     * Resize Bitmap

     * @param origin 원본 비트맵

     * @param width 변경할 비트맵의 가로 사이즈

     * @param height 변경할 비트맵의 세로 사이즈

     * @return 변경된 비트맵 넘겨주기

     */

    public Bitmap resizeImage(Bitmap origin, int width, int height){

        return Bitmap.createScaledBitmap(origin, width, height, true);

    }

    /**

     * Clip Bitmap

     * @param origin 원본 비트맵

     * @param sx 원본이미지에서 자를곳의 시작 x 위치

     * @param sy 원본이미지에서 자를곳의 시작 y 위치

     * @param cw x,y 위치부터 자를 가로 크기

     * @param ch x,y 위치부터 자를 세로 크기

     * @return 원본 비트맵에서 자른 부분 넘겨주기

     */

    public Bitmap clipImage(Bitmap origin, int sx, int sy, int cw, int ch){

        return origin.createBitmap(origin, sx, sy, cw, ch);

    }

 

결과물


사용된 이미지

Posted by ™설야
Android2009. 12. 31. 14:26

 

기본 클래스

Test1.java

public class Test1 extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(new DrawTest(this));

 

}

}

DrawTest.java

public class DrawTest extends View {

    

    public DrawTest(Context context) {

        super(context);

    }

 

    @Override

    protected void onDraw(Canvas cvs){

        int iA = 0xFF;//alpha value

        int iR = 0x00;//red value

        int iG = 0xFF;//green value

        int iB = 0x00;//blue value

 

        Paint paint = new Paint();

        String sDrawStr = "DrawText";

        String sAlphaStr = " ";

        int iStrLeng = 0;

        for(int i=15;i<cvs.getHeight();i+=15){

            paint.setColor(Color.argb(iA-i, iR, iG, iB));

            sAlphaStr = " <- Alpha Value ("+(iA-i)+")";

            iStrLeng = sAlphaStr.length()+sDrawStr.length();

            cvs.drawText(sDrawStr+sAlphaStr, 0, iStrLeng, 0, i, paint);

        }

    }

}

 기존에 Activity가 xml을 참조하던 것과는 달리 View객체를 받은 DrawTest라는 사용자가 만든 클래스를 참조하게 만든다. DrawTest에 onDraw(Canvas cvs) 에 그려줄 내용들을 적으면 화면에 뿌려진다.

위의 소스는 글자를 뿌려주기 위해 만들었고 덤으로 Alpha 값에 대한 것도 알아볼 수 있다.

여태 Color를 RGB값만 쓰던 나를 당황시켜준 값이 Color가 ARGB를 쓴다는 것. 아예 기본적인 Color에 Alpha값 까지 플러스되서 오히려 엄청 편하게 됐다. 처음에 paint.setColor 로 색상값을 정해줄 때 당연히 RGB값만 들어가는 줄 알고 작성했다가 한 시간을 오류와 씨름했다.

 결과값

 

알파값에 따른 불투명 효과
알파값이 –값이 나오더라도 결과값이 나온다.

Posted by ™설야
Android2009. 12. 30. 17:03

 

Message.java – onBackPressed()

@Override
public void onBackPressed() {
    if( getValue == SAVE_COMPLETE ){
        Intent intent = new Intent(Message.this, Memo.class);
        startActivity(intent);
    }else{
        finish();
    }
    return;
}

 

Message.java – onKeyDown()

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
        if( getValue == SAVE_COMPLETE ){
            Intent intent = new Intent(Message.this, Memo.class);
            startActivity(intent);
        }else{
            finish();
        }
        return true;
    }

    return super.onKeyDown(keyCode, event);
}

 Android Developers blog 를 참조하다가 키에 대한 정의를 내릴 수 있는 메소드의 내용이 있어 이전버튼에 대한 정의를 내려주지 못해 day2:간단한 메모장 만들기(진행중) 에서 오류를 뿜어주던걸 하나 수정했다.
Android Developers blog 에 올라와있는 내용이 딱 나한테 필요한 내용이였던 것이다. ㅋㅋ onBackPressed()는 단순히 이전버튼에 대한 정의만 내려주고 onKeyDown()은 에뮬레이터상 대부분의 버튼에 정의를 내려줄 수 있다. 두개의 메소드 모드 작성되어 있다면 에뮬레이터에서는 onBackPressed()는 무시하고 이전버튼을 눌렀을때도 onKeyDown()으로 들어가버린다.

Posted by ™설야
Android2009. 12. 30. 16:13

Day2에서 구현 못한 파일 오픈과 관련된 기능을 추가.


구현 내용

  1. 메뉴 구성 : day 2
    - 타이틀 제목/New/Open/Exit 로 구성
  2. New 버튼 : day 2
    - 메모입력창을 띄운다.
    - 텍스트입력창 (상단) : 메모의 내용을 입력받는다.
    - 텍스트입력창 (하단) : 한줄로 메모의 내용을 저장시킬 파일 이름을 입력 받는다.
    - 버튼 (SAVE) : 바로 저장해 버린다.
    - 버튼 (MENU) : 초기 메뉴로 나가버린다.
  3. Open 버튼 : day 3
    - 저장되어 있는 파일들을 보여준다.
    - 사용자가 파일을 선택하면 스크롤 뷰 레이아웃을 이용해 내용을 보여주기만 한다.
    - 버튼 (EDIT) : 읽고있는 내용을 메모입력창으로 보내 사용자가 편집할 수 있게 한다.
    - 버튼 (MENU) : 초기 메뉴로 나가버린다.
  4. Exit 버튼 : day 2
    - 어플 종료

구현 결과

 

  • 초기 메뉴에서 Open 버튼을 눌렀을 때.

    새로운 Activity 사용(List Activity)

  • 파일 리스트 중 하나를 클릭 했을 때
    1.맨 윗줄에 파일 이름을 보여준다. (TextView)
    2.파일내용을 보여준다.(TextView)
    이 TextView에는 ScrollBar가 구현.
    3.하단부에 EDIT 버튼 추가
    EDIT버튼 클릭시 Day2에서 사용된 Edit Activity를 그대로 사용하며 파일 이름과 내용을 보내준다.
    4.DEL버튼 추가
    열린 파일을 거침없이 삭제 해버린후에 창을 닫고 삭제 완료 메시지를 보여준다. Day2에서 사용된 Message Activity에 메시지 추가

  • 위 파일 오픈 창에서 EDIT버튼을 눌렀을 때
    Day 2 에서만든 Edit Activity 를 불러온와 파일 내용을 수정 할 수 있게 한다.

  • 파일 오픈 창에서 DEL 버튼을 눌렀을 때
    파일이 지워졌다는 메시지창을 보여준다.

 

주요 코드

리스트에서 선택된 position 받아와 선택된 파일읽어 오기

String[] sReadFile = new String[2];        //[0] 파일이름 , [1] 파일내용

public void setReadFile(int pos){

sReadFile[FILENAME] = mFileList[pos];

    try {

        FileInputStream fis = openFileInput(mFileList[pos]);

//파일 크기만큼 buffer 열기

        buffer = new byte[fis.available()];                

//버퍼안에다 넣기

        fis.read(buffer, 0, fis.available());            

//byte string으로 변환 readFile에는 메모의 내용이 들어간다

        sReadFile[FILECONTENT] = byteToString(buffer);    

        fis.close();

    } catch (Exception e) {

        e.printStackTrace();

    }

}

byteToString 메소드

public String byteToString(byte buffer[]) {

    char[] cBuffer = new char[buffer.length];

 

    for(int i = 0 ; i < buffer.length ; i ++)

        cBuffer[i]=(char)buffer[i];

 

    return new String(cBuffer);

}

ListActivity 사용

public class OpenList extends ListActivity implements Variable{

    /** Called when the activity is first created. */

String[] mFileList; //파일리스트 받아올 String배열

      

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

 

if( fileList().length != 0 ){

    mFileList = fileList();

this.setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, mFileList));

 

}else{

    //파일이 없다는걸 표시해 줘야 한다.

}

 

}

}


어설프게 모양새는 갖춰졌지만 에뮬레이터에서 테스트하며 뿜어내는 오류들 고쳐야하는데 ;;;

ㅜㅠ Activity 이동할 finish(); 사용한 부분도 있지만 그렇지 않고 이동할땐 finish();

한것과 안한것의 차이는 뭔지, finish();대신에 startActivity(intent); 불려지는거랑 차이가 뭔지 궁금

하다.

 

파일을 지워주고 리스트를 다시 받아오기 위해

mFileList = fileList();

this.setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, mFileList));

부분을 다시 불러왔는데 에뮬레이터에서 테스트할때는 문제가 없었지만 뭔가 찜찜하다;;


파일보관용


 


Posted by ™설야