心血来潮,走进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)

<?xmlversion="1.0"encoding="utf-8"?><RelativeLayoutxmlns: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><actionandroid:name="android.intent.action.MAIN"/><categoryandroid:name="android.intent.category.LAUNCHER"/></intent-filter></activity>

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

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

5.3具体开发Activity

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

publicclassSplitterActivityextendsActivityimplementsSensorEventListener{privateImageViewimageViewResult;privateTextViewtextViewMsg;privateint[][]result=newint[][]{{R.drawable.rock,R.string.rock_result_msg},{R.drawable.paper,R.string.paper_result_msg},{R.drawable.scissors,R.string.scissors_result_msg}};privateSensorManagersensorManager;privateSensorsensor;privateVibratorvibrator;privateSoundPoolsoundPool;privateintstreamSoundId;privatestaticfinalintUPDATE_VIEW=0x01;privateHandlerhandler=newHandler(){@OverridepublicvoidhandleMessage(Messagemsg){if(msg.what==UPDATE_VIEW){if(vibrator.hasVibrator()){vibrator.vibrate(newlong[]{200L,500L},-1);}soundPool.play(streamSoundId,0.5F,0.5F,5,0,1.0F);Randomrandom=newRandom();intindex=random.nextInt(result.length);imageViewResult.setImageResource(result[index][0]);textViewMsg.setText(result[index][1]);}}};publicSplitterActivity(){}@OverrideprotectedvoidonCreate(BundlesavedInstanceState){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=newSoundPool(10,AudioManager.STREAM_SYSTEM,5);streamSoundId=soundPool.load(this,R.raw.call_result,0);}@OverrideprotectedvoidonResume(){super.onResume();sensorManager.registerListener(this,sensor,SensorManager.SENSOR_DELAY_NORMAL);}@OverrideprotectedvoidonStop(){sensorManager.unregisterListener(this);if(null!=vibrator){vibrator.cancel();vibrator=null;}if(null!=soundPool){soundPool.release();soundPool=null;}super.onStop();}@OverridepublicvoidonSensorChanged(SensorEventevent){if(event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){float[]values=event.values;if(isNormalAcceler(values)){newThread(newRunnable(){@Overridepublicvoidrun(){Messagemsg=newMessage();msg.what=UPDATE_VIEW;handler.sendMessage(msg);}}).start();}}}privatebooleanisNormalAcceler(float[]values){intg=15;return(Math.abs(values[0])>g&&Math.abs(values[1])>g)||Math.abs(values[2])>g;}@OverridepublicvoidonAccuracyChanged(Sensorsensor,intaccuracy){}@OverridepublicbooleanonKeyDown(intkeyCode,KeyEventevent){if(keyCode==KeyEvent.KEYCODE_BACK){BackListenerbackListener=newBackListener();newAlertDialog.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();returntrue;}returnsuper.onKeyDown(keyCode,event);}privateclassBackListenerimplementsDialogInterface.OnClickListener{@OverridepublicvoidonClick(DialogInterfacedialog,intwhich){switch(which){caseDialogInterface.BUTTON_POSITIVE:SplitterActivity.this.finish();break;caseDialogInterface.BUTTON_NEGATIVE:break;default:break;}}}}


6.效果图

7.总结

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

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


本文出自 “野马红尘” 博客,谢绝转载!

更多相关文章

  1. 《Android开发从零开始》——25.数据存储(4)
  2. Android开发环境搭建
  3. 使用NetBeans搭建Android开发环境
  4. Android(安卓)Chromium WebView html js 开发系列
  5. [Android(安卓)NDK]Android(安卓)JNI开发例子 ---3 在JNI中实现o
  6. 【Android(安卓)开发教程】Toast通知
  7. Android开发——Android搜索框架(二)
  8. 第一章 andriod studio 安装与环境搭建
  9. android用户界面-组件Widget-画廊视图Gallery

随机推荐

  1. Android应用程序注册广播接收器(registerR
  2. 【Android(安卓)内存优化】Android(安卓)
  3. Android计算器低级错误?都是二进制惹的祸!
  4. Android中AsyncTask的简单用法
  5. .Android的Window类默认分类
  6. Android应用程序与SurfaceFlinger服务的
  7. 谷歌从Android市场中剔除恶意短信木马
  8. Android内核开发:学会分析系统的启动log
  9. Android系统启动流程解析
  10. Andropid自定义组件-坐标详解