当前位置: 首页 > 编程日记 > 正文

[Android]开发摇一摇分歧表决器过程

心血来潮,走进Android,准备开发一个摇一摇分歧表决器(PS:这个想法源自去年看的一个都市剧《约会专家》中主人公杭杭开发的分歧表决器APP)。


简述:摇一摇分歧表决器是一款Android App,通过将传统的手头剪刀布分歧表决游戏移植到智能手机上,玩家可以通过摇动手机还获取结果,PK对家。 (汗!)

目标:一款简单,易用的Android分歧表决App

设备要求:加速传感器,Android系统

涉及知识点:Android ImageView,TextView,RelativeLayout,Sensor,Vibrator,SoundPool

开始动手:

1.在Eclipse中创建Android 项目

2.准备资源文件,石头,剪刀,布,和玩法示意图,AppIcon四张图片,结果提示音(mp3)

3.创建布局文件(activity_splitter.xml)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/main_layout"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><ImageViewandroid:id="@+id/image_result"android:layout_width="match_parent"android:layout_height="375dp"android:layout_alignParentTop="true"android:layout_centerHorizontal="true"android:contentDescription="@string/image_desc_msg"android:scaleType="fitXY"android:scrollbars="none"android:src="@drawable/rules" /><TextViewandroid:id="@+id/text_msg"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_below="@id/image_result"android:layout_centerVertical="true"android:layout_marginTop="50dp"android:gravity="center_horizontal"android:text="@string/user_method_msg"android:textStyle="bold" />
</RelativeLayout>

4.实现思路

4.1启动App,在ImageView中展示玩法图片,TextView显示玩法说明;

4.2玩家摇动手机,应用程序通过加速传感器获得手机加速度,当加速度达到指定范围,发送更新UI界面消息;

4.3通过消息处理机制,更新UI界面,在ImageView中展示结果图片(石头,剪刀,布三者之一),TextView显示对应的文字说明,并伴随提示音和轻微震动。


5.开发实现

5.1该应用极其简单,仅有一个Activity,在ApplicationManifest.xml中配置启动界面

<activityandroid:name=".SplitterActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity>

5.2应用程序使用到设备的震动,在ApplicationManifest.xml中配置权限

<uses-permission android:name="android.permission.VIBRATE" />

5.3具体开发Activity

需要熟悉:SensorManager,Sensor,SoundPool,Handler这几个类的使用,自己实现SensorEventListener接口方法,如下onSensorChanged,onAccuracyChanged方法。

public class SplitterActivity extends Activity implements SensorEventListener {private ImageView imageViewResult;private TextView textViewMsg;private int[][] result = new int[][] {{ R.drawable.rock, R.string.rock_result_msg },{ R.drawable.paper, R.string.paper_result_msg },{ R.drawable.scissors, R.string.scissors_result_msg } };private SensorManager sensorManager;private Sensor sensor;private Vibrator vibrator;private SoundPool soundPool;private int streamSoundId;private static final int UPDATE_VIEW = 0x01;private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {if (msg.what == UPDATE_VIEW) {if (vibrator.hasVibrator()) {vibrator.vibrate(new long[] { 200L, 500L }, -1);}soundPool.play(streamSoundId, 0.5F, 0.5F, 5, 0, 1.0F);Random random = new Random();int index = random.nextInt(result.length);imageViewResult.setImageResource(result[index][0]);textViewMsg.setText(result[index][1]);}}};public SplitterActivity() {}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.setContentView(R.layout.activity_splitter);imageViewResult = (ImageView) this.findViewById(R.id.image_result);textViewMsg = (TextView) this.findViewById(R.id.text_msg);sensorManager = (SensorManager) this.getSystemService(SENSOR_SERVICE);sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);vibrator = (Vibrator) this.getSystemService(VIBRATOR_SERVICE);soundPool = new SoundPool(10, AudioManager.STREAM_SYSTEM, 5);streamSoundId = soundPool.load(this, R.raw.call_result, 0);}@Overrideprotected void onResume() {super.onResume();sensorManager.registerListener(this, sensor,SensorManager.SENSOR_DELAY_NORMAL);}@Overrideprotected void onStop() {sensorManager.unregisterListener(this);if (null != vibrator) {vibrator.cancel();vibrator = null;}if (null != soundPool) {soundPool.release();soundPool = null;}super.onStop();}@Overridepublic void onSensorChanged(SensorEvent event) {if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {float[] values = event.values;if (isNormalAcceler(values)) {new Thread(new Runnable() {@Overridepublic void run() {Message msg = new Message();msg.what = UPDATE_VIEW;handler.sendMessage(msg);}}).start();}}}private boolean isNormalAcceler(float[] values) {int g = 15;return (Math.abs(values[0]) > g && Math.abs(values[1]) > g)|| Math.abs(values[2]) > g;}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK) {BackListener backListener = new BackListener();new AlertDialog.Builder(this).setIcon(android.R.drawable.ic_dialog_info).setTitle(R.string.app_name).setMessage(R.string.exite_app_info).setPositiveButton(R.string.leave, backListener).setNegativeButton(R.string.without, backListener).show();return true;}return super.onKeyDown(keyCode, event);}private class BackListener implements DialogInterface.OnClickListener {@Overridepublic void onClick(DialogInterface dialog, int which) {switch (which) {case DialogInterface.BUTTON_POSITIVE:SplitterActivity.this.finish();break;case DialogInterface.BUTTON_NEGATIVE:break;default:break;}}}
}


6.效果图

wKioL1TEgYHShI3RAAFHZHsmsLA348.jpgwKiom1TEgKbyBhERAAE2ZudrOV8909.jpg

7.总结

通读了Android官方开发文档之后,感觉不得要领。唯找出一个目标App,进行模仿,在此过程不断深入了解其中原理,API文档,反复回顾Android开发知识体系,久而久之就能开发自己的想要的Android应用了。

另外就是针对某一知识点,比如:Activity,ContentProvider,View 等做示例,实验,探究;最后将四大组件,各种布局结合起来,集成各种服务实现完备应用,这样就基本掌握了Android开发。接下来就该深入探究其中机理。


相关文章:

C和C++安全编码笔记:整数安全

5.1 整数安全导论&#xff1a;整数由包括0的自然数(0, 1, 2, 3, …)和非零自然数的负数(-1, -2, -3, …)构成。 5.2 整数数据类型&#xff1a;整数类型提供了整数数学集合的一个有限子集的模型。一个具有整数类型的对象的值是附着在这个对象上的数学值。一个具有整数类型的对象…

8.3折特惠票仅剩3天!「2019 嵌入式智能国际大会」全日程大公开!

8.3折特惠票仅剩3天立即抢购&#xff1a;https://t.csdnimg.cn/otBk还有5天&#xff0c;大伙期待的「2019嵌入式智能国际大会」正式开幕了&#xff01;2019年12月6日-7日&#xff0c;我们在深圳市人才研修院见&#xff01;大会以“万物互联泛在智能”为主题&#xff0c;邀请30位…

iOS点击空白收回键盘

//点击空白收回键盘 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [self.view endEditing:YES]; }

第一个net-mvc程序

结构 视图层 <% Page Language"C#" Inherits"System.Web.Mvc.ViewPage<dynamic>" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">…

iOS 储存用户信息设置封装 直接调用即可(部分是代码片段)

、、、、、、、、、、、、、、、、、、首先 定义 UserInfo #import <Foundation/Foundation.h> interface UserInfo : NSObject //用户id property (nonatomic, strong) NSString *userID; //用户名 property (nonatomic, strong) NSString *userName; //密码 propert…

ASN.1简介及OpenSSL中ASN.1接口使用举例

ASN.1(Abstract Syntax Notation One)是一套标准&#xff0c;是描述数据的表示、编码传输、解码的灵活的记法。它提供了一套正式、无歧义和精确的规则以描述独立于特定计算机硬件的对象结构。OpenSSL的编码方法就是基于该标准。ASN.1是一种结构化的数字对象描述语言&#xff0c…

谁是当今最顶级的技术?SQL、Java、Python、C++ 皆上榜!

【12月公开课预告】&#xff0c;入群直接获取报名地址12月11日晚8点直播主题&#xff1a;人工智能消化道病理辅助诊断平台——从方法到落地12月12日晚8点直播&#xff1a;利用容器技术打造AI公司技术中台12月17日晚8点直播主题&#xff1a;可重构计算&#xff1a;能效比、通用性…

将表里的数据批量生成INSERT语句的存储过程 增强版

原文:将表里的数据批量生成INSERT语句的存储过程 增强版将表里的数据批量生成INSERT语句的存储过程 增强版 有时候&#xff0c;我们需要将某个表里的数据全部或者根据查询条件导出来&#xff0c;迁移到另一个相同结构的库中 目前SQL Server里面是没有相关的工具根据查询条件来生…

通过OpenSSL的接口实现Base64编解码

对openssl genrsa产生的rsa私钥pem文件&#xff0c;使用普通的base64解码会有问题&#xff0c;如使用https://blog.csdn.net/fengbingchun/article/details/85218653 中介绍的方法&#xff0c;一是有可能不能从返回的结果中直接使用strlen来获得最终字符的大小&#xff0c;因为…

激辩:机器究竟能否理解常识?

【12月公开课预告】&#xff0c;入群直接获取报名地址12月11日晚8点直播主题&#xff1a;人工智能消化道病理辅助诊断平台——从方法到落地12月12日晚8点直播&#xff1a;利用容器技术打造AI公司技术中台12月17日晚8点直播主题&#xff1a;可重构计算&#xff1a;能效比、通用性…

Mac OS X 下Node.js开发环境的搭建

1.安装Xcode2.安装Homebrew 谷歌搜索Homebrew 复制命令行 打开终端 粘贴命令行 点击回车 安装 输入密码等2.安装Nodejs利用Homebrew安装nodejs打开终端 输入 &#xff1a;brew install nodejs 回车查询nodejs版本&#xff1a;node --version3.安装文档数据库 MongoDB打开终…

.NET 使用 MySql.Data.dll 动态库操作MySql的帮助类--MySqlHelper

.NET 使用 MySql.Data.dll 动态库操作MySql的帮助类--MySqlHelper 參考演示样例代码&#xff0c;例如以下所看到的&#xff1a; /// <summary>/// MySql 数据库操作类/// </summary>public class MySqlHelper{/// <summary>/// MysqlConnection/// </summ…

Instagram个性化推荐工程中三个关键技术是什么?

作者 | Ivan Medvedev&#xff0c;Haotian Wu&#xff0c;Taylor Gordon译者 | 陆离编辑 | Jane出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09; 【导语】近期&#xff0c;Facebook 在博客上分享了第一篇详细介绍 Explore 系统关键技术&#xff0c;以及 I…

iOS UIbutton 点击无反应的几种情况

1、UIButton不能点击情况的第一种是&#xff0c;你将button添加到一个不能响应点击事件的View里。如你将button添加到UIImageView中&#xff0c;解决办法只需将UIImageView的 userInteractionEnabled设为YES即可。 例如&#xff1a; self.headImgV [[UIImageView alloc] ini…

C和C++安全编码笔记:格式化输出

C标准中定义了一些可以接受可变数量参数的格式化输出参数&#xff0c;参数中包括一个格式字符串。printf()和sprintf()都是格式化输出函数的例子。格式化输出函数是由一个格式字符串和可变数目的参数构成的。在效果上&#xff0c;格式化字符串提供了一组可以由格式化输出函数解…

谈谈UI架构设计的演化

谈谈UI架构设计的演化 经典MVC 在1979年&#xff0c;经典MVC模式被提出。 在当时&#xff0c;人们一直试图将纯粹描述思维中的对象与跟计算机环境打交道的代码隔离开来&#xff0c;而Trygve Reenskaug在跟一些人的讨论中&#xff0c;逐渐剥离出一系列的概念&#xff0c;最初是T…

JWT(JSON Web Token)简介及实现

JWT(JSON Web Token)&#xff1a;是一个开放标准(RFC 7519)&#xff0c;它定义了一种紧凑且自包含的方式&#xff0c;用于在各方之间作为Json对象安全地传输信息。由于此信息是经过数字签名的&#xff0c;因此可以被验证和信任。可以使用HMAC SHA256或RSA等对JWT进行签名。 JW…

iOS UIImageView 加载含有汉字的url处理方法

NSString *url [model.pic stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; [self.headImgView sd_setImageWithURL:[NSURL URLWithString:url]];

《评人工智能如何走向新阶段》后记

由AI科技大本营下载自视觉中国自《评人工智能如何走向新阶段》一文发表&#xff08;在内部&#xff09;后&#xff0c;引来了中外专家、草根们的广泛议论&#xff0c;有深有浅&#xff0c;其中似有一些思考价值&#xff0c;故录入本文后记&#xff1a; 中外专家、草根们23条议…

用XCA(X Certificate and key management)可视化程序管理SSL 证书(3)--创建自己定义的凭证管理中心(Certificate Authority)...

在第“用XCA&#xff08;X Certificate and key management&#xff09;可视化程序管理SSL 证书&#xff08;2&#xff09;---创建证书请求”章节中&#xff0c;我们介绍了怎样用XCA创建SSL证书请求&#xff08;Certificate Request&#xff09;&#xff0c;在一章节中&#xf…

C和C++安全编码笔记:并发

并发是一种系统属性&#xff0c;它是指系统中几个计算同时执行&#xff0c;并可能彼此交互。一个并发程序通常使用顺序线程和(或)进程的一些组合来执行计算&#xff0c;其中每个线程和进程执行可以在逻辑上并行执行的计算。这些进程和(或)线程可以在单处理器系统上使用分时抢占…

《评人工智能如何走向新阶段》后记(再续1)

由AI科技大本营下载自视觉中国中外专家、草根对《评人工智能如何走向新阶段》一文进行广泛议论&#xff0c;已在《后记》中发表原创&#xff08;未加修改&#xff09;的23条议论&#xff0c;现再续发24-30条如下&#xff1a; 24.最近半年来&#xff0c;人工智能的发展重心逐渐…

iOS UITextView 随键盘弹出界面上移

- (void)textViewDidBeginEditing:(UITextView *)textView { CGRect frame textView.frame; int offSet frame.origin.y 70 - (self.view.frame.size.height - 216.0); //iphone键盘高度为216.iped键盘高度为352 [UIView beginAnimations:"ResizeForKeyboard" co…

H3C 交换机命名规则

例&#xff1a;H3C-S5500-28C-EIH3C&#xff1a;为固定值&#xff0c;就是“H3C”这个品牌S的位置&#xff1a;代表产品系列『S 代表交换机SR 代表业务路由器』第一个5的位置:代表产品子系列号『3系为千兆上行,百兆下行的合适交换机 例:S3600 S31005系为全千兆的盒式交换机 …

iOS 时间选择器封装(含三种模式)

#import <UIKit/UIKit.h> typedef enum : NSUInteger { DatePickerViewDateTimeMode,//年月日,时分 DatePickerViewDateMode,//年月日 DatePickerViewTimeMode//时分 } DatePickerViewMode; protocol DateTimePickerViewDelegate <NSObject> optional /** * 确定按…

C和C++安全编码笔记:总结

《C和C安全编码》(原书第2版)这本书是2013年出版的。 这里是基于之前所有笔记的简单总结&#xff0c;笔记列表如下&#xff1a; 字符串&#xff1a;https://blog.csdn.net/fengbingchun/article/details/105325508 指针诡计&#xff1a;https://blog.csdn.net/fengbingchun/…

《评人工智能如何走向新阶段》后记(再续2)

由AI科技大本营下载自视觉中国从朋友那里获知&#xff0c;有一块供大家自由议论人工智能的园地&#xff08;内部的&#xff09;&#xff0c;我通过有关关系进入后&#xff0c;一览之余&#xff0c;果然生动活泼&#xff0c;没有学究气&#xff0c;从已发表的30条议论来看。有原…

Dokku和Docker的完美配合

看到一篇不错的文章&#xff0c;收藏一下&#xff1a; 【编者的话】本文作者介绍了如何在单机上将Dokku和Docker结合。Dokku是一个小型的PaaS平台&#xff0c;只需使用Git将代码push到对应的仓库上就能自动触发部署&#xff0c;构建过程非常简单。但是Dokku对于用户来说&#x…

iOS封装分页效果

#import <UIKit/UIKit.h> interface WPageTitleView : UIView property (nonatomic,assign) NSInteger selectedIndex; //添加参数数组 property (nonatomic,strong) NSArray *titles; property (nonatomic,copy) void (^buttonSelected)(NSInteger index); end #impo…

Windows/Linux TCP Socket网络编程简介及测试代码

典型的网络应用是由一对程序(即客户程序和服务器程序)组成的&#xff0c;它们位于两个不同的端系统中。当运行这两个程序时&#xff0c;创建了一个客户进程和一个服务器进程&#xff0c;同时它们通过从套接字(socket)读出和写入数据在彼此之间进行通信。开发者创建一个网络应用…