android---动感摇一摇

安卓开发如何实现摇一摇

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>



我是直接在真机上调试的,运行效果如下:











如果大家想做的话,我这有图片资源!欢迎大家给我留言!好辛苦写了这么久!给个赞也行啊!!!

猜你喜欢

转载自blog.csdn.net/CjhLoveAndroid/article/details/68502677