




已阅读5页,还剩90页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
.,1,第5章手机加速度传感器,5.1传感器sensor简介5.2加速度传感器原理5.3加速度传感器的基本认识5.4加速度传感器的基本应用5.5加速度传感器的实战应用,.,2,5.1传感器sensor简介,问:1)你是否听说过传感器?2)你对它有多少认识?3)你觉得它在未来有多少潜能?,.,3,5.1.1传感器是什么?分析:传感器就是一种特殊的外设,感受外界的参数变化,然后反应到手机上面。参数包括:磁场、温度、压力、重力加速度、声音。5.1.2传感器的分类有哪些?分析:按测量物理量分类加速度传感器(accelerometer)陀螺仪传感器(gyroscope)环境光照传感器(light)磁力传感器(magneticfield)方向传感器(orientation)压力传感器(pressure)距离传感器(proximity)温度传感器(temperature),.,4,5.1.3传感器的作用有哪些?1)传感器是人类五官的延伸2)获取准确可靠的信息,更好的研究自然现象和规律以及生产活动3)监视和控制生产过程中的各个参数,使设备工作在正常状态或最佳状态,并使产品达到最好的质量。4)一些新机理和高灵敏度的检测传感器的出现,往往会有边缘学科开发上的突破5)让用户对智能手机更加着迷,.,5,5.2加速度传感器原理-以手机加速度传感器为例,5.2.1加速度传感器的结构我们看到右图1,你是否回忆起初高中物理课上学过的弹簧测力计。,图1,.,6,分析:弹簧测力计的原理是弹簧伸长的长度与施加在它上面的压力成正比。当我们向上移动弹簧测力计时,弹簧就会由于惯性拉伸,我们只需根据弹簧测力计的距离既可以计算出重力。而我们的加速度计的原理便是利用了这个。你可以很直观感觉到,当我们有三个这样的测力计,便能测出物体的三维运动方向了。,.,7,如右图2:当y轴和z轴水平时,只有x轴能读出被拉伸的弹簧数据。如右图3:当x轴和y轴水平时,只有z轴能读出弹簧被拉伸的数值了。,图2,图3,.,8,工程师用在芯片里用硅做成的微小加速度计,样子如图4:加速度传感器就是利用了其内部芯片的由于加速度造成的晶体变形这个特性。由于这个变形会产生电压,只要计算出产生电压和所施加的加速度之间的关系,就可以将加速度转化成电压输出。,思考:那么手机和芯片又是怎么检测重力的变化呢?,图4,.,9,最后我们的手机加速度传感器感应加速度的方向大致如右图5:X表示左右移动的加速度Y表示前后移动的加速度Z表示垂直方向的加速度,图5,.,10,手机不同位置的加速度值:当将手机平放在水平面上,Z轴朝向天空,三轴加速度值默认分别是(0,0,10)当X轴朝向天空,三轴加速度值分别是(10,0,0)当X轴朝向地面,三轴加速度值分别是(-10,0,0)当手机屏幕垂直竖立放置,Y轴朝向天空,(0,10,0)当手机屏幕垂直竖立放置,Y轴朝向地面,(0,-10,0)总结:向上的就是正的,朝下的就是负的,5.2.2加速度传感器获取数据,.,11,传感器事件1)加速度传感器元件焊到手机中供软件开发过程师使用。在编写android程序时,需要注册加速度传感器。FrameworkAPI对加速度输出进行封装,提供一个传感器类,我们就根据当前的传感器类型获得需要的值。因为传感器的值是频率性的,即每固定毫秒返回一个值。所以我们需要一个触发机制,要用事件监听。2)当加速度传感器监测到手机加速度变化的时候,就会产生一个传感器事件3)传感器事件也是一个对象4)应用程序从传感器事件对象获取这时刻的手机加速度,手机应用程序,加速度传感器,距离传感器,温度传感器,.,12,传感器相关的类,sensorManager,sensor,sensorEvent,sensorListener,确定,通知数据变化,提供,使用,.,13,注册/*第一个参数为Listener实例,第二个参数为想接收的传感器,第三个参数为接收频度*/销毁/*来销毁一个传感器*/,mSensorManager.registerListener(this,mAccelerometer,SensorManager.SENSOR_DELAY_NORMAL);,mSensorManager.unregisterListener(this);,.,14,动作处理过程,.,15,5.3加速度传感器的基本认识,5.3.1通过手机加速度传感器获取加速度5.3.2通过手机加速度传感器获取加速度变化曲线,.,16,5.3.1通过手机加速度传感器获取加速度,思考:通过上面的讲解,你是否可以自己动手写获取加速度的小程序了呢?,.,17,AndroidManifest.xml结构,.,18,AndroidManifest.xml-分解1,/*这个名称是给用户看的,可以将你的APP版本号设置为1.0版,后续更新版本设置为1.1*/,.,19,AndroidManifest.xml-分解2,元素允许配置我们的应用*/android:minSdkVersion=8/*指明该应用程序可以运行的API最低版本。默认是“1”。*/android:targetSdkVersion=15/*指明该应用程序设计时期望运行的目标API版本。这允许应用程序使用目标API级别下定义的清单元素或行为,而不是只限于使用最低API级别定义的内容。*/*是一个资源的风格,它定义了一个默认的主题风格给所有的activity,当然也可以在自己的theme里面去设置它,有点类似style。*/,.,21,AndroidManifest.xml-分解4,/*Intentfilter内会设定的资料包括action,data与category三种。action很简单,只有android:name这个属性。常见的android:name值为ent.action.MAIN,表明此activity是作为应用程序的入口。*/,.,22,layout布局文件(XML)代码,.,23,加速度获取的代码,packagecom.example.gravity;importandroid.hardware.Sensor;importandroid.hardware.SensorEvent;importandroid.hardware.SensorEventListener;importandroid.hardware.SensorManager;importandroid.os.Bundle;importandroid.app.Activity;importandroid.view.Menu;importandroid.widget.TextView;publicclassGravityActivityextendsActivityimplementsSensorEventListenerprivateSensorManagersensorManager;privateSensorsensor;privateTextViewtv1;privateTextViewtv2;privateTextViewtv3;privatefloatgravity=newfloat3;OverridepublicvoidonCreate(BundlesavedInstanceState)super.onCreate(savedInstanceState);setContentView(R.layout.activity_gravity);tv1=(TextView)findViewById(R.id.textView1);tv2=(TextView)findViewById(R.id.textView2);tv3=(TextView)findViewById(R.id.textView3);/1、得到sensorManager对象sensorManager=(SensorManager)this.getSystemService(SENSOR_SERVICE);/2、得到sensorsensor=sensorManager.getDefaultSensor(SensorManager.SENSOR_ACCELEROMETER);/3、得到感应事件监听,通过注册实现,.,24,OverridepublicbooleanonCreateOptionsMenu(Menumenu)getMenuInflater().inflate(R.menu.activity_gravity,menu);returntrue;OverrideprotectedvoidonPause()/TODOAuto-generatedmethodstubsuper.onPause();sensorManager.unregisterListener(this);OverrideprotectedvoidonResume()/TODOAuto-generatedmethodstubsuper.onResume();sensorManager.registerListener(this,sensor,sensorManager.SENSOR_DELAY_NORMAL);OverridepublicvoidonAccuracyChanged(Sensorarg0,intarg1)/TODOAuto-generatedmethodstubOverridepublicvoidonSensorChanged(SensorEventevent)/TODOAuto-generatedmethodstub/alphaiscalculatedast/(t+dT)/witht,thelow-passfilterstime-constant/anddT,theeventdeliveryratefinalfloatalpha=0.8f;gravity0=event.values0;gravity1=event.values1;gravity2=event.values2;tv1.setText(x=+gravity0);tv2.setText(y=+gravity1);tv3.setText(z=+gravity2);,.,25,代码分析,GravityActivity类继承Activity类GravityActivity类实现SensorEventListener类接口实现加速度数据的收集显示在onCreate方法中,设置传感器对象在onSensorChanged方法中,进行事件监听显示用三个TextView,参数为由R类索引的TextView,.,26,代码分解-1/*定义变量*/,publicclassGravityActivityextendsActivityimplementsSensorEventListenerprivateSensorManagersensorManager;privateSensorsensor;privateTextViewtv1;privateTextViewtv2;privateTextViewtv3;privatefloatgravity=newfloat3;,.,27,如何获取传感器加速度?,获得传感器管理对象通过传感器管理对象的getDefaultSensor()获得传感器对象注册传感器对象传感器事件监听,.,28,定义变量在onCreate()中,privateSensorManagersensorManager;,sensorManager=(SensorManager)this.getSystemService(SENSOR_SERVICE);,.,29,如何获取传感器加速度?,获得传感器管理对象通过传感器管理对象的getDefaultSensor()获得传感器对象注册传感器对象传感器事件监听,.,30,定义常量在onCreate()中,privateSensorsensor;,sensor=sensorManager.getDefaultSensor(SensorManager.SENSOR_ACCELEROMETER);,.,31,代码分解-2/*onCreate()讲解*/,OverridepublicvoidonCreate(BundlesavedInstanceState)super.onCreate(savedInstanceState);setContentView(R.layout.activity_gravity);/*findviewbyid主要是通过id来查找layout布局文件View上的子控件,它返回的是一个View对象*/tv1=(TextView)findViewById(R.id.textView1);tv2=(TextView)findViewById(R.id.textView2);tv3=(TextView)findViewById(R.id.textView3);/*得到sensorManager传感器管理对象。getSystemService是Android很重要的一个API,它是Activity的一个方法,根据传入的Name来取得对应的object,然后转换成相应的服务对象。*/sensorManager=(SensorManager)this.getSystemService(SENSOR_SERVICE);/*通过传感器管理对象的getDefaultSensor()获得传感器对象得到sensor*/sensor=sensorManager.getDefaultSensor(SensorManager.SENSOR_ACCELEROMETER);,.,32,如何获取传感器加速度?,获得传感器管理对象通过传感器管理对象的getDefaultSensor()获得传感器对象注册传感器对象传感器事件监听,.,33,代码讲解-3/*注册传感器*/和/*注销传感器*/,/*注册传感器对象*/OverrideprotectedvoidonResume()/TODOAuto-generatedmethodstubsuper.onResume();/*第一个参数为Listener实例,第二个参数为想接收的传感器,第三个参数为接收频度*/sensorManager.registerListener(this,sensor,sensorManager.SENSOR_DELAY_NORMAL);/*注销传感器对象*/OverrideprotectedvoidonPause()/TODOAuto-generatedmethodstubsuper.onPause();sensorManager.unregisterListener(this);,.,34,如何获取传感器加速度?,获得传感器管理对象通过传感器管理对象的getDefaultSensor()获得传感器对象注册传感器对象传感器事件监听,.,35,代码讲解-4/*传感器事件监听*/,/*SensorEventListener是使用传感器的核心部分.onSensorChanged(SensorEventevent):在传感器值更改时调用。SensorEvent对象包括传感器获得的方向、加速度等信息。如下传感器一旦发现加速度值变化,便收集数据。*/OverridepublicvoidonSensorChanged(SensorEventevent)/TODOAuto-generatedmethodstubgravity0=event.values0;gravity1=event.values1;gravity2=event.values2;tv1.setText(x=+gravity0);tv2.setText(y=+gravity1);tv3.setText(z=+gravity2);/*onAccuracyChanged(Sensorsensor,intaccuracy):传感器的精准度发生变化时调用。accuracy表示新精度值。*/OverridepublicvoidonAccuracyChanged(Sensorarg0,intarg1)/TODOAuto-generatedmethodstub,.,36,效果演示,.,37,5.3.2通过手机加速度传感器获取加速度变化曲线,前面5.3.1的程序可以让我们读出某个时刻的加速度值,但是无法观察加速度的变化过程。下面我们利用Canvas来模拟出加速度的变化曲线图。Canvas相当于画布Paint相当于画笔注意:我们显示的曲线实际是无数个小圆点集成的线。在每一时刻的加速度都有一个点,一段时间上累积成一条线。,.,38,效果展示,x轴加速度-红色y轴加速度-黄色z轴加速度-绿色,.,39,AndroidManifest.xml结构(与前面基本相同不再分解讲解),.,40,layout布局文件,/*注意:SurfaceView提供直接访问一个可画图的界面,可以控制在界面顶部的子视图层。Surface是内存中一块区域,它是surfaceview可见的那个部分,绘图操作作用于它,然后它会被显卡之类的显示控制器绘制到屏幕上。*/,.,41,显示加速度变化曲线的代码,完整代码链接,.,42,代码讲解-1/*导入的包*/,/*导入的包*/packagecom.example.accelerometerdatashow;importjava.security.InvalidAlgorithmParameterException;importorg.apache.http.conn.scheme.HostNameResolver;importandroid.graphics.Canvas;importandroid.graphics.Color;importandroid.graphics.Paint;importandroid.graphics.Rect;importandroid.graphics.drawable.Drawable;importandroid.graphics.drawable.Drawable.Callback;importandroid.hardware.Sensor;importandroid.hardware.SensorEvent;importandroid.hardware.SensorEventListener;importandroid.hardware.SensorManager;importandroid.os.Bundle;importandroid.R.color;importandroid.app.Activity;importandroid.util.Log;importandroid.view.Menu;importandroid.view.SurfaceHolder;importandroid.view.SurfaceView;importandroid.widget.TextView;,.,43,代码分析,AccelerometerActivity类继承Activity类AccelerometerActivity类实现SensorEventListener类接口实现加速度数据变化曲线的显示在onCreate方法中,获得传感器对象,获得surfaceview对象在onSensorChanged方法中,进行事件监听,获得加速度值,并用canvas画图,.,44,代码讲解-2/*定义变量和常量*/,/*定义变量和常量*/publicclassAccelerometerActivityextendsActivityimplementsSensorEventListenerprivateCanvascanvas;privatePaintpaint;privateSurfaceViewsurfaceView;privateSurfaceHoldersurfaceHolder;privateSensorManagersensorManager;privateSensorsensor;privatefloatAccelX=0;privatefloatAccelY=0;privatefloatAccelZ=0;/*注意:n是显示的曲线的横坐标的变量,纵坐标是加速度的值,所以n开始是0*/privateintn=0;,.,45,n,0,加速度值,1,2,.,46,新概念有点多,要认真!,在layout布局文件中我们稍微提到了surfaceview和surface。这里我们解释一下。,SurfaceView,顾名思义就是Surface的View,通过SurfaceView就可以看到Surface的部分或者全部的内容。学过数据库的同学可以这样理解,Surface就是管理数据的地方,SurfaceView就是展示数据的地方。,讲到这里或许大家有点困惑,数据库设计中我们用sql语句创建view显示,在surface中呢?其实,Surface中有一个Canvas成员,专门用于画图的。而画好的图必须在surfaceview中才能显示。,.,47,你到了这里或许又有疑问,我们知道数据库不是随随便便都能访问的。surface相当于管理数据的地方,那我们怎么访问和控制surface呢?,SurfaceHolder是一个接口,其作用就像一个关于Surface控制器。提供访问和控制SurfaceView背后的Surface相关的方法。它通过三个回调方法,让我们可以感知到Surface的创建、销毁和改变。在SurfaceView中有一个方法getHolder,很方便地获得可以访问SurfaceView所对应的Surface所对应的SurfaceHolder。,前面已经讲到SurfaceHolder是一个接口,它通过回调方法的方式,让我们可以感知到Surface的创建、销毁或者改变。其实这一点是通过其内部的静态子接口SurfaceHolder.Callback来实现的。SurfaceHolder.Callback中定义了三个方法。,.,48,补充:回调函数,在Java中,类A调用类B中的某个方法b,然后类B又在某个时候反过来调用类A中的某个方法a,对于A来说,这个a方法便叫做回调方法。可以举个现实生活中的例子:一读者想借物联网编程技术这本书,但这本书已被其他读者借走了。于是,读者与图书馆管理员间发生了以下对话:读者:“我把我的电话号码告诉你,等书一到就马上通知我。”管理员:“好的。另一读者把书还回来后,马上给您打电话,书我先帮您留着。”在上述这个场景中,开始时是读者咨询管理员。后来管理员需要通知读者时,就是一个回调过程。读者就是“回调对象”,管理员就是“控制器对象”,读者的电话号码就是“回调对象的方法”。明白了吗?,.,49,在我们的程序中又是怎么实现回调的呢?,1、通过Activity提供的setContentView等方法将SurfaceView添加到主界面中。android.view.Surface是SurfaceView的一个成员变量2、SurfaceView相当于数据库中的视图,Surface是管理数据的地方。3、当SurfaceView窗口可见的时候,会创建一个Surface对象。通过SurfaceHolder.Callback访问控制Surface就可以取到当前窗口获得的加速度数据。4、Surface中有一个Canvas成员,专门用于画图。5、画好的图需要通过SurfaceHolder.Callback接口下的回调方法显示在SurfaceView上。注意:用到SurfaceHolder.Callback中的哪个函数要根据是第一次创建还是surface状态改变来决定。,.,50,前面讲了四个很重要的概念,请大家好好回顾下!,.,51,如何显示代表某一时刻加速度值圆点?,(1)继承SurfaceView(视图)并实现控制器子接口(SurfaceHolder.Callback)(2)SurfaceView.getHolder()获得控制器(SurfaceHolder)对象(3)SurfaceHolder.addCallback(callback)添加回调函数(4)SurfaceHolder.lockCanvas()获得Canvas(画布)对象并锁定画布(5)Canvas绘画(6)SurfaceHolder.unlockCanvasAndPost(Canvascanvas)结束锁定画图,并提交改变,将图形显示。,.,52,用到SurfaceView,是View的一种特殊子类,它在View派生树中提供一个专门的绘画接口。这里用到了一个类SurfaceHolder,可以把它当成surface的控制器,用来操纵surface。处理它的Canvas上画的效果和动画,控制表面,大小,像素等。注意:给SurfaceView当前的持有者一个回调对象。,surfaceView=(SurfaceView)findViewById(R.id.surfaceview);,SurfaceHolder.Callbackcallback。surfaceHolder=surfaceView.getHolder();,surfaceHolder.addCallback(SurfaceHolder.Callbackcallback);,.,53,代码讲解-3/*onCreate()讲解*/,/*onCreate()讲解*/publicvoidonCreate(BundlesavedInstanceState)super.onCreate(savedInstanceState);setContentView(R.layout.activity_accelerometer);/*得到sensorManager对象*/sensorManager=(SensorManager)this.getSystemService(SENSOR_SERVICE);/*得到sensor对象*/sensor=sensorManager.getDefaultSensor(SensorManager.SENSOR_ACCELEROMETER);/*获得surfaceview对象,通过id查找*/surfaceView=(SurfaceView)findViewById(R.id.surfaceview);/*类SurfaceHolder,可以把它当成surface的控制器,用来操纵surface。处理它的Canvas上画的效果和动画,控制表面,大小,像素等。*/surfaceHolder=surfaceView.getHolder();/*用addcallback()来回调SurfaceView。因为myHolder继承了SurfaceHolder.callback接口,重写了callback的三个函数,所以要用addcallback将这三个函数与Surface关联起来*/surfaceHolder.addCallback(newmyHolder();/*设置画笔*/paint=newPaint();/*设置线宽*/paint.setStrokeWidth(1.0f);,.,54,代码讲解-4/*注册传感器*/和/*注销传感器*/,/*注册传感器*/OverrideprotectedvoidonResume()/TODOAuto-generatedmethodstubsuper.onResume();sensorManager.registerListener(this,sensor,sensorManager.SENSOR_DELAY_NORMAL);/*注销传感器*/OverrideprotectedvoidonPause()/TODOAuto-generatedmethodstubsuper.onPause();sensorManager.unregisterListener(this);,.,55,加速度值获取并显示,在onSensorChanged()中,收集某一加速度值获得Canvas对象并锁定画布。(提问:为什么要锁定画布?下一张ppt见分晓。)画布不为空,就用canvas.drawCircle()画圆点-因为我们画的曲线有三条,为了区分开三条曲线,我们分别把三条曲线的纵坐标加上固定值100、200、300。,.,56,处理一个SurfaceView对象时,可以从SurfaceHolder.lockCanvas()获取一个Canvas,锁定画布。为了提高效率只重绘变化的部分则可以调用lockCanvas(Rectrect)函数来指定一个rect区域,这样该区域外的内容会缓存起来。在调用lockCanvas函数获取Canvas后,SurfaceView会获取Surface的一个同步锁直到调用unlockCanvasAndPost(Canvascanvas)函数才释放该锁,这里的同步机制保证在Surface绘制过程中不会被改变(被摧毁、修改)。而在我们的程序中通常绘画的区域是整个canvas。注意第60页ppt的画布区域不一样。,canvas=surfaceHolder.lockCanvas();,.,57,代码讲解-5/*onSensorChanged()讲解*/,/*onSensorChanged()讲解*/*接收三个加速度*/AccelX=event.values0;AccelY=event.values1;AccelZ=event.values2;/*获得Canvas对象并锁定画布*/canvas=surfaceHolder.lockCanvas();tryif(canvas!=null)/*画笔的颜色红色,画X轴*/paint.setColor(Color.RED);/*绘制圆形,这里是小圆点,圆心的坐标x是n,y坐标是100+AccelX,半径是1,画笔是paint*/canvas.drawCircle(n,100+AccelX,1,paint);,.,58,代码讲解-6,/*画笔的颜色黄色,画Y轴*/paint.setColor(Color.YELLOW);canvas.drawCircle(n,200+AccelY,1,paint);/*画笔的颜色绿色,画Z轴*/paint.setColor(Color.GREEN);canvas.drawCircle(n,300+AccelZ,1,paint);/*每增加一个点,曲线横坐标增加1*/n+;,.,59,结束锁定画图,并提交改变,surfaceHolder.unlockCanvasAndPost(canvas);,.,60,代码讲解-7,/*判断曲线横坐标是否超出屏幕,是则清屏*/*获得屏幕高宽*/if(n=getWindowManager().getDefaultDisplay().getWidth()/*开始绘制时锁定了画布,绘制完成后解锁画布并提交显示。*/surfaceHolder.unlockCanvasAndPost(canvas);/*重新设置画布并锁定,绘制曲线*/n=0;Canvascanvas=surfaceHolder.lockCanvas(null);canvas.drawColor(Color.BLACK);/*解锁提交画布*/surfaceHolder.unlockCanvasAndPost(canvas);,.,61,代码讲解-8,/*异常捕获*/catch(Exceptione)e.printStackTrace();finally/*清除画布*/if(canvas!=null)/*rect()四个参数,第一个是左上角点的x坐标,第二个是其y坐标,第三个是矩形宽,第四个是矩形高,全都设置成0,就是为了清除画布,实际动作是设置新画布,提交新画布*/surfaceHolder.lockCanvas(newRect(0,0,0,0);surfaceHolder.unlockCanvasAndPost(canvas);,.,62,SurfaceHolder.Callback,只要继承SurfaceView类并实现SurfaceHolder.Callback接口就可以实现一个自定义的SurfaceView了,SurfaceHolder.Callback在底层的Surface状态发生变化的时候通知View,SurfaceHolder.Callback具有如下的接口:(1)surfaceCreated(SurfaceHolderholder):(2)surfaceChanged(SurfaceHolderholder,intformat,intwidth,intheight):(3)surfaceDestroyed(SurfaceHolderholder):,.,63,代码讲解-9/*自定义SurfaceHolder.Callback()讲解*/,classmyHolderimplementsSurfaceHolder.CallbackOverride/*当Surface第一次创建后会立即调用该函数。程序可以在该函数中做些和绘制界面相关的初始化工作,*/OverridepublicvoidsurfaceCreated(SurfaceHolderarg0)/TODOAuto-generatedmethodstub/*当Surface的状态(大小和格式)发生变化的时候会调用该函数,在surfaceCreated调用后该函数至少会被调用一次。*/publicvoidsurfaceChanged(SurfaceHolderarg0,intarg1,intarg2,intarg3)/TODOAuto-generatedmethodstub/*当Surface被摧毁前会调用该函数,该函数被调用后就不能继续使用Surface了,一般在该函数中来清理使用的资源。*/OverridepublicvoidsurfaceDestroyed(SurfaceHolderarg0)/TODOAuto-generatedmethodstub,.,64,5.4加速度传感器的基本应用篇,通过前面的讲解我们了解了如何获取加速度传感器数据,接着,我们就可以用这些数据给手机加上不同的功能。5.4.1加速度传感器小应用之重力球5.4.2加速度传感器小应用之摇晃手机歌曲播放器,.,65,5.4.1加速度传感器小应用之重力球,这是一个随着你的手机翻转摇晃而改变位置的感应小球。主要思路是:在我们的手机画面上显示的小球,实际只是一个圆,我们利用手机晃动带来的加速度数据的改变,来不停刷新页面重绘小球达到小球感应的效果。我们专门用一个自定义的view来显示小球运动情况。,.,66,效果演示,.,67,AndroidManifest.xml结构,.,68,layout布局文件,.,69,加速度传感器小应用之重力球的代码,完整代码链接,.,70,代码分析,GravityBallActivity类程序入口GravityBallActivity和MyView需协同工作MyView视图类UI控件负责小球显示,.,71,代码分解-1/*GravityBallActivity类讲解*/,/*GravityBallActivity类讲解*/publicclassGravityBallActivityextendsActivity/*一个自定义的类MyView,在myView中绘制自己想要的图像*/privateMyViewmView;OverrideprotectedvoidonCreate(BundlesavedInstanceState)/TODOAuto-generatedmethodstubsuper.onCreate(savedInstanceState);/*这里就不是在layout文件夹里面的布局文件了,直接就是我们的myView.*/mView=newMyView(getApplicationContext(),this);mView.setFocusable(true);setContentView(mView);OverrideprotectedvoidonPause()/TODOAuto-generatedmethodstubsuper.onPause();OverrideprotectedvoidonResume()/TODOAuto-generatedmethodstubsuper.onResume();,.,72,定义myView类,继承View类,publicclassMyViewextendsViewimplementsSensorEventListener,.,73,代码分解-2/*MyView类讲解*/,/*MyView类用于显示*/*导入包*/packagecom.example.gravityball;importandroid.app.Activity;importandroid.content.Context;importandroid.graphics.Canvas;importandroid.graphics.Color;importandroid.graphics.Paint;importandroid.hardware.Sensor;importandroid.hardware.SensorEvent;importandroid.hardware.SensorEventListener;importandroid.hardware.SensorManager;importandroid.util.Log;importandroid.view.View;,.,74,代码分解-3/*定义常量和变量*/,/*定义常量和变量*/publicclassMyViewextendsViewimplementsSensorEventListener/privateGravityBallActivitygravityBallActivity;privateCanvascanvas;privatePaintpaint;privateSensorManagersensorManager;privateSensorsensor;/*加速度值初始化*/privatefloatAccelX=0;privatefloatAccelY=0;privatefloatAccelZ=0;/*变化后加速度值*/privatefloatlast_AccelX=0;privatefloatlast_AccelY=0;privatefloatlast_AccelZ=0;privatelonglastUpdate=0;/*小球的坐标位置*/privatefloatballX=0;privatefloatballY=0;/*屏幕大小*/intscreenWidth=0;intscreenHeight=0;,.,75,这里也用到了canvas,和上一个程序中的用法不一样的地方在于:前面的曲线是连续的,我们画了一个圆点之后,下一个圆点是接下去画的,直到曲线超出屏幕才清屏。而在本程序中画一个小球后,手机晃动,小球将重新绘制。本次晃动之前出现的小球会被覆盖。这里没有用到surfaceview,我们用自定义myView来显示小球运动,用onDraw方法画小球。,.,76,代码分解-4/*构造函数*/,/*构造函数*/publicMyView(Contextcontext,GravityBallActivityactivity)super(context);/TODOAuto-generatedconstructorstub/gravityBallActivity=activity;/*canvas是画布,paint是画笔*/canvas=newCanvas();paint=newPaint();paint.setColor(Color.RED);/*得到sensorManager对象*/sensorManager=(SensorManager)activity.getSystemService(context.SENSOR_SERVICE);/*得到sensor对象*/sensor=sensorManager.getDefaultSensor(SensorManager.SENSOR_ACCELEROMETER);/*得到感应事件监听,通过注册实现*/sensorManager.registerListener(this,sensor,SensorManager.SENSOR_DELAY_GAME);,.,77,代码分解-5/*感应事件监听*/,OverridepublicvoidonAccuracyChanged(Sensorsensor,intaccuracy)/TODOAuto-generatedmethodstub/*感应事件监听*/publicvoidonSensorChanged(SensorEventevent)/TODOAuto-generatedmethodstub/*得到加速度的值*/AccelX=event.valuesSensorManager.DATA_X;AccelY=event.valuesSensorManager.DATA_Y;AccelZ=event.valuesSensorManager.DATA_Z;/*得到当前屏幕宽高*/screenWidth=this.getWidth();screenHeight=this.getHeight();/*注意:小球运动的中心坐标,因为模拟重力小球在感应时只是感应方向的变化,我们取小球的位置变化在数值上等于加速度值变化,更容易。这里的算法可以根据自己的兴趣设计。*/ballX-=AccelX;ballY-=AccelY;,.,78,我们回忆下前面讲过的关于手机加速度的方向部分的知识。看右图。我们发现手机屏幕的x、y轴(手机平放时,想象纵向的是y轴,横向的是x轴)和加速度的x、y轴是一致的,因此可以采用它们数值上有联系。当然,有兴趣的同学也可以设置成如下式子等:ballX-=2AccelX;ballY-=2AccelY;,.,79,代码分解-6/*小球超界处理*/,/*小球超出手机边界处理,如果超出边界的话小球就在底部*/if(ballXscreenWidth)ballX=screenWidth;if(ballYscreenHeight)ballY=screenHe
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 车险核保考试题及答案
- 发展新质生产力的
- 福建新质生产力发展计划
- 新质生产力赋能出版业
- 民族英雄戚继光课件
- 民族舞蹈基本功训练课件
- 植树节活动方案(模板)
- 数字科技赋能新质生产力
- 2025年妇产科超声常见疾病诊断模拟考试答案及解析
- 科学家视角:新质生产力的创新密码
- 2025三门县国企招聘考试题目及答案
- 2025-2030红色旅游行业市场发展现状及发展前景与投资机会研究报告
- 植筋施工方案 全
- 2025四川省前期物业服务合同示范文本
- 法院舆情风险防控课件
- 动态系统仿真技术-全面剖析
- 护理人员绩效考核制度
- 人教版六年级语文上册教学计划(含进度表)
- 苏教版科学五年级上册全册教案(含反思)
- 餐饮服务与数字化运营 习题及答案 项目六
- 天津地铁设备管理制度范文
评论
0/150
提交评论