Android应用开发简单几步实现摇一摇功能

开发 前端
在某些紧急情况下,摇一摇功能可以作为一种快速提醒方式。例如,在遇到危险或紧急状况时,用户可以快速摇动手机来触发警报或发送求救信号。

微信摇一摇,抖音摇一摇面对面摇骰子等,手机APP摇一摇功能随处可见,下面我们来实现一个简单的摇一摇功能。

基本原理

  1. 利用加速度传感器检测设备的物理运动
  2. 监听传感器的数据用作摇一摇动作判定
  3. 根据设定的条件触发摇一摇事件

常见应用场景:

  1. 「音乐和视频控制」:许多音乐和视频应用利用摇一摇功能来控制播放、暂停、下一曲等操作。用户只需摇动手机,即可实现快速切换歌曲或视频的功能。
  2. 「拍照」:一些相机应用使用摇一摇功能来快速拍照或切换前后摄像头。通过摇动手机,用户可以快速完成拍照过程,无需多余的操作步骤。
  3. 「启动应用或功能」:摇一摇功能也可以用于启动特定的应用或功能。例如,健康追踪应用可能允许用户通过摇动手机来快速查看计步器或运动数据。
  4. 「游戏控制」:在某些游戏中,摇一摇功能可以作为游戏控制方式之一。玩家可以通过摇动手机来控制角色的移动或执行特定动作,提供更直观的控制方式。
  5. 「社交分享」:一些社交应用利用摇一摇功能来快速分享内容到其他平台。用户只需摇动手机,即可将内容自动分享到指定的社交媒体平台。
  6. 「触发紧急通知」:在某些紧急情况下,摇一摇功能可以作为一种快速提醒方式。例如,在遇到危险或紧急状况时,用户可以快速摇动手机来触发警报或发送求救信号。

代码示例

「实现效果」:在1.5s内出现两次加速度达到15则触发摇一摇

class ShakeManager : SensorEventListener {

    private var mContext: Context

    /**
     * 时间范围
     */
    private var mIntervalTimeMillis: Long = 15000

    /**
     * 要换次数阈值
     */
    private var mThresholdCount: Int = 2

    /**
     * 加速度阈值
     */
    private var mShakeThreshold: Int = 15

    private var mSensorManager: SensorManager? = null
    private var mVibrator: Vibrator? = null
    private var mOnShakeListener: OnShakeListener? = null

    /**
     * 上一次摇晃时间
     */
    private var mLastShakeTimeMillis: Long = 0

    /**
     * 摇晃次数
     */
    private var mShakeCount = 0

    constructor(
        context: Context,
        intervalTimeMillis: Long,
        thresholdCount: Int,
        shakeThreshold: Int,
        onShakeListener: OnShakeListener
    ) {
        this.mContext = context
        this.mIntervalTimeMillis = intervalTimeMillis
        this.mThresholdCount = thresholdCount
        this.mShakeThreshold = shakeThreshold
        this.mOnShakeListener = onShakeListener

        mSensorManager = mContext.getSystemService(Context.SENSOR_SERVICE) as SensorManager
        mVibrator = mContext.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
        mSensorManager?.registerListener(
            this,
            mSensorManager?.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
            SensorManager.SENSOR_DELAY_NORMAL
        )

    }

    override fun onSensorChanged(event: SensorEvent) {
        //加速度变化
        if (event.sensor.type == Sensor.TYPE_ACCELEROMETER) {
            val currentTimeMillis = System.currentTimeMillis()
            //摇晃时间大于1500
            if (currentTimeMillis - mLastShakeTimeMillis > mIntervalTimeMillis) {
                mShakeCount = 0
            }
            val values = event.values
            if (abs(values[0]) > mShakeThreshold || abs(values[1]) > mShakeThreshold || abs(values[2]) > mShakeThreshold) {
                mLastShakeTimeMillis = currentTimeMillis
                mShakeCount += 1
                if (mShakeCount > mThresholdCount) {
                    mVibrator?.vibrate(100)
                    mShakeCount = 0
                    mLastShakeTimeMillis = 0
                    mOnShakeListener?.onShaked()
                }
            }
        }
    }

    override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {
    }

    interface OnShakeListener {
        fun onShaked()
    }
}

图片图片

接下来摇晃手机,触发摇一摇机制,字体变红

图片图片

完整代码:

<?xml versinotallow="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".activity.TestActivity">
    
    <TextView
        android:id="@+id/tv_shake"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center"
        android:text="请摇晃手机"
        android:textColor="@color/black"
        android:textSize="20sp" />
</LinearLayout>
class TestActivity : AppCompatActivity() {

    private val TAG = TestActivity::class.java.simpleName
    private lateinit var mBinding: ActivityTestBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mBinding = ActivityTestBinding.inflate(layoutInflater)
        setContentView(mBinding.root)
        ShakeManager(this, 1500, 2, 15, object : ShakeManager.OnShakeListener {
            override fun onShaked() {
                mBinding.tvShake.text = "触发了摇一摇"
                mBinding.tvShake.setTextColor(0xFFFF0000.toInt())
            }
        })
    }
}

随着技术发展,结合设备传感器,可以开发出更多有趣和实用的应用。

责任编辑:武晓燕 来源: 沐雨花飞蝶
相关推荐

2014-10-11 10:41:44

Windows Pho

2012-04-28 14:21:22

HTML5

2015-07-29 15:00:18

iPhone摇一摇

2023-11-14 15:51:38

苹果系统App

2013-02-20 11:38:13

2015-03-04 11:09:42

微信摇一摇红包

2014-07-11 14:55:59

傲游浏览器

2016-04-21 11:36:08

阿里无线技术营销

2021-04-29 05:58:20

微信摇一摇抖音

2021-04-24 08:24:28

Windows10操作系统21H2

2015-03-03 09:59:31

微信摇一摇红包

2015-05-15 15:10:16

红包

2021-12-15 06:12:55

App

2015-12-29 16:58:03

飞凡

2015-01-22 15:44:55

Android源码音乐播放器

2015-05-04 16:35:09

互联网

2018-02-07 08:18:23

微信微信6.6.2删除好友

2015-12-02 14:36:03

魅族

2014-02-26 15:45:49

微软必应

2021-07-09 06:48:29

Spring Boot应用Keycloak
点赞
收藏

51CTO技术栈公众号