package kr.infomax.RandomNumberKey; import java.util.ArrayList; import java.util.Random; import android.app.Activity; import android.os.Bundle; import android.util.DisplayMetrics; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.animation.AccelerateInterpolator; import android.view.animation.Animation; import android.view.animation.DecelerateInterpolator; import android.view.animation.TranslateAnimation; import android.widget.Button; import android.widget.EditText; import android.widget.TableLayout; import android.widget.TableRow; import android.widget.TextView; import android.widget.Toast; import android.widget.ViewFlipper; public class RandomNumberKey extends Activity { EditText editText; ViewFlipper flipper; TableLayout tableLayout; private String passwordStr = ""; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 디바이스 화면에 따라 버튼 크기 설정 final int btnWidth = getBtnWidth(); flipper = (ViewFlipper)findViewById(R.id.viewFlipper); flipper.setVisibility(View.INVISIBLE); // ViewFlipper 가 Activity 첫 실행시 보이지 않게 설정 flipper.setInAnimation(appearSecurityKeyboardAnimation()); // 나타날때 애니메이션 flipper.setOutAnimation(disappearSecurityKeyboardAnimation()); // 사라질때 애니메이션 tableLayout = (TableLayout)findViewById(R.id.tableLayout); // 보안키보드의 오프 이미지를 표시하기 위해 임의의 empty view를 삽입 TextView emptyView = new TextView(this); flipper.addView(emptyView, 0); editText = (EditText)findViewById(R.id.editText); editText.setInputType(0); //가상키보드 오프 editText.setOnClickListener(new OnClickListener() { public void onClick(View v) { // 보안 키보드 표시 if(flipper.getCurrentView().getId() != R.id.firstViewFlipper){ reOrderKeyboard(btnWidth); // 보안키보드 숫자 랜덤배치 flipper.setVisibility(View.VISIBLE); // 보안키보드 보이도록 설정 flipper.setDisplayedChild(1); // viewflipper 에서 보안키보드 부분이 보이도록 set } } }); keyboardClickHandler(); } private int getBtnWidth(){ DisplayMetrics displaymetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); int btnWidth = displaymetrics.widthPixels / 3; // 화면 너비 나누기 3으로 버튼 너비 설정 return btnWidth; } private void reOrderKeyboard(int btnWidth){ // 0부터 9까지의 수를 array list에 차례대로 넣는다. ArrayList<String> keyNumberArr = new ArrayList<String>(); for(int i=0; i<10; i++){ keyNumberArr.add(String.valueOf(i)); } TableRow tr; Button key; int randumIndex; Random random = new Random(); for(int i=0; i<tableLayout.getChildCount(); i++){ // 테이블의 한 로우를 받아옴 tr = (TableRow) tableLayout.getChildAt(i); for(int j=0; j<tr.getChildCount(); j++){ // 한 컬럼을 받아옴 key = (Button) tr.getChildAt(j); // 숫자키 체크 (XML 에서 숫자키에 id를 주지 않음) if(key.getId() == -1){ randumIndex = random.nextInt(keyNumberArr.size()); // arraylist의 크기만큼의 범위에서 랜덤한 정수 생성 key.setText(keyNumberArr.get(randumIndex)); // 해당 위치의 key에 text를 세팅 key.setWidth(btnWidth); // key 버튼의 너비 설정 keyNumberArr.remove(randumIndex); // 셋팅한 text를 arraylist에서 제거 final String keyText = key.getText().toString(); // 셋팅된 key의 text를 임시저장 key.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { int curIndex = editText.getSelectionStart(); // 현재 에디트박스의 커서위치 int passWordLength = passwordStr.length(); passwordStr = passwordStr.substring(0, curIndex) + keyText + passwordStr.substring(curIndex, passWordLength); // 패스워드 String을 가지고 있음 // 사용자에게 보이는 에디트 박스에는 *로 채움 editText.setText(""); for(int i=0; i<curIndex; i++){ editText.append("*"); } editText.append(keyText); for(int i=curIndex+1; i<passWordLength+1; i++){ editText.append("*"); } editText.setSelection(curIndex+1); } }); } } } } private void keyboardClickHandler(){ Button key_done = (Button)findViewById(R.id.key_done); Button key_backspace = (Button)findViewById(R.id.key_backspace); // 확인키 누름 key_done.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { // 현재 viewfliper가 가지고 있는 view가 키보드인지 체크 if(flipper.getCurrentView().getId() == R.id.firstViewFlipper){ // empty view 호출, 즉 키보드view를 퇴장시킴 flipper.setDisplayedChild(0); } } }); // backspace 키 입력 key_backspace.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { // 현재 커서위치 int curIndex = editText.getSelectionStart(); // 현재 입력된 패스워드 길이 int passWordLength = passwordStr.length(); if((curIndex == 0) || (passWordLength == 0)){ return; } // 한글자씩 지우기 passwordStr = passwordStr.substring(0, curIndex-1) + passwordStr.substring(curIndex, passWordLength); editText.setText(""); for(int i=0; i<passWordLength-1; i++){ editText.append("*"); } editText.setSelection(curIndex-1); } }); } /***************************************************/ /** 애니메이션 설정 **/ /***************************************************/ private Animation appearSecurityKeyboardAnimation() { Animation appear = new TranslateAnimation( Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, +1.0f, Animation.RELATIVE_TO_PARENT, 0.0f); appear.setDuration(400); appear.setInterpolator(new AccelerateInterpolator()); return appear; } private Animation disappearSecurityKeyboardAnimation() { Animation disappear = new TranslateAnimation( Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, +1.0f); disappear.setDuration(400); disappear.setInterpolator(new DecelerateInterpolator()); return disappear; } @Override public boolean onKeyDown(int keyCode, KeyEvent event){ if(keyCode==KeyEvent.KEYCODE_BACK){ // 디바이스 키중 Back버튼 눌렀을때 키보드가 올라와있으면 키보드 닫기 if(flipper.getCurrentView().getId() == R.id.firstViewFlipper){ flipper.setDisplayedChild(0); } // 키보드가 올라오지 않은 상태면 보통때의 back 버튼 수행 else{ super.onKeyDown(keyCode, event); } } return true; } } |