一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語言 - JAVA教程 - 安卓系統(tǒng)中實(shí)現(xiàn)搖一搖畫面振動(dòng)效果的方法

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

2019-12-31 14:32低調(diào)小一 JAVA教程

這篇文章主要介紹了安卓系統(tǒng)中實(shí)現(xiàn)搖一搖畫面振動(dòng)效果的方法,調(diào)用Android SDK中的SensorEventListener接口,需要的朋友可以參考下

前言
    在微信剛流行的時(shí)候,在搖一搖還能用來那啥的時(shí)候,我也曾深更半夜的拿著手機(jī)晃一晃。當(dāng)時(shí)想的最多的就是,我靠,為神馬搖一下需要用這么大的力度,當(dāng)時(shí)我想可能騰訊覺得那是個(gè)人性的設(shè)計(jì),后來才發(fā)覺尼馬重力加速度設(shè)得太高了吧。扯多了,最近項(xiàng)目里需要解決一個(gè)振動(dòng)的問題,因此在學(xué)習(xí)振動(dòng)實(shí)現(xiàn)的過程中,寫了個(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支持的傳感器包括:加速度傳感器、光線傳感器、陀螺儀傳感器、重力傳感器、方向傳感器、磁場傳感器、壓力傳感器等。但是并不是所有手機(jī)都具有這些傳感器的,因?yàn)閭鞲衅餍枰猰oney,因此廉價(jià)的手機(jī)會(huì)選擇常用的傳感器來添加,而且一些高端機(jī)型則基本上具有大多數(shù)傳感器。
Sensor使用步驟
    Android傳感器的使用步驟大致可分為三步:
1. 獲取傳感器管理服對象 SensorManager。
2. 創(chuàng)建傳感器事件監(jiān)聽類,該類必須實(shí)現(xiàn)android.hardware.SensorEventListener接口。
3. 使用SensorManager.registerListener方法注冊指定的傳感器。
傳感器事件接口
    SensorEventListener接口,該接口的onSensorChanged()和onAccuracyChanged()方法用于處理相應(yīng)的傳感器事件。

   

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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)用方法如下代碼所示:

   

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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)限:

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

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

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

  

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
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)聽
     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à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
     }
  
   }
  
 }


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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产草| 色综合色狠狠天天综合色hd | 精品一区二区三区 不卡高清 | 513热点网深夜影院影院诶 | 国产麻豆91网在线看 | 青草国产福利视频免费观看 | 天天色综合三 | 久久久久嫩草影院精品 | 91九色porn偷拍在线 | 日韩精品福利视频一区二区三区 | 日韩a无吗一区二区三区 | 亚洲国产成人超福利久久精品 | 午夜视频在线网站 | 日本中出视频 | 亚洲欧美国产精品完整版 | 狠狠色婷婷狠狠狠亚洲综合 | 四色6677最新永久网站 | 国产乱叫456在线 | 亚洲欧美精品天堂久久综合一区 | 91精品乱码一区二区三区 | 艹逼的视频 | 久久九九久精品国产尤物 | 九九热精品免费观看 | 国产一区二区不卡视频 | 91精品综合国产在线观看 | 国产91素人搭讪系列天堂 | www四虎| 国产a高清| 奇米影视小说 | 欧美贵妇vs高跟办公室 | 亚洲精品有码在线观看 | 无码人妻99久久密AV | 免费看日韩 | 亚洲情欲网 | 驯服有夫之妇HD中字日本 | 性色AV乱码一区二区三区视频 | 亚洲天堂h | 欧美在线视频7777kkkk | 亚洲AV久久久久久久无码 | 美国雪白人妖sarina | 暖暖 免费 高清 日本 在线 |