안드로이드

 

  

 

 

 

 

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);
        }

    }




}





 

 

 

 

 

 

 

 

 

about author

PHRASE

Level 60  머나먼나라

사람은 키 큰 덕을 입어도 나무는 키 큰 덕을 못 입는다 , 나무는 큰 나무가 있으면 그 밑의 작은 나무는 자라지 못하나, 사람은 큰 인재가 나면 그 주위 사람이 그 덕을 입는다는 말.

댓글 ( 4)

댓글 남기기

작성