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

Android自定義View實現(xiàn)可展開、會呼吸的按鈕

 更新時間:2019年08月22日 10:57:58   作者:猴菇同學  
這篇文章主要為大家詳細介紹了Android自定義View實現(xiàn)可展開、會呼吸的按鈕,具有一定的參考價值,感興趣的小伙伴們可以參考一下

不專門練習的話,自定義View的知識又忘了許多。正好新項目里有這個需求,就再練習一下,代碼已上傳:地址

可以修改文本、文字大小、各種顏色:

1、按照國際慣例,就是新建attrs,寫各種需要的屬性,然后獲取,新建各種所需的Paint、Rect,重寫onMeasure計算寬高,重寫onDraw畫圖搞起。。

2、關于可展開效果,其實就是點擊發(fā)布時,啟動一個ValueAnimator,對一個圓角矩形的左邊距離不斷改變:

int mBackgroundRectFLeft;
RectF mBackgroundRectF = new RectF();

@Override
protected void onDraw(Canvas canvas) {
 mBackgroundRectF.set(mBackgroundRectFLeft, 0, getWidth(), getHeight());
 canvas.drawRoundRect(mBackgroundRectF, mOuterRadius, mOuterRadius, mmBackgroundRectPaint);//圓角背景矩形
}

private void openButton() {
 ValueAnimator rectLeftAnim = ValueAnimator.ofInt(mBackgroundRectFLeft, mArcWidth / 2);
 rectLeftAnim.setDuration(250);
 ValueAnimator textAlphaAnim = ValueAnimator.ofInt(0, mItemTextAlpha);
 textAlphaAnim.setDuration(120);
 rectLeftAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
 @Override
 public void onAnimationUpdate(ValueAnimator animation) {
  mBackgroundRectFLeft = (int) animation.getAnimatedValue();
  invalidate();
 }
 });
}

3、關于呼吸效果,就是一個對外圓圈半徑改變的ValueAnimator:

mBreatheRadius = getHeight() / 2 - mArcWidth / 4;
mBreatheAnim = ValueAnimator.ofFloat(mBreatheRadius, mBreatheRadius - mArcWidth / 2);
mBreatheAnim.setDuration(1000);
mBreatheAnim.setRepeatMode(ValueAnimator.REVERSE);
mBreatheAnim.setRepeatCount(Integer.MAX_VALUE);
mBreatheAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
 @Override
 public void onAnimationUpdate(ValueAnimator animation) {
 mBreatheRadius = (float) animation.getAnimatedValue();
 invalidate();
 }
});
mBreatheAnim.start();

@Override
protected void onDraw(Canvas canvas) {
 canvas.drawCircle(mInnerCircleCenterX, mInnerCircleCenterY, mBreatheRadius, mBreathePaint);//呼吸圈

4、關于文字位置居中計算,以前我用一個Rect,用

paint.getTextBounds(text, 0, text.length(), mTextRect);
int textWidth = mTextRect.width();
int textHeight = mTextRect.height();

這樣計算不準確,可能是因為返回的寬高是int值,應該用FontMetrics類來計算,大家可以搜一下:

float buttonTextWidth = mButtonTextPaint.measureText(mButtonStr, 0, mButtonStr.length());

Paint.FontMetrics publishFontMetrics = mButtonTextPaint.getFontMetrics();
canvas.drawText(mButtonStr, 0, mButtonStr.length(), getWidth() - mOuterRadius - mArcWidth / 2 - buttonTextWidth / 2, mOuterRadius + mArcWidth / 2 + -(publishFontMetrics.ascent + publishFontMetrics.descent) / 2, mButtonTextPaint);

5、再有就是OnTouchEvent的處理,因為這個控件不是一直都是展開狀態(tài),那么就要求控件在閉合的時候,要不影響該控件下層控件對點擊的處理。比如我這個ExpandableBreathngButton,下層是一個RecyclerView,并設置了OnItemClickListener,那我這個按鈕在閉合時,點擊按鈕左側(cè)但還是在這個View范圍內(nèi)的地方,如下圖紅框內(nèi)

這個范圍內(nèi)應該不處理事件,return false

@Override
public boolean onTouchEvent(MotionEvent event) {
 switch (event.getAction()) {
 case MotionEvent.ACTION_DOWN:
  x = (int) event.getX();
  y = (int) event.getY();
  if (!isOpen && x < getWidth() - 2 * mOuterRadius && y > 0 && y < getHeight()) {
  //未展開狀態(tài)下,點擊發(fā)布圓左側(cè)的位置,不處理事件
  return false;
  }
  break;
 }
}

然后在up事件中計算點擊了發(fā)布按鈕還是展開的item,就是計算點擊的坐標是在圓半徑內(nèi),還是在item矩形范圍內(nèi)。

最后源碼奉上: 詳細地址

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:

相關文章

最新評論

铁岭市| 甘洛县| 江阴市| 丰县| 手机| 民勤县| 抚顺市| 新余市| 南平市| 丰镇市| 麟游县| 房山区| 商丘市| 双江| 和林格尔县| 星子县| 马鞍山市| 遵义市| 轮台县| 偏关县| 肃宁县| 通江县| 特克斯县| 长治市| 广安市| 理塘县| 分宜县| 彰化县| 郓城县| 岢岚县| 庆阳市| 屏东市| 林口县| 沐川县| 庆阳市| 上虞市| 东阿县| 日喀则市| 乐都县| 安康市| 辽宁省|