Android开发:真心话大冒险APP及转盘帧动画开发流程

Android开发:真心话大冒险APP及转盘帧动画开发流程

一、 任务要求

主界面:上面左右各一个按钮,分别为启动转盘和抽奖
中间放置一个启动抽奖的转盘图片
功能要求:
1.点击启动转盘按钮,显示转盘动画,并播放抽奖音乐(需要播放的音频文件已经放在res\raw文件夹内),启动转盘按钮点击后变为灰色
2.点击抽奖按钮,转盘动画停止,抽奖音乐停止,显示中奖结果
有三种中奖结果,分别是:真心话、大冒险、无惊无险(用大号红色字体显示在按钮下方)
3.点击菜单,弹出设置选项,点击设置选项,弹出参数设置自定义对话框,进行相关参数的设置
参数设置对话框信息为:
转盘转速: 右边文本框输入1到1000的任意整数, 值越小,转盘的转速越快
真心话概率(0-10):右边文本框输入1到10的任意整数
大冒险概率(0-10):右边文本框输入1到10的任意整数
无惊无险概率(0-10):右边文本框输入1到10的任意整数
真心话,大冒险和无惊无险的总和为数值10,数值表示该项抽中的概率
例如: 2表示20%几率被抽中
设置好后,点击OK按钮,参数设置生效,通过弹幕显示出设置的各项数值信息

二、布局搭建

activity_main.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.zhuanpan2.MainActivity" >

    <ImageView
        android:id="@+id/img_show"
        android:layout_width="240dp"
        android:layout_height="240dp"
        android:layout_below="@+id/btn_start"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="65dp"/>

    <Button
        android:id="@+id/btn_start"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/img_show"
        android:layout_alignParentTop="true"
        android:layout_marginTop="17dp"
        android:text="启动转盘" />

    <Button
        android:id="@+id/btn_lottery"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/btn_start"
        android:layout_alignBottom="@+id/btn_start"
        android:layout_alignRight="@+id/img_show"
        android:text="抽奖" />

    <TextView
        android:id="@+id/result_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/btn_start"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="16dp"
        android:gravity="center_horizontal"
        android:textSize="24sp" />

</RelativeLayout>

三、主活动类代码

package com.example.zhuanpan2;
import java.util.Random;

import android.app.Activity;
import android.graphics.Color;
import android.graphics.drawable.AnimationDrawable;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

public class MainActivity<img_show> extends Activity implements OnClickListener {
	
	private Button btn_start;
    private Button btn_lottery;
    private ImageView img_show;
	protected AnimationDrawable frameani;
    private MediaPlayer mediaplay;
    private TextView resultText; 
    
    private int mTruthProb = 3;  // 默认值为3,表示真心话概率为30%
    private int mDareProb = 3;   // 默认值为3,表示大冒险概率为30%
    private int mSafeProb = 4;   // 默认值为4,表示无惊无险概率为40%
    
    private int animationDuration = 100;// 初始动画持续时间为100ms

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		bindViews();
		//获取帧动画对象实例
		frameani =new AnimationDrawable();
		//向帧动画实例中添加图片
		frameani.addFrame(getResources().getDrawable(R.drawable.pan0),animationDuration);
		frameani.addFrame(getResources().getDrawable(R.drawable.pan2),animationDuration);
		frameani.addFrame(getResources().getDrawable(R.drawable.pan4),animationDuration);
		frameani.addFrame(getResources().getDrawable(R.drawable.pan6),animationDuration);
		frameani.addFrame(getResources().getDrawable(R.drawable.pan8),animationDuration);
		frameani.addFrame(getResources().getDrawable(R.drawable.pan10),animationDuration);
		frameani.addFrame(getResources().getDrawable(R.drawable.pan12),animationDuration);
		frameani.addFrame(getResources().getDrawable(R.drawable.pan14),animationDuration);
		frameani.addFrame(getResources().getDrawable(R.drawable.pan16),animationDuration);
		frameani.addFrame(getResources().getDrawable(R.drawable.pan18),animationDuration);
		frameani.addFrame(getResources().getDrawable(R.drawable.pan20),animationDuration);
		frameani.addFrame(getResources().getDrawable(R.drawable.pan22),animationDuration);
		frameani.addFrame(getResources().getDrawable(R.drawable.pan24),animationDuration);
		
		//设置帧动画循环播放
		frameani.setOneShot(false);
		
		//将帧动画放入img_show控件中显示       
        img_show = (ImageView) findViewById(R.id.img_show);
        img_show.setBackground(frameani);
        
        mediaplay = MediaPlayer.create(getApplicationContext(), R.raw.mymusic);
	}
	
	private void bindViews() {
        btn_start = (Button) findViewById(R.id.btn_start);
        btn_lottery = (Button) findViewById(R.id.btn_lottery);
        resultText = (TextView) findViewById(R.id.result_text);
              
        btn_start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                btn_start.setEnabled(false);
                btn_lottery.setEnabled(true);
                frameani.start();
                mediaplay.start();
            }
        });
        btn_lottery.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                btn_start.setEnabled(true);
                btn_lottery.setEnabled(false);
                frameani.stop();
                mediaplay.pause();
                //生成1个0-9的随机数
                Random random=new Random();
                int randomNumber =random.nextInt(10);                
                int value;
                if (randomNumber < mTruthProb) {
                    value = 0;  // 生成真心话
                } else if (randomNumber < mTruthProb + mDareProb) {
                    value = 1;  // 生成大冒险
                } else {
                    value = 2;  // 生成无惊无险
                }
                showResult(value);				
            }
        });
    }
	
	private void showResult(int value) {
		// TODO Auto-generated method stub
		switch (value) {
		case 0:
			resultText.setText("真心话");
			resultText.setTextSize(30);
			resultText.setTextColor(Color.RED);
			break;
		case 1:
			resultText.setText("大冒险");
			resultText.setTextSize(30);
			resultText.setTextColor(Color.RED);
			break;
		case 2:
			resultText.setText("无惊无险");
			resultText.setTextSize(30);
			resultText.setTextColor(Color.RED);
			break;
		default:
			break;
		}
	}
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			 showDialog();
			return true;
		}
		return super.onOptionsItemSelected(item);
	}
	
	//打开参数设置对话框
	private void showDialog() {
		SettingDialog dialog = new SettingDialog(MainActivity.this, animationDuration,mTruthProb, mDareProb, mSafeProb);
		// 点击右上角设置按钮,弹出参数设置对话框
        dialog.setOnSettingChangeListener(new SettingDialog.OnSettingChangeListener() {
            @Override
            public void onSettingChange(int speed,int truthProb, int dareProb, int safeProb) {
                // 用户点击对话框中的OK按钮后,更新参数设置
            	// 更新帧动画的每一帧持续时间
                animationDuration = 1000 - speed;
                for (int i = 0; i < frameani.getNumberOfFrames(); i++) {
        			frameani.setDuration(i, duration);
    			}
                
                mTruthProb = truthProb;
                mDareProb = dareProb;
                mSafeProb = safeProb;
               
            }
        });
        dialog.show();       
	}
	
	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		
	}	
}

四、对话框设置

1.布局

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:id="@+id/dialog_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_margin="16dp"
        android:gravity="center"
        android:text="参数设置"
        android:textAppearance="?android:textAppearanceLarge" />

    <TextView
        android:id="@+id/dialog_turntable_speed_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="16dp"
        android:text="转盘转速:" />

    <EditText
        android:id="@+id/dialog_turntable_speed_edit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="16dp"
        android:layout_marginRight="16dp"
        android:ems="10"
        android:inputType="number" >

        <requestFocus />
    </EditText>

    <TextView
        android:id="@+id/dialog_truth_or_dare_prob_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="16dp"
        android:text="真心话概率(0-10):" />

    <EditText
        android:id="@+id/dialog_truth_or_dare_prob_edit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="number"
        android:layout_marginLeft="16dp"
        android:layout_marginRight="16dp" />

    <TextView
        android:id="@+id/dialog_adventure_prob_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="16dp"
        android:text="大冒险概率(0-10):" />

    <EditText
        android:id="@+id/dialog_adventure_prob_edit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="number"
        android:layout_marginLeft="16dp"
        android:layout_marginRight="16dp" />

    <TextView
        android:id="@+id/dialog_safe_prob_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="16dp"
        android:text="无惊无险概率(0-10):" />

    <EditText
        android:id="@+id/dialog_safe_prob_edit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="number"
        android:layout_marginLeft="16dp"
        android:layout_marginRight="16dp" />

    <Button
        android:id="@+id/dialog_cancel_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginRight="8dp"
        android:text="OK" />

</LinearLayout>

2.参数功能实现

package com.example.zhuanpan2;

import org.eclipse.jdt.annotation.NonNull;

import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class SettingDialog extends Dialog implements View.OnClickListener{
	private EditText mSpeedEditText;
    private EditText mTruthProbabilityEditText;
    private EditText mAdventureProbabilityEditText;
    private EditText mSafeProbabilityEditText;
    private Button mOkButton;
    
    private int speed,truthProbability,adventureProbability,safeProbability;
    private OnSettingChangeListener mListener;
    
    public SettingDialog(@NonNull Context context, int mSpeed,int mTruthProb, int mDareProb, int mSafeProb) {
        super(context);
        mSpeed = speed;
        mTruthProb = truthProbability;
        mDareProb = adventureProbability;
        mSafeProb = safeProbability;
    }

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

        mSpeedEditText = (EditText)findViewById(R.id.dialog_turntable_speed_edit);
        mTruthProbabilityEditText = (EditText)findViewById(R.id.dialog_truth_or_dare_prob_edit);
        mAdventureProbabilityEditText = (EditText)findViewById(R.id.dialog_adventure_prob_edit);
        mSafeProbabilityEditText = (EditText)findViewById(R.id.dialog_safe_prob_edit);
        mOkButton = (Button)findViewById(R.id.dialog_ok_button);
        mOkButton.setOnClickListener((android.view.View.OnClickListener) this);
              
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.dialog_ok_button) {
        	
            // 获取用户设置的转盘转速,并设置动画持续时间
            speed = Integer.parseInt(mSpeedEditText.getText().toString());
            
            truthProbability = Integer.parseInt(mTruthProbabilityEditText.getText().toString());
            adventureProbability = Integer.parseInt(mAdventureProbabilityEditText.getText().toString());
            safeProbability = Integer.parseInt(mSafeProbabilityEditText.getText().toString());
            int totalProbability = truthProbability + adventureProbability + safeProbability;
            if (totalProbability != 10) {
            	Toast.makeText(getContext(), "真心话,大冒险和无惊无险的总和数值必须为10,请重新设置",Toast.LENGTH_SHORT).show();
            } else if (speed >= 1000) {
            	Toast.makeText(getContext(), "请输入1到1000的整数", Toast.LENGTH_SHORT).show();
			}
            else {
            	//setAnimationDuration(speed);
            	int speed1 = Integer.parseInt(mSpeedEditText.getText().toString());
                int truthProbability1 = Integer.parseInt(mTruthProbabilityEditText.getText().toString());
                int adventureProbability1 = Integer.parseInt(mAdventureProbabilityEditText.getText().toString());
                int safeProbability1 = Integer.parseInt(mSafeProbabilityEditText.getText().toString());
            	dismiss();
            	Toast.makeText(getContext(), "转盘转速为:" + speed1 + "\n真心话概率为:" + truthProbability1 +
            			"\n大冒险概率为:" + adventureProbability1 + "\n无惊无险概率为:" + safeProbability1, Toast.LENGTH_LONG).show();
            	mListener.onSettingChange(speed1,truthProbability1, adventureProbability1, safeProbability1);
            
            }
        } else {
        	dismiss();
        	// 关闭对话框
        }
    }
    public void setOnSettingChangeListener(OnSettingChangeListener listener) {
        mListener = listener;
    }

    public interface OnSettingChangeListener {
        void onSettingChange(int speed,int truthProb, int dareProb, int safeProb);
    }
}

五、运行效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 抽奖转盘是一种常见的游戏玩法,可以在Android Studio中实现。可以使用Canvas绘制转盘,然后使用动画实现旋转效果。还可以使用随机数生成器来确定抽奖结果。需要注意的是,抽奖转盘的设计应该符合用户体验,避免过于复杂或难以理解。 ### 回答2: Android Studio抽奖转盘是一种基于安卓开发平台的应用程序,它通过转盘的方式来实现抽奖的目的。抽奖转盘是功能相对简单,但现实生活中广泛应用的一个互动游戏。在实现抽奖转盘的应用中,可以通过安卓工具集成一系列功能实现开发过程,同时也可以结合一些开源库来实现更多的功能。 要实现抽奖转盘,我们需要一个圆形界面,可以在程序中通过绘制圆形实现。在圆形中间需要添加一个指针,指针在转动的时候与圆盘进行交互。在转盘的表面上,需要添加几段不同角度的弧形,每段弧形都可以对应一个中奖奖品。当程序启动后,转盘开始旋转,可以通过设置旋转速度和旋转时间的属性来实现这一功能。随着指针的旋转,最终会停在一个中奖区域内,这时程序会弹出提示框展示中奖的信息。 为了实现抽奖转盘的功能,需要注意以下几个方面: 首先,在制作过程中需要采用合适的布局,尽可能使得控件之间的关系清晰明了,从而方便后续开发和使用。 其次,在指针的旋转过程中,需要注意速度和转角的获取。这些数据的获取需要与程序中的计时器相关联,从而实现精准的控制。 最后,在展示中奖信息的过程中,需要考虑多种展示方式。这样可以让中奖结果得以灵活地展示,提高用户体验。 总之,抽奖转盘是一种非常有趣的互动方式,通过安卓工具和开源库的结合,我们可以轻松开发出一个功能强大的抽奖应用程序。 ### 回答3: Android Studio抽奖转盘是一款运行在Andriod Studio平台上的应用程序,其功能主要是模拟抽奖过程,让用户在其中获得激动人心的体验。抽奖转盘运用了许多Android Studio平台提供的强大工具和技术,例如可以使用Android代码编写软件界面、响应用户交互以及处理后端数据等。 抽奖转盘的实现需要考虑几个方面,其中包括:转盘的转动效果、奖品与转盘的匹配关系、奖品信息的显示、中奖结果的提示等。 对于转盘的转动效果,可以使用Android Studio提供的动画效果和视图动作等工具进行实现,这样可以使转盘具有更加真实的旋转效果。同时,为了保证抽奖过程的公平性,还需要进行奖品池的随机抽取,以及防止用户通过欺骗方式获得大量奖品。 在奖品与转盘的匹配关系方面,开发者可以使用数据库或者其他的数据存储工具,将奖品与对应的转盘区块进行关联,这样可以在转盘旋转过程中快速地获取结果并向用户展示。 与此同时,还需要对抽奖过程进行监控和分析,例如记录用户中奖记录、统计用户抽奖次数等。这样可以为后续的运营策略提供依据,同时还可以对抽奖过程进行改进和优化。 最后,为了使用户获得更加良好的体验,需要在中奖结果的提示方面进行创新,例如可以加入音乐、动画等元素,让用户感受到惊喜和快乐。除此之外,还需要在用户界面设计、交互方式等方面进行深入优化,以提升用户参与度和满意度。 总之,Android Studio抽奖转盘是一款内容和技术相对较为复杂的应用程序,需要开发者具备较强的技术水平和创新意识,并且需要在多个方面进行综合考虑和优化,才能够为用户提供优质的抽奖体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

左震编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值