最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2017年04月11日 10:53:47   投稿:jingxian  
下面小編就為大家?guī)硪黄仙U凙ndroid HapticFeedback(震動反饋)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

Android中長按一個控件的時候,想以震動提示用戶,除了用Vibrate類來做,還可以用到(HapticFeedback)震動反饋實現(xiàn)。

本篇文章,我們就一起來熟悉一下Android震動反饋,首先我們打開手機上的振動模式開光,這里我是以小米手機來做模擬的,位置在設(shè)置—>聲音和震動—>觸摸時震動,如下圖所示:

震動強度,我選擇了較強,以讓震動更明顯。

系統(tǒng)觸發(fā)震動

下面從一個例子,來開始本篇博客,對一個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();

    //觸發(fā)震動反饋
    return true;
    //return false;
   }
  });

當你長按此button,彈出一個toast,并且震動了,但是,返回false并不會觸發(fā)震動。

現(xiàn)在看源碼分析一下,這是為何。

button實現(xiàn)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是在哪里調(diào)用的接口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行執(zhí)行了onLongClick方法,并且將返回值給了變量handled,

在第18行,hangdled為true,執(zhí)行performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);該方法最終觸發(fā)了震動反饋。

這就是為什么,onLongClick返回true的時候,才會有震動效果。

自定義觸發(fā)震動

上節(jié)提到,在performHapticFeedback觸發(fā)震動,觀察源碼得知,用戶可以自己通過代碼來觸發(fā)。

如下文所示,點擊也會觸發(fā)震動反饋了:

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

   }
  });

現(xiàn)在我們就去performHapticFeedback源碼看下,都執(zhí)行了什么,

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的情況下,才會觸發(fā)震動。之后會解釋在為false的情況下,為何不會觸發(fā)震動。

在xml里,可以通過android:hapticFeedbackEnabled=”false|true”來進行設(shè)置

在java代碼里,可以通過view.setHapticFeedbackEnabled(boolean)來設(shè)置,

不過默認是true哦。

2、HapticFeedbackConstants的常量值,我們要用到的有三個,一個是LONG_PRESS(長按),第二個是FLAG_IGNORE_VIEW_SETTING(不受view的設(shè)置影響,即不受isHapticFeedbackEnabled()的影響),第三個是FLAG_IGNORE_GLOBAL_SETTING(不受系統(tǒng)設(shè)置的影響,即不受是否開啟震動反饋的影響)

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,整個條件為真,所以會執(zhí)行17行,直接return。這也是為什么performHapticFeedback(int feedbackConstant)方法一定要在isHapticFeedbackEnabled()為ture的情況下才會觸發(fā)震動。

在這里說一下,&是按位與,返回數(shù)值,&&邏輯與,返回布爾值。

第19-20行,就是觸發(fā)底層震動的代碼了,之后代碼不做分析。

HapticFeedbackConstants常量

接下來,看下HapticFeedbackConstants三個常量,還是之前的代碼,如下所示:

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

在單擊后,會觸發(fā)震動,但是如果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的屬性設(shè)置。

還記得本篇文章之前,說去設(shè)置里打開觸摸時震動的開關(guān)嗎,其實,用戶不打開,照樣可以讓其震動,只需要用如下的方法:

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

忽略系統(tǒng)設(shè)置,哈哈,不過不建議這樣做,畢竟用戶禁止了觸摸反饋,我們就沒必要繼續(xù)挑戰(zhàn)用戶極限了。

最后,我還要說一點,就是以上的方法,不需要震動權(quán)限,不需要震動權(quán)限,不需要震動權(quán)限、重要的事情說三遍。

以上這篇老生常談Android HapticFeedback(震動反饋)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android?LineChart繪制折線圖的示例詳解

    Android?LineChart繪制折線圖的示例詳解

    這篇文章主要為大家想想介紹了Android?RecyclerLineChart實現(xiàn)繪制折線圖的相關(guān)資料,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2023-03-03
  • Android 5.0以上Toast不顯示的解決方法

    Android 5.0以上Toast不顯示的解決方法

    最近在開發(fā)中我們經(jīng)常會在適配5.0以后的機型遇到各種各樣的問題,其中有一個不大不小的問題就是:Toast不顯示問題,這篇文章就給大家總結(jié)了Android 5.0以上Toast不顯示的原因與解決方法,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-11-11
  • 利用Android兩行代碼真正殺死你的App

    利用Android兩行代碼真正殺死你的App

    這篇文章主要介紹了利用Android兩行代碼真正殺死你的App,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • Android發(fā)送短信方法實例詳解

    Android發(fā)送短信方法實例詳解

    這篇文章主要介紹了Android發(fā)送短信方法,結(jié)合實例形式較為詳細的分析了Android發(fā)送短信的原理與具體實現(xiàn)技巧,需要的朋友可以參考下
    2016-01-01
  • Android自定義View-Paint詳解

    Android自定義View-Paint詳解

    這篇文章主要介紹了Android自定義View-Paint詳解,對Paint感興趣的同學可以參考下
    2021-04-04
  • Android實現(xiàn)多維商品屬性SKU選擇

    Android實現(xiàn)多維商品屬性SKU選擇

    這篇文章主要為大家詳細介紹了Android實現(xiàn)多維商品屬性SKU選擇,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • 解析Android截取手機屏幕兩種實現(xiàn)方案

    解析Android截取手機屏幕兩種實現(xiàn)方案

    這篇文章主要介紹了解析Android截取手機屏幕兩種實現(xiàn)方案,非常具有實用價值,需要的朋友可以參考下
    2017-04-04
  • Android Flutter實現(xiàn)上拉加載組件的示例代碼

    Android Flutter實現(xiàn)上拉加載組件的示例代碼

    既然列表有下拉刷新外當然還有上拉加載更多操作了,本次就為大家詳細介紹如何利用Flutter實現(xiàn)為列表增加上拉加載更多的交互,感興趣的可以了解一下
    2022-08-08
  • Android數(shù)字華容道小游戲開發(fā)

    Android數(shù)字華容道小游戲開發(fā)

    這篇文章主要為大家詳細介紹了Android數(shù)字華容道小游戲開發(fā)的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Android framework ATMS啟動流程

    Android framework ATMS啟動流程

    這篇文章主要為大家介紹了Android framework ATMS啟動流程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03

最新評論

兰坪| 上饶县| 兴国县| 南宁市| 镇安县| 囊谦县| 库尔勒市| 阿巴嘎旗| 乌鲁木齐市| 黄山市| 兴和县| 中宁县| 永修县| 波密县| 开原市| 潞西市| 苏尼特右旗| 晋州市| 汉源县| 根河市| 涪陵区| 米脂县| 固镇县| 德江县| 庄河市| 农安县| 凤阳县| 全州县| 洪雅县| 贵港市| 萝北县| 宝兴县| 江华| 新安县| 铜陵市| 襄樊市| 淮滨县| 海南省| 高邮市| 盘锦市| 光山县|