본문 바로가기

아옳옳의 코딩공부/아옳옳의 안드로이드스튜디오

2021-05-07안드로이드 스튜디오(Thread 이용한 문제풀기)

반응형

쓰레드를 이용한 간단한 문제를 하나 풀어보도록 하자 

문제는 이미지뷰가 2개 가 있고 각각의 이미지 뷰를 클릭을하면 하나는 오른쪽으로 이동하다가 돌아오고 하나는 아래로 내려갓다 올라오는 형식으로 만들어 볼것이다. 

 

귀찮아서 하나의 클래스에 묶어서 만들어 보았다. 

 

메인영역

public class MainActivity extends AppCompatActivity {

    ImageView img1, img2;
    int im1, im2;
    MainHandler handler = new MainHandler();
    boolean first = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        img1 = findViewById(R.id.img1);
        img2 = findViewById(R.id.img2);
        ImgTwoThread imgTwoThread = new ImgTwoThread();
        ImgOneThread imgOneThread = new ImgOneThread();

        img1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                imgOneThread.start();
            }
        });
        img2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                imgTwoThread.start();
            }
        });

    }

메인에서는 필요한 스레드인스턴스화와 이미지뷰를 클릭했을떄 스레드가 시작하도록 하였다 . 

 

이미지뷰를 클릭함과 동시에 아래의 스레드가 실행 된다 

쓰레드

class ImgOneThread extends Thread {
        @Override
        public void run() {

            for (int i = 0; i <= 140; i++) {
                try {
                    Thread.sleep(50);

                    if (i < 70) {
                        Message message = Message.obtain();
                        message.obj = 10;
                        message.what = 0;
                        handler.sendMessage(message);
                    } else if (i > 70) {
                        Message message = Message.obtain();
                        message.obj = -10;
                        message.what = 0;
                        handler.sendMessage(message);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

스레드에서는 140번(좌표가 아닌 일정한 거리를 움직이기 위해서 임의로 설정함 ) for문을 돌면서 절반은 정수 절반은 음수를 10씩 보내주고 있다 . 

 

핸들러

class MainHandler extends Handler {
        @Override
        public void handleMessage(@NonNull Message msg) {
            if (msg.what == 0) {
                //1번이미지 영역
                im1 += (Integer) msg.obj;
                RelativeLayout.LayoutParams params1 = (RelativeLayout.LayoutParams) img1.getLayoutParams();
                params1.leftMargin = im1;
                img1.setLayoutParams(params1);

            } else if (msg.what == 1) {
                //2번이미지 영역
                im2 += (Integer) msg.obj;
                RelativeLayout.LayoutParams params2 = (RelativeLayout.LayoutParams) img2.getLayoutParams();
                params2.topMargin = im2;
                img2.setLayoutParams(params2);

            }
        }
    }
}

쓰레드에서 보낸 값을 im1 이라는 변수에 계속해서 넣어주고있다. 

고로 140번을 돌면서 10씩 증가 감소가 일어나며 그 값이 이미지뷰의 마진값으로 할당 해주고 있다 .

 

결과값~ 

 물론 내가 한게 정답이 아닐수도 있다 . 강사님께서 하신것들이 더욱 간결하고 가독성좋게 코딩했을수도 있으나

배운 내용을 활용하여 동작이 되는 프로그램을 만들었다는거에 만족하자~ ! 

 

 

반응형