How to Build Spin the Bottle Game Application in Android? (original) (raw)

Last Updated : 23 Jul, 2025

In this article, we will be building a Spin the Bottle Game Project using **Java/Kotlin and XML in Android. The application is based on a multiplayer game. One player spins the bottle and the direction in which the bottle spins will determine the player who gets selected for a task or any other stuff. There will be a single activity in this application.

How-to-Build-Spin-the-Bottle-Game-Application-in-Android_

Step by Step Implementation

Step 1: Create a New Project

To create a new project in Android Studio please refer to How to Create/Start a New Project in Android Studio.

Step 2: Import bottle image

Go to app > res > drawable and add this bottle **image.

Step 3: Working with the activity_main.xml file

The XML codes are used to build the structure of the activity as well as its styling part. It contains a TextView at the very top of the activity to show the title. Then it contains an ImageView of the bottle in the center of the activity. Below is the code for the **activity_main.xml file.

**activity_main.xml:

XML `

<androidx.constraintlayout.widget.ConstraintLayout 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" android:background="@color/white" tools:context=".MainActivity">

<!--to show the game title-->
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="32dp"
    android:text="Spin the Bottle"
    android:textColor="@color/black"
    android:textSize="32sp"
    android:textStyle="bold"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<!--image of the bottle -->
<ImageView
    android:id="@+id/bottle"
    android:layout_width="300dp"
    android:layout_height="300dp"
    android:src="@drawable/bottle"
    android:backgroundTintMode="multiply"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

`

Step 4: Working with the MainActivity file

We will set an **onClickListener on the bottle to rotate the bottle when the bottle in tapped. Then, we will create a **spinBottle() function to write the code for spinning the bottle. Inside this function, we will generate a random number from 5-10 that will be the number of the times the bottle spins. For this, we will be using the **Random function. We will use **ObjectAnimator to spin the image. We can set a duration of the animation. We will also use **DecelerateInterpolator() to slow down the bottle naturally.

**MainActivity File:

MainActivity.java `

package org.geeksforgeeks.demo;

import android.animation.Animator; import android.animation.ObjectAnimator; import android.os.Bundle; import android.view.animation.DecelerateInterpolator; import android.widget.ImageView;

import androidx.appcompat.app.AppCompatActivity;

import java.util.Random;

public class MainActivity extends AppCompatActivity {

// declare bottle as imageview
private ImageView bottle;
// variable to track if the bottle is spinning
private boolean isSpinning = false;
// variable to track the last rotation
private float lastRotation = 0f;

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

    // find the bottle imageview by its id
    bottle = findViewById(R.id.bottle);

    // set a click listener on the bottle imageview
    bottle.setOnClickListener(v -> {
        if (!isSpinning) {
            // start spinning the bottle
            spinBottle();
        }
    });
}

private void spinBottle() {
    // minimum full spins
    int minSpins = 5;
    // maximum full spins
    int maxSpins = 10;

    // random number of spins between minSpins and maxSpins
    int spins = new Random().nextInt((maxSpins - minSpins) + 1) + minSpins;
    // final stop angle
    int angle = new Random().nextInt(360);
    // total rotation
    float totalRotation = 360f * spins + angle;

    // animate the bottle using ObjectAnimator
    ObjectAnimator animator = ObjectAnimator.ofFloat(bottle, "rotation", lastRotation, lastRotation + totalRotation);
    // set duration of the animation
    animator.setDuration(3000);
    // slows down naturally
    animator.setInterpolator(new DecelerateInterpolator());

    // set a listener on the animation
    animator.addListener(new Animator.AnimatorListener() {
        // when the animation starts
        @Override
        public void onAnimationStart(Animator animation) {
            isSpinning = true;
        }

        // when the animation ends
        @Override
        public void onAnimationEnd(Animator animation) {
            isSpinning = false;
            lastRotation = (lastRotation + totalRotation) % 360;
        }

        // other methods are will not be used
        @Override
        public void onAnimationCancel(Animator animation) {}

        @Override
        public void onAnimationRepeat(Animator animation) {}
    });

    // start the animation
    animator.start();
}

}

MainActivity.kt

package org.geeksforgeeks.demo

import android.animation.Animator import android.animation.ObjectAnimator import android.os.Bundle import android.view.animation.DecelerateInterpolator import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import kotlin.random.Random

class MainActivity : AppCompatActivity() { // declare bottle as imageview private lateinit var bottle: ImageView // variable to track if the bottle is spinning private var isSpinning = false // variable to track the last rotation private var lastRotation = 0f

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    // find the bottle imageview by its id
    bottle = findViewById(R.id.bottle)

    // set a click listener on the bottle imageview
    bottle.setOnClickListener {
        if (!isSpinning) {
            // start spinning the bottle
            spinBottle()
        }
    }
}

private fun spinBottle() {
    // minimum full spins
    val minSpins = 5
    // maximum full spins
    val maxSpins = 10

    // random number of spins between minSpins and maxSpins
    val spins = Random.nextInt(minSpins, maxSpins + 1)
    // final stop angle
    val angle = Random.nextInt(0, 360)  
    // total rotation
    val totalRotation = 360f * spins + angle

    // animate the bottle using ObjectAnimator
    val animator = ObjectAnimator.ofFloat(bottle, "rotation", lastRotation, lastRotation + totalRotation)
    // set duration of the animation
    animator.duration = 3000
    // slows down naturally
    animator.interpolator = DecelerateInterpolator()
    
    // set a listener on the animation
    animator.addListener(object : Animator.AnimatorListener {
        // when the animation starts
        override fun onAnimationStart(animation: Animator) {
            isSpinning = true
        }

        // when the animation ends
        override fun onAnimationEnd(animation: Animator) {
            isSpinning = false
            lastRotation = (lastRotation + totalRotation) % 360
        }

        // other methods are will not be used
        override fun onAnimationCancel(animation: Animator) {}
        override fun onAnimationRepeat(animation: Animator) {}
    })
    
    // start the animation
    animator.start()
}

}

`

Output: