class KeyActivity
package com.example.choi.ex07_graphic;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import java.util.Random;
public class KeyActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//xml 레이아웃 파일 대신 커스텀 뷰 사용
MyView view =new MyView(this);
//키이벤트를 받을 수 있도록 설정
view.setFocusable(true);
setContentView(view);
}
//내부 클래스
class MyView extends View implements Runnable{
//변수
int x=50, y=50; //원의 중심좌표
int width, height; //화면의 가로,세로 길이
int moveX=5, moveY=10;
int red, green, blue, alpha;
public MyView(Context context) {
super(context);
Thread th=new Thread(this);
th.start();
}
//뷰가 화면에 출력될 때 호출
@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.LTGRAY); //배경색상
Paint paint =new Paint(); //페인트 객체 생성
paint.setARGB(255, red, green, blue); //페인트 색상
//원 그리기 :캔버스.drawCircle(x, y, 반지름, 페이트 객체)
canvas.drawCircle(x, y, 20, paint);
}
//화면 터치 이벤트
@Override
public boolean onTouchEvent(MotionEvent event) {
//터치한 좌표의 x, y값 저장
x =(int)event.getX();
y=(int)event.getY();
//화면 갱신 요청( onDraw()가 호출됨)
postInvalidate();
return super.onTouchEvent(event);
}
//뷰의 사이즈가 변경될 때 호출
//최초 뷰가 출력될 때, 폰의 가로/세로 방향이 바뀔 때
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
//폰의 가로, 세로 사이즈 계산
width=getWidth();
height=getHeight();
}
//키이벤트
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode){ //입력된 키코드값
case KeyEvent.KEYCODE_DPAD_LEFT:
x -=50;
x=Math.max(20, x); //큰값
break;
case KeyEvent.KEYCODE_DPAD_RIGHT:
x +=50;
x =Math.min(width-20, x);//작은값
break;
case KeyEvent.KEYCODE_DPAD_UP:
y -=50;
y =Math.max(20, y);
break;
case KeyEvent.KEYCODE_DPAD_DOWN:
y +=50;
y=Math.min(height-20, y);
break;
}
postInvalidate();
return super.onKeyDown(keyCode, event);
}
//Alt+Insert , Implement Methods
//백그라운드 작업(좌표값을 변경, 그래픽 갱신 요청)
@Override
public void run() {
while (true){
//x, y좌표 변경 구의 반지름 길이 20
//좌우 벽처리
if(x > (width-20) || x <20){
moveX =-moveX;
setColor();
}
//상하 벽처리
if(y > (height-20) || y <20){
moveY =-moveY;
setColor();
}
//x, y 좌표 변경
x +=moveX;
y +=moveY;
try{
Thread.sleep(30);
}catch (Exception e){
e.printStackTrace();
}
//그래픽 갱신 요청(onDraw() 가 호출됨)
postInvalidate();
}
}
void setColor(){
Random rand =new Random();
//랜덤객체.nextInt(숫자) 0 ~ 숫자 -1 사이의 난수 발생
alpha =rand.nextInt(256); //0~255
red =rand.nextInt(256);
green=rand.nextInt(256);
blue=rand.nextInt(256);
}
}
}
댓글 ( 4)
댓글 남기기