Android应用开发简单几步实现摇一摇功能
创始人
2025-07-11 03:00:42
0

微信摇一摇,抖音摇一摇面对面摇骰子等,手机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()
    }
}

图片图片

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

图片图片

完整代码:



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

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

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...