安卓系統中實現搖一搖畫面震動效果的方法_java

來源:互聯網
上載者:User

前言
    在微信剛流行的時候,在搖一搖還能用來那啥的時候,我也曾深更半夜的拿著手機晃一晃。當時想的最多的就是,我靠,為神馬搖一下需要用這麼大的力度,當時我想可能騰訊覺得那是個人性的設計,後來才發覺尼馬重力加速度設得太高了吧。扯多了,最近項目裡需要解決一個震動的問題,因此在學習震動實現的過程中,寫了個demo實現了搖一搖震動的效果,這裡記錄一下。

原理
    搖一搖功能的基本原理就是:利用手機的加速度感應器,當加速度到達某個值時,觸發某個事件,例如手機震動、UI改變等。這裡要實現該功能,首先需要瞭解一下Android感應器的使用。
Android感應器Sensor使用
    Android中有多種感應器,目前Android SDK支援的感應器包括:加速度感應器、光線感應器、陀螺儀感應器、重力感應器、方向感應器、磁場感應器、壓力感應器等。但是並不是所有手機都具有這些感應器的,因為感應器需要money,因此廉價的手機會選擇常用的感應器來添加,而且一些高端機型則基本上具有大多數感應器。
Sensor使用步驟
    Android感應器的使用步驟大致可分為三步:
1. 擷取感應器管理服對象 SensorManager。
2. 建立感應器事件監聽類,該類必須實現android.hardware.SensorEventListener介面。
3. 使用SensorManager.registerListener方法註冊指定的感應器。
感應器事件介面
    SensorEventListener介面,該介面的onSensorChanged()和onAccuracyChanged()方法用於處理相應的感應器事件。

   

 public interface SensorEventListener {        /**      * Called when sensor values have changed.      * <p>See {@link android.hardware.SensorManager SensorManager}      * for details on possible sensor types.      * <p>See also {@link android.hardware.SensorEvent SensorEvent}.      *      * <p><b>NOTE:</b> The application doesn't own the      * {@link android.hardware.SensorEvent event}      * object passed as a parameter and therefore cannot hold on to it.      * The object may be part of an internal pool and may be reused by      * the framework.      *      * @param event the {@link android.hardware.SensorEvent SensorEvent}.      */     public void onSensorChanged(SensorEvent event);        /**      * Called when the accuracy of a sensor has changed.      * <p>See {@link android.hardware.SensorManager SensorManager}      * for details.      *      * @param accuracy The new accuracy of this sensor      */     public void onAccuracyChanged(Sensor sensor, int accuracy);     } 


Android震動實現
    Android震動效果實現主要是依靠Vibrator服務,具體調用方法如下代碼所示:

   

 import android.app.Activity;   import android.app.Service;   import android.os.Vibrator;      public class VibratorHelper {     public static void Vibrate(final Activity activity, long milliseconds) {       Vibrator vibrator = (Vibrator) activity           .getSystemService(Service.VIBRATOR_SERVICE);       vibrator.vibrate(milliseconds);     }        public static void Vibrate(final Activity activity, long[] pattern,         boolean isRepeat) {       Vibrator vibrator = (Vibrator) activity           .getSystemService(Service.VIBRATOR_SERVICE);       vibrator.vibrate(pattern, isRepeat ? 1 : -1);     }   } 

    同時,還需要在AndroidManifest.xml裡增加震動許可權:

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

    解釋一下Vibrate方法的參數:
1. long milliseconds:震動的時間長度,單位是毫秒。
2. long[] pattern:自訂震動模式。數組中數位含義依次是[靜止時間長度, 震動時間長度, 靜止時間長度, 震動時間長度, ......]。震動時間長度的單位是毫秒。
3. repeat:是否重複震動,1為重複,-1為只震動一次。

搖一搖震動Demo實現
    好了,瞭解了搖一搖需要藉助加速度感應器,震動需要藉助Vibrator服務,那就直接來寫代碼了。MainActivity類實現如下:

  

 import android.app.Activity;   import android.app.AlertDialog;   import android.content.Context;   import android.content.DialogInterface;   import android.content.DialogInterface.OnClickListener;   import android.hardware.Sensor;   import android.hardware.SensorEvent;   import android.hardware.SensorEventListener;   import android.hardware.SensorManager;   import android.os.Bundle;   import android.util.Log;   import android.widget.Toast;      public class MainActivity extends Activity {     private SensorManager sensorManager;     private SensorEventListener shakeListener;     private AlertDialog.Builder dialogBuilder;        private boolean isRefresh = false;        @Override     protected void onCreate(Bundle savedInstanceState) {       super.onCreate(savedInstanceState);       setContentView(R.layout.activity_main);          sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);       shakeListener = new ShakeSensorListener();          dialogBuilder = new AlertDialog.Builder(this);       dialogBuilder.setPositiveButton("確定", new OnClickListener() {            @Override         public void onClick(DialogInterface dialog, int which) {           isRefresh = false;           dialog.cancel();         }       }).setMessage("搖到了一個漂亮妹子!").create();     }        @Override     protected void onResume() {       sensorManager.registerListener(shakeListener,           sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),           SensorManager.SENSOR_DELAY_FASTEST);       super.onResume();     }        @Override     protected void onPause() {       // acitivity後台時取消監聽       sensorManager.unregisterListener(shakeListener);          super.onPause();     }        private class ShakeSensorListener implements SensorEventListener {       private static final int ACCELERATE_VALUE = 20;          @Override       public void onSensorChanged(SensorEvent event) {      //     Log.e("zhengyi.wzy", "type is :" + event.sensor.getType());            // 判斷是否處於重新整理狀態(例如微信中的尋找附近人)         if (isRefresh) {           return;         }            float[] values = event.values;            /**          * 一般在這三個方向的重力加速度達到20就達到了搖晃手機的狀態 x : x軸方向的重力加速度,向右為正 y :          * y軸方向的重力加速度,向前為正 z : z軸方向的重力加速度,向上為正          */         float x = Math.abs(values[0]);         float y = Math.abs(values[1]);         float z = Math.abs(values[2]);            Log.e("zhengyi.wzy", "x is :" + x + " y is :" + y + " z is :" + z);                  if (x >= ACCELERATE_VALUE || y >= ACCELERATE_VALUE             || z >= ACCELERATE_VALUE) {           Toast.makeText(               MainActivity.this,               "accelerate speed :"                   + (x >= ACCELERATE_VALUE ? x                       : y >= ACCELERATE_VALUE ? y : z),               Toast.LENGTH_SHORT).show();              VibratorHelper.Vibrate(MainActivity.this, 300);           isRefresh = true;           dialogBuilder.show();         }          }          @Override       public void onAccuracyChanged(Sensor sensor, int accuracy) {         // TODO Auto-generated method stub       }        }      } 


    效果圖:
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.