安卓开发如何实现摇一摇
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);
}
}
这里用到了消息传递机制Handle
Handler 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>
我是直接在真机上调试的,运行效果如下:
如果大家想做的话,我这有图片资源!欢迎大家给我留言!好辛苦写了这么久!给个赞也行啊!!!