最近在做一个长按暂停的动画控件,实现的效果是这样:

这里实现的思想主要是利用 pathmesure 去不断截取矩形椭圆的长度,从而形成的动画效果:

核心代码如下:

 protected void onDraw(Canvas canvas) {        mDst.reset();        mDst.lineTo(0, 0);        mPaint.setStyle(Paint.Style.FILL);        mPaint.setColor(mPauseBackgroudColor);        RectF bgRect = new RectF(mPadding * 2, mPadding * 2, mWidth - mPadding * 2, mHeight - mPadding * 2);        canvas.drawRoundRect(bgRect, mRadiusBg, mRadiusBg, mPaint);        int leftText = mWidth / 2;        Paint.FontMetricsInt fontMetrics = mPaintText.getFontMetricsInt();        float baseline = (bgRect.bottom + bgRect.top - fontMetrics.bottom - fontMetrics.top) / 2;        canvas.drawText(mPauseText, leftText, baseline, mPaintText);        if (MODE_OF_DRAW == DRAWING_MODE) {            RectF rect = new RectF(mPadding, mPadding, mWidth - mPadding, mHeight - mPadding);            mPaint.setStyle(Paint.Style.STROKE);            mPaint.setStrokeWidth(mStrokeWidth);            mPaint.setColor(PauseProgressSecondColor);            canvas.drawRoundRect(rect, mRadius, mRadius, mPaint);            mPaint.setStyle(Paint.Style.STROKE);            mPaint.setStrokeWidth(mStrokeWidth);            mPaint.setColor(mPauseProgressColor);            if (mAnimValue < 1.f) {                start = mLength * 0.25f;                stop = mLength * (mAnimValue);                mPathMeasure.getSegment(start, stop, mDst, true);            } else if (mAnimValue >= 1.f && mAnimValue <= 1.25f) {                mPathMeasure.getSegment(mLength * 0.25f, mLength, mDst, true);                canvas.drawPath(mDst, mPaint);                stop = mLength * (mAnimValue - 1);                start = 0;                mPathMeasure.getSegment(start, stop, mDst, true);            }            canvas.drawPath(mDst, mPaint);        } else if (MODE_OF_DRAW == CLEAR_MODE) {            mDst.reset();            mDst.lineTo(0, 0);        }    }

后面给出自定义类文件的下载,这里要注意的是截取矩形椭圆的起点位置默认是左边的半圆一半的位置,所以当我们改变起点的位置,就需要叠加两端来显示。

自定义属性如下:

 <declare-styleable name="LongPressPauseView">        <attr name="PauseSpeed">            <enum name="low" value="1" />            <enum name="medium" value="2" />            <enum name="high" value="3" />        attr>        <attr name="PauseBackgroudColor" format="reference|color" />        <attr name="PauseProgressColor" format="reference|color" />        <attr name="PauseProgressSecondColor" format="reference|color" />        <attr name="PauseTextSize" format="reference|dimension" />        <attr name="PauseText" format="reference|string" />    declare-styleable>

在xml中的使用如下:

   <com.yaoh.view.LongPressPauseView.LongPressPauseView        android:layout_width="300dp"        android:layout_height="80dp"        android:layout_centerInParent="true"        app:PauseBackgroudColor="@color/colorPrimary"        app:PauseProgressColor="@color/white_bg"        app:PauseProgressSecondColor="@color/gray_text_light"        app:PauseSpeed="medium"        app:PauseText="长按暂停"        app:PauseTextSize="18sp" />

还有地方需要完善,暂时就写到这里吧。

更多相关文章

  1. 如何控制android中ImageView的位置
  2. Gradle 安装以及查看jar文件本地的存储位置
  3. Java(Android)数据结构汇总(四)-- Map(下)
  4. Android输出log的包装
  5. android瀑布流,完美解决滑动过程中item位置错乱,下拉刷新顶部空白,
  6. Android自定义控件实战——滚动选择器PickerView
  7. 2.4 ImageView
  8. android popupwindow 模拟新浪、腾讯title弹框效果
  9. Android(安卓)N进入分屏代码分析二

随机推荐

  1. Android(安卓)获取汉字拼音
  2. Android(安卓)开发中的日常积累
  3. Android四种Activity的加载模式
  4. Androidの自定义对话框AlertDialog(一)
  5. Android(安卓): android 9.0 audio 接口
  6. 在Android中自定义IOS风格的按钮
  7. android studio打包apk时遇见的一些问题
  8. Android(安卓)Studio 之 AndroidManifest
  9. android:sharedUserId="android.uid.syst
  10. 为Android内核添加新驱动,并添加到menucon