마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 스튜디오 오뚝이 만들기 중 질문입니다!

0 추천
package com.example.ad.tutorial2;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Toast;

import java.util.Calendar;
import java.util.GregorianCalendar;

public class Totorial2 extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);



        setContentView(new MyView(this));
    }
    class MyView extends View {
        int width, height;
        int cx,cy;
        int tw, th;
        int sw, sh;
        int ang, dir;
        int an1, an2;

        Bitmap imgToy, imgShadow;
        public MyView(Context context) {
            super(context);
            DisplayMetrics dm = getApplicationContext().getResources().getDisplayMetrics();
            width = dm.widthPixels;
            height = dm.heightPixels;

            cx = width /2;
            cy = height /2 +100;
             imgToy = BitmapFactory.decodeResource(context.getResources(), R.drawable.toy);
            imgShadow = BitmapFactory.decodeResource(context.getResources(), R.drawable.shadow);
            tw = imgToy.getWidth()/2;
            th = imgToy.getHeight();
            sw = imgShadow.getWidth()/2;
            sh = imgShadow.getHeight()/2;

            ang = 0;
            dir = 10;
            mHandler.sendEmptyMessageDelayed(0,10);



        }
        public void onDraw(Canvas canvas) {
            RotateToy();

            canvas.drawBitmap(imgShadow, cx -sw, cy-sh, null);
            canvas.rotate(ang, cx ,cy);
            canvas.drawBitmap(imgToy,cx -tw,cy-th, null);
            canvas.rotate(-ang,cx,cy);






        }
        private void RotateToy() {
            ang += dir;
            if (ang <= an1 || ang >= an2) {
                an1 ++;
                an2 --;
                dir = -dir;
                ang += dir;

            }
        }
        Handler mHandler = new Handler() {
            public void handleMessage(Message msg) {
                invalidate();
                mHandler.sendEmptyMessageDelayed(0,10);
            }
        };
        public boolean onTouchEvent(MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                an1 = -15;
                an2 = 15;
                if(dir ==0)
                    dir = -dir;
            }
            return true;
        }

    }


}
일단 위에것이 책에서 본 대로 그대로 만든 소스코드인데요.
이해안가는 부분은
onDraw함수 안에 있는 RotateToy(); 함수 실행 방법입니다.
한번 클릭할때마다 RotateToy함수가 실행되서
ang += dir; 로 가겠지요? 근데 현재 dir= 10인데 
if절 안에 조건에 해당이 안되는데 어떻게 잘 작동하고 있는건지
제가 어느부분을 놓치고 생각못한건지 잘 모르겠네요..
실행순서가 onTouchEvent -> onDraw -> RotateToy(); 이렇게 되는건가요..
실행은 잘되는데 어떻게 작동되고 있는지 그 원리를 모르겠습니다.
부탁드립니다!
unchain (120 포인트) 님이 2017년 9월 20일 질문

1개의 답변

0 추천

1. myView 생성되면서 생성자 호출. 생성자 내에 있는 다음이 호출되어 mHandler로 Message(신호)가 날아감.

 public MyView(Context context) {
            super(context);
            .......
            mHandler.sendEmptyMessageDelayed(0,10);
        }

2. mHandler에 Message 받도록 되어있는 handleMessage로 1.의 메세지가 떨어짐.

3. invalidate()로 화면이 무효화되어

4. onDraw호출.

5. handleMessge()내에 있는 mHandler.sendEmptyMessageDelayed가 보낸 메세지(신호)로 인해 다시 handleMessage를 호출. 

 public void handleMessage(Message msg) {
                invalidate();
                mHandler.sendEmptyMessageDelayed(0,10);
            }

2.번으로 돌아가면서 무한반복

 

밀면 (630 포인트) 님이 2017년 9월 20일 답변
...