亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android實現點擊Button產生水波紋效果

2020-04-11 11:02:32
字體:
來源:轉載
供稿:網友

先上圖,看看接下來我要向大家介紹的是個什么東西,如下圖:

接下來要介紹的就是如何實現上述圖中的波紋效果,這種效果如果大家沒有體驗過的話,可以看看百度手機衛士或者360手機衛士,里面的按鈕點擊效果都是這樣的,另外Android 5.0以上的版本也出現了這種效果。不多說,下面聊聊具體的怎么實現。

首先大家看到的是三個button,水波紋的出現給我們的錯覺是直接將波紋繪制在button上面的,但是這樣能做到嗎?首先button自己有background和src,如果把半透明的水波紋當作background或者src繪制到button上面,肯定是會損失button原有的樣式的??赡苡信笥巡孪肽蔷桶阉y繪制在屏幕上唄,恭喜這位朋友答對了,至少我是這么干的,具體思路就是,我們自己實現一個layout,在layout中捕捉事件,并對事件進行相應的處理,在down事件中尋找當前用戶點擊的是哪個view,找出view所在的矩形區域,將一個透明的圓環繪制到這個矩形區域,在up事件中,延時分發view的onclick事件。

  • 1、自己實現一個layout:
  • 2、重寫layout的dispatchTouchEvent方法,在down事件中找出被點擊的view。
  public View findTargetView(float x, float y, View anchorView) {    ArrayList<View> touchablesView = anchorView.getTouchables();    View targetView = null;    for (View child : touchablesView) {      RectF rectF = getViewRectF(child);      if (rectF.contains(x, y) && child.isClickable()) {        // 這說明被點擊的view找到了        targetView = child;        break;      }    }    return targetView;  }

接著找出view所在的矩形區域,因為要將波紋繪制到該區域:

  public RectF getViewRectF(View view) {    int[] location = new int[2];    view.getLocationOnScreen(location);    int childLeft = location[0];    int childTop = location[1];    int childRight = childLeft + view.getMeasuredWidth();    int childBottom = childTop + view.getMeasuredHeight();    return new RectF(childLeft, childTop, childRight, childBottom);  }

矩形區域找到之后,這個區域就是我們要繪制的博波紋所在地,上面也說過了,波紋其實就是圓環,繪制圓的畫是需要知道圓心坐標和圓的半徑,圓心坐標肯定就是down時候的x和y了,但是半徑怎么計算合適?大家看到上面的圖知道如果view的寬度大于高度,點擊view的左下角或者右下角,那么半徑基本上就是等于view的寬度,點擊view的上部或者下部分,半徑就是在0和view的高度之間,具體的計算方式看下圖:

那么根據上圖,半徑的計算方式就應該是:

  float left = circleCenterX - targetTouchRectF.left;  float right = targetTouchRectF.right - circleCenterX;  float top = circleCenterY - targetTouchRectF.top;  float bottom = targetTouchRectF.bottom - circleCenterY;  // 計算出最大的值則為半徑  rawRadius = Math.max(bottom, Math.max(Math.max(left, right), top));

半徑算出來了,雖說圓心就是down時的x和y,但是有個地方還是需要注意的,在繪制圓環的時候提供的圓心坐標的x和y是在本文中是相對于layout的,所以在計算y的時候是需要進行一定處理的:

  /**   * 獲取圓環的中心坐標   */  public float[] getCircleCenterPostion(float x,float y){    int[] location = new int[2];    float[] mDownPositon = new float[2];    getLocationOnScreen(location );    mDownPositon[0] = x;    mDownPositon[1] = y -location[1];    return mDownPositon;  }

圓心坐標和半徑都計算好了,記下來就可以繪制圓形波紋了,那么在哪里繪制這個波紋比較合適呢?有朋友立馬就說肯定是在onDraw方法里面繪制了,那么恭喜你在我看來你是答錯了,我們的layout中是很有很多childview的,而layout是個viewGroup,viewGroup在繪制的時候,是先繪制自身的背景,再繪制自身,再繪制childview,如果在onDraw中繪制波紋,也就意味者后面繪制出來的childView會將我們的波紋遮蓋,所以我們就應該等到childview繪制完畢后再來繪制波紋,這樣可以保證childview在最頂層。
重寫dispatchDraw方法:

  @Override  protected void dispatchDraw(Canvas canvas) {    super.dispatchDraw(canvas);    /**     * 繪制完子元素后開始繪制波紋     */    if (mTargetTouchView != null) {      RectF clipRectF = clipRectF(mTargetTouchView);      canvas.save();      // 為了不讓繪制的圓環超出所要繪制的范圍      canvas.clipRect(clipRectF);      if(drawedRadius < rawRadius){        drawedRadius += rawRadius / drawingRadiusDegrees;        canvas.drawCircle(mDownPositon[0], mDownPositon[1], drawedRadius, mHalfTransPaint);        postInvalidateDelayed(INVALID_DURATION);      }else{        canvas.drawCircle(mDownPositon[0], mDownPositon[1], rawRadius, mTransPaint);        post(delayedRunnable);      }      canvas.restore();    }  }

在分發繪制事件中大家可以看到,波紋是一段一段的繪制,形如下圖:

而這一段段的波紋正是通過繪制一個個的圓環實現的,所以在沒繪制完畢一個圓環的時候,都需要延時重新繪制下一個圓環。
通過上面波紋效果基本上完成了,但是按鈕是有點擊事件的,像360手機衛士或者百度手機衛士等都是等波紋效果播放完畢后才會響應點擊事件,所以我們這里也要對這個點擊事件進行延時響應。
在up事件中,記錄此次事件的event,并且返回true,表示消費此次的事件,然后再圓環繪制完畢后,再利用找到的view去分發這個event:

  if (ev.getAction() == MotionEvent.ACTION_UP) {      // 需要讓波紋繪制完畢后再執行在up中執行的方法//     if(drawedRadius==0){//       return false;//     }//     long totalTime = (long) (INVALID_DURATION * (drawingRadiusDegrees+5));//     // 離波紋結束的時間//     long time = (long) (totalTime - drawedRadius*totalTime / rawRadius);      delayedRunnable.event = ev;      return true;  }  class postUpEventDelayed implements Runnable{    private MotionEvent event;    @Override    public void run() {      if(mTargetTouchView!=null && mTargetTouchView.isClickable()          && event!=null){        mTargetTouchView.dispatchTouchEvent(event);// 分發      }    }  }

在dispatchDraw方法中,判斷如果繪制完畢就post(delayedRunnable);執行childView的事件延時分發。

以上就是本文的全部內容,希望對大家的學習Android程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久免费视频在线| 久久亚洲一区二区三区四区五区高| 日韩视频一区在线| 亚洲成色www8888| www.久久久久| 69久久夜色精品国产69| 国产一区二区三区在线播放免费观看| 欧美视频第一页| 亚洲女人天堂网| 欧美有码在线视频| 奇米4444一区二区三区| 成人在线免费观看视视频| 日韩一区av在线| 国产精品久久77777| 欧美日韩福利视频| 国产一区二区三区18| 精品美女久久久久久免费| 国产精品成人免费电影| 日韩国产激情在线| 亚洲乱码av中文一区二区| 91视频8mav| 国产美女久久精品香蕉69| 4p变态网欧美系列| 国产成人精品综合久久久| 精品国产31久久久久久| 国产精品福利在线观看| 55夜色66夜色国产精品视频| 国产丝袜精品第一页| 欧美性猛交xxxx乱大交极品| 日韩欧美成人精品| 久久福利视频网| 秋霞午夜一区二区| 国产剧情久久久久久| 日本三级韩国三级久久| 亚洲人成在线播放| 国产成人综合一区二区三区| 91精品在线一区| 中文字幕精品在线视频| 一区二区欧美亚洲| 欧美激情a∨在线视频播放| 欧美巨乳在线观看| 欧美午夜精品在线| 久久久精品一区二区| 国产精品久久久久久久一区探花| 亚洲免费视频一区二区| 亚洲精品国产精品乱码不99按摩| 国产日韩欧美成人| 日韩美女在线观看一区| 亚洲精品aⅴ中文字幕乱码| 欧美资源在线观看| 91国内揄拍国内精品对白| 日韩a**站在线观看| 日韩国产高清污视频在线观看| 欧美整片在线观看| 国产成人在线精品| 一本大道香蕉久在线播放29| 亚洲人线精品午夜| 久久免费少妇高潮久久精品99| 51视频国产精品一区二区| 亚洲一区二区福利| 亚洲精品美女久久久| 色综合91久久精品中文字幕| 69久久夜色精品国产69乱青草| 欧美高清不卡在线| 亚洲一区二区免费| 日本久久久久亚洲中字幕| 亚洲在线第一页| 在线观看国产精品91| 色偷偷噜噜噜亚洲男人| 日韩免费观看视频| 欧美日韩人人澡狠狠躁视频| 亚洲最大激情中文字幕| 亚洲天堂男人天堂女人天堂| 欧美国产精品日韩| 欧美大尺度激情区在线播放| 色综合久久中文字幕综合网小说| 欧美另类暴力丝袜| 在线免费观看羞羞视频一区二区| 精品久久久久久久久久久久| 国产精品女人网站| 一区二区成人av| 欧美男插女视频| 久久伊人精品一区二区三区| 国产精品av电影| 久久99久久99精品中文字幕| 国产不卡一区二区在线播放| 久久精品在线播放| 亚洲人成电影网站色www| 自拍亚洲一区欧美另类| 91精品成人久久| 精品亚洲一区二区三区在线观看| 国产精品观看在线亚洲人成网| 亚洲永久免费观看| 国产精品久久久久久亚洲调教| 九九热精品视频国产| 久久免费视频网站| 欧美大人香蕉在线| 国产成人久久精品| 91精品在线观| 亚洲国产日韩欧美综合久久| 国产一区二区三区欧美| 26uuu另类亚洲欧美日本一| 久久精品国亚洲| 国产日韩欧美在线| 亚洲国产婷婷香蕉久久久久久| 国产精品自产拍在线观看中文| 欧美丰满少妇xxxx| 欧美亚洲免费电影| 不卡av日日日| 久久最新资源网| 九九视频直播综合网| 社区色欧美激情 | 欧美福利在线观看| 中日韩美女免费视频网站在线观看| 91精品国产综合久久久久久久久| 日韩电影免费在线观看| 91高清视频免费| 国产精品自产拍在线观看中文| 欧美性猛交xxxx偷拍洗澡| 久久成年人视频| 91免费在线视频| 国产大片精品免费永久看nba| 欧美性猛交xxxx免费看| 欧美日韩一二三四五区| 亚洲欧美国内爽妇网| 成人啪啪免费看| 91精品国产成人www| 成人免费看吃奶视频网站| 国产精品视频久久久| 国产视频亚洲视频| 色综合久久88色综合天天看泰| 久久久人成影片一区二区三区| 中文字幕日韩专区| 精品亚洲夜色av98在线观看| 欧美国产日韩一区二区在线观看| 亚洲国产日韩欧美在线图片| 国产精品三级美女白浆呻吟| 欧美激情日韩图片| 国产91精品最新在线播放| 97国产suv精品一区二区62| 国产精品爱久久久久久久| 国产在线观看不卡| 亚洲娇小xxxx欧美娇小| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲性av在线| 久久av资源网站| 日韩中文字幕视频在线观看| 日韩欧美aaa| 亚洲男人天堂九九视频| 亚洲另类欧美自拍| 成人精品久久一区二区三区| 日韩成人在线播放| 国产精品影片在线观看| 国产精品啪视频| 精品国产一区二区三区四区在线观看| 深夜福利一区二区| 亚洲精美色品网站| 日韩欧美在线免费| 日本成人在线视频网址| 中文字幕一区二区三区电影| 欧美性69xxxx肥| 国产成人涩涩涩视频在线观看| 国产精品91久久| 欧美日韩国产在线看|