Android 应用全局设置所有View点击震动效果的实现方法问询
Android应用全局点击震动实现方案
无需为每个View单独配置,可以通过全局触摸事件拦截实现统一的点击震动效果,具体实现步骤如下:
1. 调整震动逻辑
你现有代码的startVibrate仅在开关切换时触发单次震动,需要先把单次点击的震动逻辑抽为公共方法,同时调整震动时长(点击反馈类震动建议控制在10~50ms,避免过长震感引起用户反感):
// 先在AndroidManifest.xml添加权限:<uses-permission android:name="android.permission.VIBRATE" /> private void triggerClickVibrate() { // 先读取震动开关状态,关闭时直接返回 SharedPreferences sp = getSharedPreferences("你的SP存储文件名", MODE_PRIVATE); if (!sp.getBoolean(getString(R.string.vibration), false)) { return; } Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); if (vibrator == null || !vibrator.hasVibrator()) { return; } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { VibrationEffect effect = VibrationEffect.createOneShot(30, VibrationEffect.DEFAULT_AMPLITUDE); vibrator.vibrate(effect); } else { // 兼容API 26以下版本 vibrator.vibrate(30); } }
2. 全局拦截点击事件
所有View的触摸事件都会经过所在Activity的dispatchTouchEvent方法,重写该方法即可统一捕获点击动作:
// 记录按下坐标,用于判断是否是点击动作 private float downX, downY; @Override public boolean dispatchTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: downX = ev.getX(); downY = ev.getY(); break; case MotionEvent.ACTION_UP: // 判断滑动距离小于10,认定为点击操作 float offsetX = Math.abs(ev.getX() - downX); float offsetY = Math.abs(ev.getY() - downY); if (offsetX < 10 && offsetY < 10) { triggerClickVibrate(); } break; } return super.dispatchTouchEvent(ev); }
如果你的项目有统一的BaseActivity,只需要在BaseActivity中添加上述代码即可,所有继承该BaseActivity的页面都会自动生效,不需要额外修改子页面或者单个View的配置。
可选精细化控制方案
如果需要只给可点击的View(比如Button、可点击的ImageView等)添加震动,不想空白区域点击也触发震动,可以用LayoutInflater.Factory2在布局加载阶段给所有isClickable()为true的View统一包装点击监听,触发震动逻辑,实现更精准的控制。
内容的提问来源于stack exchange,提问作者vickey
相关产品推荐
相关产品推荐

