安卓系統(tǒng)中實(shí)現(xiàn)搖一搖畫面振動效果的方法
前言
在微信剛流行的時候,在搖一搖還能用來那啥的時候,我也曾深更半夜的拿著手機(jī)晃一晃。當(dāng)時想的最多的就是,我靠,為神馬搖一下需要用這么大的力度,當(dāng)時我想可能騰訊覺得那是個人性的設(shè)計(jì),后來才發(fā)覺尼馬重力加速度設(shè)得太高了吧。扯多了,最近項(xiàng)目里需要解決一個振動的問題,因此在學(xué)習(xí)振動實(shí)現(xiàn)的過程中,寫了個demo實(shí)現(xiàn)了搖一搖振動的效果,這里記錄一下。
原理
搖一搖功能的基本原理就是:利用手機(jī)的加速度傳感器,當(dāng)加速度到達(dá)某個值時,觸發(fā)某個事件,例如手機(jī)振動、UI改變等。這里要實(shí)現(xiàn)該功能,首先需要了解一下Android傳感器的使用。
Android傳感器Sensor使用
Android中有多種傳感器,目前Android SDK支持的傳感器包括:加速度傳感器、光線傳感器、陀螺儀傳感器、重力傳感器、方向傳感器、磁場傳感器、壓力傳感器等。但是并不是所有手機(jī)都具有這些傳感器的,因?yàn)閭鞲衅餍枰猰oney,因此廉價的手機(jī)會選擇常用的傳感器來添加,而且一些高端機(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)的傳感器事件。
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振動實(shí)現(xiàn)
Android振動效果實(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); } }
同時,還需要在AndroidManifest.xml里增加振動權(quán)限:
<uses-permission android:name="android.permission.VIBRATE"/>
解釋一下Vibrate方法的參數(shù):
1. long milliseconds:振動的時長,單位是毫秒。
2. long[] pattern:自定義振動模式。數(shù)組中數(shù)字的含義依次是[靜止時長, 振動時長, 靜止時長, 振動時長, ......]。振動時長的單位是毫秒。
3. repeat:是否重復(fù)振動,1為重復(fù),-1為只振動一次。
搖一搖振動Demo實(shí)現(xiàn)
好了,了解了搖一搖需要借助加速度傳感器,振動需要借助Vibrator服務(wù),那就直接來寫代碼了。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("搖到了一個漂亮妹子!").create(); } @Override protected void onResume() { sensorManager.registerListener(shakeListener, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_FASTEST); super.onResume(); } @Override protected void onPause() { // acitivity后臺時取消監(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; /** * 一般在這三個方向的重力加速度達(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 } } }
效果圖:
- Android利用傳感器實(shí)現(xiàn)微信搖一搖功能
- Android 微信搖一搖功能實(shí)現(xiàn)詳細(xì)介紹
- IOS 實(shí)現(xiàn)搖一搖的操作
- iOS實(shí)現(xiàn)微信朋友圈與搖一搖功能
- javascript html5搖一搖功能的實(shí)現(xiàn)
- 分享網(wǎng)頁檢測搖一搖實(shí)例代碼
- 使用PHP實(shí)現(xiàn)微信搖一搖周邊紅包
- php官方微信接口大全(微信支付、微信紅包、微信搖一搖、微信小店)
- HTML5使用DeviceOrientation實(shí)現(xiàn)搖一搖功能
- Android實(shí)現(xiàn)搖一搖功能
相關(guān)文章
Java使用雙異步實(shí)現(xiàn)將Excel的數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫
在開發(fā)中,我們經(jīng)常會遇到這樣的需求,將Excel的數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫中,這篇文章主要來和大家講講Java如何使用雙異步實(shí)現(xiàn)將Excel的數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫,感興趣的可以了解下2024-01-01springboot集成Swagger的方法(讓你擁有屬于自己的api管理器)
在大型的項(xiàng)目中,如果你有非常多的接口需要統(tǒng)一管理,或者需要進(jìn)行接口測試,那么我們通常會在繁雜地api中找到需要進(jìn)行測試或者管理的接口,接下來通過本文給大家介紹springboot集成Swagger的方法讓你擁有屬于自己的api管理器,感興趣的朋友一起看看吧2021-11-11新版本IntelliJ IDEA 構(gòu)建maven,并用Maven創(chuàng)建一個web項(xiàng)目(圖文教程)
這篇文章主要介紹了新版本IntelliJ IDEA 構(gòu)建maven,并用Maven創(chuàng)建一個web項(xiàng)目的圖文教程,需要的朋友可以參考下2018-01-01Java自定義過濾器和攔截器實(shí)現(xiàn)ThreadLocal線程封閉
本文主要介紹了Java自定義過濾器和攔截器實(shí)現(xiàn)ThreadLocal線程封閉,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08java集合之CopyOnWriteArrayList源碼解析
這篇文章主要介紹了java集合之CopyOnWriteArrayList源碼解析,容器array是volatile修飾的,即set和get方法都是線程安全的,整個添加過程上了鎖,所以整體是通過volatile和lock來保證的線程安全,需要的朋友可以參考下2023-12-12