国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Java > 正文

安卓系統(tǒng)中實(shí)現(xiàn)搖一搖畫(huà)面振動(dòng)效果的方法

2019-11-26 15:02:22
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

前言
    在微信剛流行的時(shí)候,在搖一搖還能用來(lái)那啥的時(shí)候,我也曾深更半夜的拿著手機(jī)晃一晃。當(dāng)時(shí)想的最多的就是,我靠,為神馬搖一下需要用這么大的力度,當(dāng)時(shí)我想可能騰訊覺(jué)得那是個(gè)人性的設(shè)計(jì),后來(lái)才發(fā)覺(jué)尼馬重力加速度設(shè)得太高了吧。扯多了,最近項(xiàng)目里需要解決一個(gè)振動(dòng)的問(wèn)題,因此在學(xué)習(xí)振動(dòng)實(shí)現(xiàn)的過(guò)程中,寫(xiě)了個(gè)demo實(shí)現(xiàn)了搖一搖振動(dòng)的效果,這里記錄一下。

原理
    搖一搖功能的基本原理就是:利用手機(jī)的加速度傳感器,當(dāng)加速度到達(dá)某個(gè)值時(shí),觸發(fā)某個(gè)事件,例如手機(jī)振動(dòng)、UI改變等。這里要實(shí)現(xiàn)該功能,首先需要了解一下Android傳感器的使用。
Android傳感器Sensor使用
    Android中有多種傳感器,目前Android SDK支持的傳感器包括:加速度傳感器、光線傳感器、陀螺儀傳感器、重力傳感器、方向傳感器、磁場(chǎng)傳感器、壓力傳感器等。但是并不是所有手機(jī)都具有這些傳感器的,因?yàn)閭鞲衅餍枰猰oney,因此廉價(jià)的手機(jī)會(huì)選擇常用的傳感器來(lái)添加,而且一些高端機(jī)型則基本上具有大多數(shù)傳感器。
Sensor使用步驟
    Android傳感器的使用步驟大致可分為三步:
1. 獲取傳感器管理服對(duì)象 SensorManager。
2. 創(chuàng)建傳感器事件監(jiān)聽(tīng)類(lèi),該類(lèi)必須實(shí)現(xiàn)android.hardware.SensorEventListener接口。
3. 使用SensorManager.registerListener方法注冊(cè)指定的傳感器。
傳感器事件接口
    SensorEventListener接口,該接口的onSensorChanged()和onAccuracyChanged()方法用于處理相應(yīng)的傳感器事件。

   

 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振動(dòng)實(shí)現(xiàn)
    Android振動(dòng)效果實(shí)現(xiàn)主要是依靠Vibrator服務(wù),具體調(diào)用方法如下代碼所示:

   

 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);     }   } 

    同時(shí),還需要在AndroidManifest.xml里增加振動(dòng)權(quán)限:

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

    解釋一下Vibrate方法的參數(shù):
1. long milliseconds:振動(dòng)的時(shí)長(zhǎng),單位是毫秒。
2. long[] pattern:自定義振動(dòng)模式。數(shù)組中數(shù)字的含義依次是[靜止時(shí)長(zhǎng), 振動(dòng)時(shí)長(zhǎng), 靜止時(shí)長(zhǎng), 振動(dòng)時(shí)長(zhǎng), ......]。振動(dòng)時(shí)長(zhǎng)的單位是毫秒。
3. repeat:是否重復(fù)振動(dòng),1為重復(fù),-1為只振動(dòng)一次。

搖一搖振動(dòng)Demo實(shí)現(xiàn)
    好了,了解了搖一搖需要借助加速度傳感器,振動(dòng)需要借助Vibrator服務(wù),那就直接來(lái)寫(xiě)代碼了。MainActivity類(lèi)實(shí)現(xiàn)如下:

  

 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("搖到了一個(gè)漂亮妹子!").create();     }        @Override     protected void onResume() {       sensorManager.registerListener(shakeListener,           sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),           SensorManager.SENSOR_DELAY_FASTEST);       super.onResume();     }        @Override     protected void onPause() {       // acitivity后臺(tái)時(shí)取消監(jiān)聽(tīng)       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());            // 判斷是否處于刷新?tīng)顟B(tài)(例如微信中的查找附近人)         if (isRefresh) {           return;         }            float[] values = event.values;            /**          * 一般在這三個(gè)方向的重力加速度達(dá)到20就達(dá)到了搖晃手機(jī)的狀態(tài) 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       }        }      } 


    效果圖:
 2015731105552641.png (720×1280)

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 金阳县| 锡林浩特市| 东乡族自治县| 清涧县| 如皋市| 五常市| 桃源县| 陵川县| 南雄市| 麻阳| 辽阳市| 保康县| 海口市| 镇平县| 丹寨县| 儋州市| 沧州市| 河西区| 壤塘县| 汨罗市| 昌邑市| 城口县| 阿鲁科尔沁旗| 东乡族自治县| 桦南县| 渭南市| 永宁县| 临城县| 乌审旗| 漾濞| 怀柔区| 稷山县| 隆子县| 女性| 独山县| 府谷县| 平利县| 济源市| 额敏县| 那坡县| 鄂州市|