본문 바로가기
안드로이드 자바

[Java][Android] 간단한 룰렛(원판 돌리기) 만들기

by teamnova 2022. 11. 10.

안녕하세요.

오늘은 간단한 룰렛을 만드는 방법에 대해서 알아보겠습니다.

 

 

먼저 라이브러리를 등록해줍니다.

 

build.gradle(Module:프로젝트명.app)

 

아래처럼 dependencies에 코드를 추가해줍니다.

dependencies {
    .
    .
    .
    
    implementation 'com.github.mmoamenn:LuckyWheel_Android:0.3.0'
}

 

setting.gradle(프로젝트명)

 

아래처럼 repositories 안에 maven { url 'http://jitpck.io' }를 추가해줍니다.

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        maven { url 'https://jitpack.io'}
    }
}

 

다음으로 xml 파일입니다.

<?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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white">


    <com.bluehomestudio.luckywheel.LuckyWheel
        android:id="@+id/luck_wheel"
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:layout_centerInParent="true"
        app:background_color="@android:color/white" />

    <Button
        android:id="@+id/spin_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/luck_wheel"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="10dp"
        android:text="돌리기"
        android:textColor="@android:color/white"
        android:textSize="25sp" />
</RelativeLayout>

룰렛 라이브러리를 사용한 룰렛과 룰렛을 돌리는 버튼으로 구성됩니다.

 

다음으로 사용할 이미지를 추가하겠습니다.

아래 압축 파일 다운로드 후 각 이미지를 drawble 폴더에 넣어주세요.

과일아이콘.zip
0.02MB

 

다음으로 자바 파일입니다.

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import com.bluehomestudio.luckywheel.LuckyWheel;
import com.bluehomestudio.luckywheel.OnLuckyWheelReachTheTarget;
import com.bluehomestudio.luckywheel.WheelItem;

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

public class RouletteActivity extends AppCompatActivity {

    private LuckyWheel luckyWheel;

    List<WheelItem> wheelItems ;

    String point;

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

        //변수에 담기
        luckyWheel = findViewById(R.id.luck_wheel);

        //점수판 데이터 생성
        generateWheelItems();

        //점수판 타겟 정해지면 이벤트 발생
        luckyWheel.setLuckyWheelReachTheTarget(new OnLuckyWheelReachTheTarget() {
            @Override
            public void onReachTarget() {

                //아이템 변수에 담기
                WheelItem wheelItem = wheelItems.get(Integer.parseInt(point)-1);

                //아이템 텍스트 변수에 담기
                String money = wheelItem.text;

                //메시지
                Toast.makeText(RouletteActivity.this, money, Toast.LENGTH_SHORT).show();
            }
        });

        //시작버튼
        Button start = findViewById(R.id.spin_btn);
        start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Random random = new Random();
                point = String.valueOf(random.nextInt(6)+1); // 1 ~ 6
                luckyWheel.rotateWheelTo(Integer.parseInt(point));
            }
        });
    }

    /**
     * 데이터 담기
     */
    private void generateWheelItems() {

        wheelItems = new ArrayList<>();

        wheelItems.add(new WheelItem(Color.parseColor("#F44336"), BitmapFactory.decodeResource(getResources(),
                R.drawable.mandarin), "귤"));

        wheelItems.add(new WheelItem(Color.parseColor("#E91E63"), BitmapFactory.decodeResource(getResources(),
                R.drawable.grape), "포 도"));

        wheelItems.add(new WheelItem(Color.parseColor("#9C27B0"), BitmapFactory.decodeResource(getResources(),
                R.drawable.melon), "멜 론"));

        wheelItems.add(new WheelItem(Color.parseColor("#3F51B5"), BitmapFactory.decodeResource(getResources(),
                R.drawable.strawberry), "딸 기"));

        wheelItems.add(new WheelItem(Color.parseColor("#1E88E5"), BitmapFactory.decodeResource(getResources(),
                R.drawable.peach), "복 숭 아"));

        wheelItems.add(new WheelItem(Color.parseColor("#009688"), BitmapFactory.decodeResource(getResources(),
                R.drawable.green_apple), "풋 사 과"));

        //점수판에 데이터 넣기
        luckyWheel.addWheelItems(wheelItems);
    }


    /**
     * drawable -> bitmap
     * @param drawable drawable
     * @return
     */
    public static Bitmap drawableToBitmap (Drawable drawable) {

        if (drawable instanceof BitmapDrawable) {
            return ((BitmapDrawable)drawable).getBitmap();
        }

        Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
        drawable.draw(canvas);

        return bitmap;
    }

}

Lucky Wheel 라이브러리에 포함된 WheelItem 형태의 데이터를 선언한 List에 담은 후,

해당 리스트를 luckyWheel 객체에 담게 되고, 랜덤으로 정해지는 숫자가 룰렛 결과를 정하게 됩니다.

 

실행화면 입니다.

 

보시다시피 돌리기 버튼을 클릭하면 룰렛이 돌고, 랜덤으로 룰렛의 결과 값이 나오게 됩니다.

 

궁금한 점은 댓글로 남겨주세요.

감사합니다.