iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >老生常谈Android HapticFeedback(震动反馈)
  • 256
分享到

老生常谈Android HapticFeedback(震动反馈)

Android 2022-06-06 01:06:47 256人浏览 八月长安
摘要

Android中长按一个控件的时候,想以震动提示用户,除了用Vibrate类来做,还可以用到(HapticFeedback)震动反馈实现。 本篇文章,我们就一起来熟悉一下And

Android中长按一个控件的时候,想以震动提示用户,除了用Vibrate类来做,还可以用到(HapticFeedback)震动反馈实现。

本篇文章,我们就一起来熟悉一下Android震动反馈,首先我们打开手机上的振动模式开光,这里我是以小米手机来做模拟的,位置在设置—>声音和震动—>触摸时震动,如下图所示:

震动强度,我选择了较强,以让震动更明显。

系统触发震动

下面从一个例子,来开始本篇博客,对一个button注册长按监听:


Button click= (Button) findViewById(R.id.click);
  click.setOnLonGClickListener(new View.OnLongClickListener() {
   @Override
   public boolean onLongClick(View v) {
    Toast.makeText(MainActivity.this,"长按点击",Toast.LENGTH_SHORT).show();
    //触发震动反馈
    return true;
    //return false;
   }
  });

当你长按此button,弹出一个toast,并且震动了,但是,返回false并不会触发震动。

现在看源码分析一下,这是为何。

button实现setOnLongClickListener方法,在父类TextView的父类View中,

View.setOnLongClickListener源码:



 public void setOnLongClickListener(@Nullable OnLongClickListener l) {
  if (!isLongClickable()) {
   setLongClickable(true);
  }
  getListenerInfo().mOnLongClickListener = l;
 }

我们要看mOnLongClickListener是在哪里调用的接口onLongClick方法,最终在View的源码中找到

View.performLongClick源码:



 public boolean perfORMLongClick() {
  sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_LONG_CLICKED);
  boolean handled = false;
  ListenerInfo li = mListenerInfo;
  if (li != null && li.mOnLongClickListener != null) {
   handled = li.mOnLongClickListener.onLongClick(View.this);
  }
  if (!handled) {
   handled = showContextMenu();
  }
  if (handled) {
   performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
  }
  return handled;
 }

可以看到

第13行执行了onLongClick方法,并且将返回值给了变量handled,

在第18行,hangdled为true,执行performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);该方法最终触发了震动反馈。

这就是为什么,onLongClick返回true的时候,才会有震动效果。

自定义触发震动

上节提到,在performHapticFeedback触发震动,观察源码得知,用户可以自己通过代码来触发。

如下文所示,点击也会触发震动反馈了:


  click.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
    v.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
   }
  });

现在我们就去performHapticFeedback源码看下,都执行了什么,

View.performHapticFeedback源码:



 public boolean performHapticFeedback(int feedbackConstant) {
  return performHapticFeedback(feedbackConstant, 0);
 }

这里解释三个知识点:

1、只有在isHapticFeedbackEnabled()为true的情况下,才会触发震动。之后会解释在为false的情况下,为何不会触发震动。

在xml里,可以通过android:hapticFeedbackEnabled=”false|true”来进行设置

在java代码里,可以通过view.setHapticFeedbackEnabled(boolean)来设置,

不过默认是true哦。

2、HapticFeedbackConstants的常量值,我们要用到的有三个,一个是LONG_PRESS(长按),第二个是FLAG_IGNORE_VIEW_SETTING(不受view的设置影响,即不受isHapticFeedbackEnabled()的影响),第三个是FLAG_IGNORE_GLOBAL_SETTING(不受系统设置的影响,即不受是否开启震动反馈的影响)

3、我们看到该方法最终是返回的performHapticFeedback(int feedbackConstant, int flags)这个方法,

View.performHapticFeedback(int feedbackConstant, int flags)源码:



 public boolean performHapticFeedback(int feedbackConstant, int flags) {
  if (mAttachInfo == null) {
   return false;
  }
  //noinspection SimplifiableIfStatement
  if ((flags & HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING) == 0
    && !isHapticFeedbackEnabled()) {
   return false;
  }
  return mAttachInfo.mRootCallbacks.performHapticFeedback(feedbackConstant,
    (flags & HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING) != 0);
 }

看第15行的if语句,当flags=0时,flags & HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING为0,又isHapticFeedbackEnabled()为false,整个条件为真,所以会执行17行,直接return。这也是为什么performHapticFeedback(int feedbackConstant)方法一定要在isHapticFeedbackEnabled()为ture的情况下才会触发震动。

在这里说一下,&是按位与,返回数值,&&逻辑与,返回布尔值。

第19-20行,就是触发底层震动的代码了,之后代码不做分析。

HapticFeedbackConstants常量

接下来,看下HapticFeedbackConstants三个常量,还是之前的代码,如下所示:


click.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
    v.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS
      );
   }
  });

在单击后,会触发震动,但是如果xml加上 android:hapticFeedbackEnabled=”false”这句话,单击则没有震动效果了。如下所示:


<Button
  android:layout_width="wrap_content"
  android:id="@+id/click"
  android:layout_height="wrap_content"
  android:hapticFeedbackEnabled="false"
  android:text="make" />

如果这时,想让其震动,可以用如下方法来做:


 click.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
    v.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS,HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING
      );
   }
  });

忽略view的属性设置。

还记得本篇文章之前,说去设置里打开触摸时震动的开关吗,其实,用户不打开,照样可以让其震动,只需要用如下的方法:


 click.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
    v.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS,HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING
      );
   }
  });

忽略系统设置,哈哈,是不是很变态的方法,不过不建议这样做,毕竟用户禁止了触摸反馈,我们就没必要继续挑战用户极限了。

最后,我还要说一点,就是以上的方法,不需要震动权限,不需要震动权限,不需要震动权限、重要的事情说三遍。

以上这篇老生常谈Android HapticFeedback(震动反馈)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持编程网。

您可能感兴趣的文章:android滑动解震动效果的开启和取消


--结束END--

本文标题: 老生常谈Android HapticFeedback(震动反馈)

本文链接: https://www.lsjlt.com/news/21830.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android老生常谈LayoutInflater的新认知
    现在看我文章的多数是一些老Android了,相信每个人使用起LayoutInflater都是家常便饭,信手拈来。 但即使是这样,我仍然觉得这个知识点有可以分析的地方,看完之后或许你对...
    99+
    2024-04-02
  • 老生常谈Java动态编译(必看篇)
    一、动态编译简介new创建对象是静态加载类,在编译时刻就需要加载所有可能使用到的类。一百个类,有一个类错了,都无法编译。通过动态加载类可以解决该问题二、代码实例2.1 OfficeBetter.javamain接口里面通过对Class类的动...
    99+
    2023-05-31
    java 动态编译 ava
  • 老生常谈设计模式之动态代理
    一、动态代理概念动态代理分为JDK动态代理和cglib动态代理两种方式。jdk动态代理是由Java内部的反射机制来实现的,cglib动态代理底层则是借助asm来实现的。总的来说,反射机制在生成类的过程中比较高效,而asm在生成类之后的相关执...
    99+
    2023-05-31
    设计模式 动态代理
  • 老生常谈java路径中的反斜杠和斜杠的区别
    JAVA中的斜杠有正斜杠与反斜杠之分,正斜杠,一般就叫做斜杠,符号为“/”;反斜杠的符号为“\”。斜杠(/)在JAVA中没有什么特别的意义,就是代表一个字符‘/';反斜杠(\)则不然,它和紧跟着它的那个字符构成转义字符,如“\n”(换行)、...
    99+
    2023-05-31
    java 路径 斜杠
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作