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);
}
}
五、运行效果