티스토리 뷰

마우스로 드래그/버튼 클릭시 원 그려짐

Java 파일

MainActivity

package com.example.canvas;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {
    MyView myView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myView = findViewById(R.id.myView);

        findViewById(R.id.bt).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                myView.addBall();
            }
        });
    }
}

MyView

package com.example.canvas;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import java.util.ArrayList;
import java.util.Random;

public class MyView extends View {
    ArrayList<Ball> ballArr = new ArrayList<>();


    int width;
    Paint p;
    Bitmap playerImg;

    public MyView(Context context) {
        super(context);
        //자바에서 올리면 실행
        p = new Paint();
    }

    public MyView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        //xml에서 올리면 실행
        p = new Paint();
        width = 100;
        playerImg = BitmapFactory.decodeResource(getResources(), R.drawable.ch1);
        handler.sendEmptyMessage(0);
        new YourThread().start();
        new Collision().start();
    }

    class Collision extends  Thread {
        @Override
        public void run() {
            super.run();
            while (true){
                for (int i = 0; i < ballArr.size(); i++) {
                    Ball temp = ballArr.get(i);
                    Rect rect = new Rect(temp.posX, temp.posY, temp.posX+width,temp.posY+width);
                    Rect playerRect = new Rect(playerX, playerY,playerX+200,playerY+200);
                    if(rect.intersect(playerRect)){
                        //i 번째 공과 충돌
                    }
                }
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    class YourThread extends Thread{
        @Override
        public void run() {
            super.run();
            while(true){
                for (int i = 0; i < ballArr.size(); i++) {
                    Ball temp = ballArr.get(i);
                    temp.posX += temp.speedX;
                    temp.posY += temp.speedY;
                }

                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    Handler handler = new Handler(){
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            handler.sendEmptyMessageDelayed(0,5);
            invalidate();
        }
    };

    public void addBall(){
        ballArr.add(new Ball(new Random().nextInt(400)+50
                ,new Random().nextInt(400)+50
                ,new Random().nextInt(5)+5
                ,new Random().nextInt(5)+5));
    }

    int playerX;
    int playerY;
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        p.setColor(Color.RED);
        canvas.drawRect(0,0,getWidth(),getHeight(),p);
        p.setColor(Color. BLACK);
        for (int i = 0; i < ballArr.size(); i++) {
            Ball temp = ballArr.get(i);
            canvas.drawCircle(temp.posX, temp.posY, width/2,p);
        }


//        canvas.drawBitmap(playerImg, playerX, playerY,p);
        canvas.drawBitmap(playerImg
                , new Rect(0,0,playerImg.getWidth(), playerImg.getHeight())
                , new Rect(playerX, playerY,playerX+200,playerY+200)
                , p);

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        playerX = (int)event.getX()-100;
        playerY = (int)event.getY()-200;
        return true;
    }
}

Ball

 

 

package com.example.canvas;

public class Ball {
    int posX;
    int posY;
    int speedX;
    int speedY;

    public Ball(int posX, int posY, int speedX, int speedY) {
        this.posX = posX;
        this.posY = posY;
        this.speedX = speedX;
        this.speedY = speedY;
    }
}

 클릭시 생성되는 볼 개체를 위한 객체지향적 설계

 

 

xml 파일 

 

MyView 클래스를 그대로 올려준다. 

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/bt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Click"
        android:textSize="20sp" />

    <com.example.canvas.MyView
        android:id="@+id/myView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/bt"
        android:layout_marginTop="-7dp" />

</RelativeLayout>
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함