国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

老生常談Android HapticFeedback(震動反饋)

2019-12-12 03:07:43
字體:
來源:轉載
供稿:網友

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源碼:

/**  * Register a callback to be invoked when this view is clicked and held. If this view is not  * long clickable, it becomes long clickable.  *  * @param l The callback that will run  *  * @see #setLongClickable(boolean)  */ public void setOnLongClickListener(@Nullable OnLongClickListener l) {  if (!isLongClickable()) {   setLongClickable(true);  }  getListenerInfo().mOnLongClickListener = l; }

我們要看mOnLongClickListener是在哪里調用的接口onLongClick方法,最終在View的源碼中找到

View.performLongClick源碼:

/**  * Call this view's OnLongClickListener, if it is defined. Invokes the context menu if the  * OnLongClickListener did not consume the event.  *  * @return True if one of the above receivers consumed the event, false otherwise.  */ 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源碼:

/**  * BZZZTT!!1!  *  * <p>Provide haptic feedback to the user for this view.  *  * <p>The framework will provide haptic feedback for some built in actions,  * such as long presses, but you may wish to provide feedback for your  * own widget.  *  * <p>The feedback will only be performed if  * {@link #isHapticFeedbackEnabled()} is true.  *  * @param feedbackConstant One of the constants defined in  * {@link HapticFeedbackConstants}  */ 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)源碼:

/**  * BZZZTT!!1!  *  * <p>Like {@link #performHapticFeedback(int)}, with additional options.  *  * @param feedbackConstant One of the constants defined in  * {@link HapticFeedbackConstants}  * @param flags Additional flags as per {@link HapticFeedbackConstants}.  */ 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(震動反饋)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阜城县| 土默特右旗| 三明市| 恩平市| 仪征市| 溧水县| 泰兴市| 东安县| 台湾省| 阿鲁科尔沁旗| 苗栗县| 宜宾县| 乾安县| 宝清县| 五华县| 长海县| 奉化市| 潞西市| 德兴市| 正定县| 界首市| 灵川县| 佛冈县| 陈巴尔虎旗| 永州市| 卢氏县| 松溪县| 库伦旗| 新安县| 忻州市| 拜泉县| 马边| 洪洞县| 海伦市| 衡水市| 温泉县| 保山市| 盱眙县| 香港| 安远县| 专栏|