安卓开发如何实现摇一摇
1.开发摇一摇预备知识:
1.传感器:
1)传感器的概念及其作用。
2)传感器的类型。
3)Android传感器的架构。
2.传感器的类型:
1)运动传感器:加速度传感器、陀螺仪传感器
2)环境传感器:温度传感器、光传感器
3)位置传感器:方向传感器、磁力计传感器
3.传感器类的架构:
1)SensorManager类:创建一个传感器服务的实例。
2)Sensor类:代表一个具体的传感器。
3)SensorEvent类:代表传感器事件。
4)SensorEventListener接口:监听传感器值以及精度变化。
4.传感器的类的结构:
1.包:android.hardware
2.SensorManager类:传感器的服务类
实例化:
1.Context.getSystemService(String name)
方法:
1.Sensor getDefaultSensor(int type)
根据传感器的类型获取具体的传感器对象
type:传感器的类型
值:Sensor.TYPE_ACCELEROMETER 加速度传感器
2.registerListener(SensorEventListener listener,Sensor sensor,int rate)
注册传感器 参数:
listener:传感器事件的监听事件
sensor:具体的传感器
rate:数据延误的时间
值:SENSOR_DELAY_FASTEST:延迟时间0微秒
SENSOR_DELAY_GAME:延迟时间20000微秒
SENSOR_DELAY_UI:延迟时间66667微秒
SENSOR_DELAY_NORMAL:延迟时间200000微秒
3.unregisterListener(SensorEventListener listener,Sensor sensor)
取消注册 参数:
listener:事件
sensor:具体传感器的对象
3.Sensor类: 代表的是具体传感器,获取传感器的信息
4.SensorEvent类: 代表的是传感器的事件
5.SensorEventListener接口:代表的是传感器的监听事件
震动效果:
1.Vibrator类:震动的服务类
实例化:
1.Context.getSystemService(java.lang.String)
方法:
1.vibrate(long [] pattern,int repeat)
指定的时间间隔内震动并且可以设置震动持续的时间
参数:
pattern:设置震动的时间间隔和持续时间
repeat:设置震动重复的次数
2.cancel():取消震动
音乐设置:
MediaPlayer类:播放音频和视频文件
实例化方式:
1.静态方法
1.static MediaPlayer create(Context context,int resid)
根据音频文件的标识得到MediaPlayer对象
2.构造方法
1.MediaPlayer()
方法:setDataSource()
方法:
start():播放音频文件
权限设置:
<uses-permission android:name="android.permission.VIBRATE" />
下面看看具体代码怎么实现:
新建一个sensor包:在这个包里创建一个ShakeSensor类
1.首先这个类要继承SensorEventListener,然后重写几个方法
public void unRegisterListener() { mSensorManager.unregisterListener(this, mSensor); }
long currentTime=System.currentTimeMillis();if(currentTime-last_time>10){//两次摇动的时间间隔long timeDistance=currentTime-last_time;last_time=currentTime;float x=event.values[0]; //x轴变化的值float y=event.values[1]; //y轴变化的值float z=event.values[2]; //z轴变化的值 Log.e(TAG, x+"---"+y+"---"+z); double speed; //速度的阈值 double absValue=Math.abs(x+y+z-last_x-last_y-last_z); speed=absValue/timeDistance*10000; //将速度放大 if (speed>SPEED_SHRESHOLD) {//当x/y/z达到一定值进行后续操作 if (null!=mOnShakeListener) {mOnShakeListener.onShake();}} last_x=x; last_y=y; last_z=z;}}/* * 取消注册 * */ public void unRegisterListener() { mSensorManager.unregisterListener(this, mSensor); }
然后自己写了几个函数:用来初始化的函数、接口函数(作为给别的类调用)、设置一个监听事件
/* * 初始化传感器 */ public void init() { mSensorManager=(SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE); mSensor=mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); //注册传感器 mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_FASTEST); }
//设计一个接口 public interface OnShakeListener{ void onShake(); }
public void setOnShakeListener(OnShakeListener onShakeListener) { mOnShakeListener=onShakeListener; }
看看如何调用这个类:
新建一个类ShakeActivity 继承 OnShakeListener这个类,然后实现OnShakeListener里面的onShake()这个方法。
这是这个类里面的一些成员变量:
private static final int MSG_COUNT_END=0x01; //使用次数结束 private static final int MSG_COUNT_CONTINUE=0x02; //使用次数继续 private ShackSensor mShakeSensor; //传感器 private ImageView img_hande; //视图,手 private Vibrator mVibrator; //震动 private TextView txt_show_count;//视图,显示文字 private static int count=3; //记录次数,初始值为3 private boolean isStart; //是否是开始记录 private MediaPlayer mPlayer; //音乐效果
mShakeSensor=new ShackSensor(); mShakeSensor.ShakeSensor(this); //注册回调事件 mShakeSensor.setOnShakeListener(this); mShakeSensor.init(); img_hande=(ImageView) findViewById(R.id.img_hande); txt_show_count=(TextView) findViewById(R.id.txt_show_count); //通过getSystemService(Context.VIBRATOR_SERVICE)方法获取对象 mVibrator = (Vibrator) this.getSystemService(Context.VIBRATOR_SERVICE); //启动动画 Animation animation=AnimationUtils.loadAnimation(this, R.anim.main_img_handle); img_hande.startAnimation(animation);
实现OnShake()这个函数:public void onShake() { //实现操作 if (count==0) { mHandler.sendEmptyMessage(MSG_COUNT_END); }
else { mHandler.sendEmptyMessage(MSG_COUNT_CONTINUE); } }
这里用到了消息传递机制HandleHandler mHandler=new Handler(){ public void handleMessage(android.os.Message msg) { if (msg.what==MSG_COUNT_END) { //如果count==0了,只有震动效果 txt_show_count.setText("今天您还可以摇0次"); } else { //否则添加震动、音效 //startAudioWithVibrator(); Intent intent=new Intent(ShakeActivity.this, ShowActivity.class); startActivity(intent); //添加跳转时ShowActivity进入的动画 overridePendingTransition(R.anim.main_set_in, 0); } }; };
实现震动和音效还有跳转都是靠这里实现的,因为这里的音效和页面跳转都有一个次数的限制,这个次数限制就就通过Handle消息机制来传递。如果执行onShake()函数时,发现count已经减为0了,就向handleMessage(android.os.Message msg)传递一个消息,然后handleMessage()根据这个消息做出对应操作,如果是msg.what==MSG_COUNT_END,表示结束,只执行震动的操作;如果是MSG_COUNT_CONTINUE,表示还可以继续,做出震动和音效,并弹出动画效果!!!
至于控制次数的函数我们用到onResume()函数:
protected void onResume() { super.onResume(); if(count==0) { count=0; } else { if(isStart) { count--; } } isStart=true; txt_show_count.setText("今天您还可以摇"+count+"次"); }
再写两个函数:一个是只有震动的函数:
/* * 震动 * */ public void startVibrator() { //震动效果 long parttern[]={500,300,500,300}; //间隔多长时间震动 mVibrator.vibrate(parttern, -1); }
一个是震动和音效的函数:
/* * 启动音乐以及震动 * */ public void startAudioWithVibrator() { //mPlayer=MediaPlayer.create(this, resid); //播放 //mPlayer.start(); //震动效果 long parttern[]={500,300,500,300}; //间隔多长时间震动 mVibrator.vibrate(parttern, -1); }
启动震动的时候我们需要启动系统服务:mVibrator = (Vibrator) this.getSystemService(Context.VIBRATOR_SERVICE);
还有几个关于动画的实现:
//添加跳转时ShowActivity进入的动画 overridePendingTransition(R.anim.main_set_in, 0);
//设置显示界面退出的动画 overridePendingTransition(0, R.anim.show_set_out);
设置进入动画的效果
main_set_in
<set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromYDelta="-100%p" android:toXDelta="0" android:duration="1200" android:interpolator="@android:anim/accelerate_interpolator"> </translate> <alpha android:fromAlpha="0" android:toAlpha="1" android:duration="1200" > </alpha> </set>
设置退出动画的效果
anim.show_set_out
<set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="0" android:toYDelta="100%p" android:duration="1200"/> <alpha android:fromAlpha="1" android:toAlpha="0" android:duration="1200"/> </set>
我是直接在真机上调试的,运行效果如下:
如果大家想做的话,我这有图片资源!欢迎大家给我留言!好辛苦写了这么久!给个赞也行啊!!!