欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2015年07月31日 10:58:19   作者:低調(diào)小一  
這篇文章主要介紹了安卓系統(tǒng)中實(shí)現(xiàn)搖一搖畫(huà)面振動(dòng)效果的方法,調(diào)用Android SDK中的SensorEventListener接口,需要的朋友可以參考下

前言
    在微信剛流行的時(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)類,該類必須實(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類實(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)

相關(guān)文章

  • Java使用雙異步實(shí)現(xiàn)將Excel的數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫(kù)

    Java使用雙異步實(shí)現(xiàn)將Excel的數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫(kù)

    在開(kāi)發(fā)中,我們經(jīng)常會(huì)遇到這樣的需求,將Excel的數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫(kù)中,這篇文章主要來(lái)和大家講講Java如何使用雙異步實(shí)現(xiàn)將Excel的數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫(kù),感興趣的可以了解下
    2024-01-01
  • JavaWeb讀取配置文件的四種方法

    JavaWeb讀取配置文件的四種方法

    這篇文章主要介紹了JavaWeb讀取配置文件的4種方法,方法一采用ServletContext讀取,方法二采用ResourceBundle類讀取配置信息,方法三采用ClassLoader方式進(jìn)行讀取配置信息,對(duì)javaweb讀取配置文件的四種方法感興趣的朋友參考下吧
    2018-03-03
  • springboot集成Swagger的方法(讓你擁有屬于自己的api管理器)

    springboot集成Swagger的方法(讓你擁有屬于自己的api管理器)

    在大型的項(xiàng)目中,如果你有非常多的接口需要統(tǒng)一管理,或者需要進(jìn)行接口測(cè)試,那么我們通常會(huì)在繁雜地api中找到需要進(jìn)行測(cè)試或者管理的接口,接下來(lái)通過(guò)本文給大家介紹springboot集成Swagger的方法讓你擁有屬于自己的api管理器,感興趣的朋友一起看看吧
    2021-11-11
  • 使用Jackson 處理 null 或者 空字符串

    使用Jackson 處理 null 或者 空字符串

    這篇文章主要介紹了使用Jackson 處理 null 或者 空字符串,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 新版本IntelliJ IDEA 構(gòu)建maven,并用Maven創(chuàng)建一個(gè)web項(xiàng)目(圖文教程)

    新版本IntelliJ IDEA 構(gòu)建maven,并用Maven創(chuàng)建一個(gè)web項(xiàng)目(圖文教程)

    這篇文章主要介紹了新版本IntelliJ IDEA 構(gòu)建maven,并用Maven創(chuàng)建一個(gè)web項(xiàng)目的圖文教程,需要的朋友可以參考下
    2018-01-01
  • 一文詳解Maven的setting文件

    一文詳解Maven的setting文件

    maven?是目前java?常見(jiàn)的一款包管理工具,通過(guò)?maven?我們可以很方便的對(duì)項(xiàng)目進(jìn)行編譯、打包、部署等操作,本文將詳細(xì)帶大家了解一下Maven?setting文件,需要的朋友可以參考下
    2024-02-02
  • Java自定義過(guò)濾器和攔截器實(shí)現(xiàn)ThreadLocal線程封閉

    Java自定義過(guò)濾器和攔截器實(shí)現(xiàn)ThreadLocal線程封閉

    本文主要介紹了Java自定義過(guò)濾器和攔截器實(shí)現(xiàn)ThreadLocal線程封閉,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Java中Quartz高可用定時(shí)任務(wù)快速入門(mén)

    Java中Quartz高可用定時(shí)任務(wù)快速入門(mén)

    如果你想做定時(shí)任務(wù),有高可用方面的需求,或者僅僅想入門(mén)快,上手簡(jiǎn)單,那么選用它準(zhǔn)沒(méi)錯(cuò),感興趣的小伙伴們可以參考一下
    2022-04-04
  • 簡(jiǎn)述mybatis大于小于的轉(zhuǎn)義

    簡(jiǎn)述mybatis大于小于的轉(zhuǎn)義

    這篇文章主要介紹了mybatis大于小于的轉(zhuǎn)義以及xml中常用轉(zhuǎn)義字符,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-09-09
  • java集合之CopyOnWriteArrayList源碼解析

    java集合之CopyOnWriteArrayList源碼解析

    這篇文章主要介紹了java集合之CopyOnWriteArrayList源碼解析,容器array是volatile修飾的,即set和get方法都是線程安全的,整個(gè)添加過(guò)程上了鎖,所以整體是通過(guò)volatile和lock來(lái)保證的線程安全,需要的朋友可以參考下
    2023-12-12

最新評(píng)論