自定義View系列(四) 計步器效果的實現(xiàn)

如果你留意的話,在QQ和支付寶都有運動步數(shù)控件凶掰,今天簡單實現(xiàn)一個簡單的運動步數(shù)效果

1.自定義屬性

不做過多解釋,直接上代碼

 <declare-styleable name="stepsView">
    <attr name="outerColor" format="color"/>
    <attr name="interColor" format="color"/>
    <attr name="borderWidth" format="dimension"/>
    <attr name="stepTextSize" format="dimension"/>
    <attr name="stepTextColor" format="color"/>
</declare-styleable>

 public class stepsView extends View {

 //初始化默認值
private int mOuterColor= Color.RED;
private int mInterColor=Color.BLUE;
private int mBorderWidth=20;
private int mStepTextSize=15;
private int mStepTextColor=Color.RED;
private Paint mOutPaint,mIntPaint,mTextPaint;

//最大和當前步數(shù)
private int mStepsMax=50000;
private int mCurrentStep=10000;

public stepsView(Context context) {
    this(context,null);
}

public stepsView(Context context, AttributeSet attrs) {
    this(context, attrs,0);
}

public stepsView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);

    //1.確定自定義屬性
    TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.stepsView);
    mOuterColor=array.getColor(R.styleable.stepsView_outerColor, mOuterColor);
    mInterColor=array.getColor(R.styleable.stepsView_interColor,mInterColor);
    mStepTextColor=array.getColor(R.styleable.stepsView_stepTextColor, mStepTextColor);
    mBorderWidth=(int)array.getDimension(R.styleable.stepsView_borderWidth,mBorderWidth);
    mStepTextSize=array.getDimensionPixelSize(R.styleable.stepsView_stepTextSize,mStepTextSize);
    array.recycle();

}
2.測量
 @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    //調(diào)用者在布局文件中可能 wrap_content
    //獲取模式 AT_most

    //寬高不一致 取最小值 確保是個正方形
   int width= MeasureSpec.getSize(widthMeasureSpec);
   int height= MeasureSpec.getSize(heightMeasureSpec);

    setMeasuredDimension(width>height?height:width,width>height?height:width);

} 
3.畫外圓弧
    //外圓弧 畫筆
    mOutPaint=new Paint();
    mOutPaint.setAntiAlias(true);
    mOutPaint.setStrokeWidth(mBorderWidth);
    mOutPaint.setColor(mOuterColor);
    //圓形結束
    mOutPaint.setStrokeCap(Paint.Cap.ROUND);
    mOutPaint.setStyle(Paint.Style.STROKE);//畫筆空心

    //中心點
    int center= getWidth()/2;
    //半徑
    int radius=getWidth()/2-mBorderWidth/2;
    //矩形
    RectF rectF=new RectF(center-radius,center-radius,center+radius,center+radius);
    canvas.drawArc(rectF,135,270,false,mOutPaint);
3.畫內(nèi)圓弧
  //內(nèi)圓弧 畫筆
    mIntPaint=new Paint();
    mIntPaint.setAntiAlias(true);
    mIntPaint.setStrokeWidth(mBorderWidth);
    mIntPaint.setColor(mInterColor);
    //圓形結束
    mIntPaint.setStrokeCap(Paint.Cap.ROUND);
    mIntPaint.setStyle(Paint.Style.STROKE);//畫筆空心


     if (mStepsMax==0)return;
     float sweepAngle= (float)mCurrentStep/mStepsMax;
     canvas.drawArc(rectF,135,sweepAngle*270,false,mIntPaint);
4.繪制文字
   //內(nèi)圓弧 畫筆
    mTextPaint=new Paint();
    mTextPaint.setAntiAlias(true);
    mTextPaint.setColor(mStepTextColor);
    mTextPaint.setTextSize(mStepTextSize);

   String stepText=mCurrentStep+"步";
    Rect textBounds=new Rect();
    mTextPaint.getTextBounds(stepText, 0, stepText.length(), textBounds);
    int dx=getWidth()/2-textBounds.width()/2;
    //基線
    Paint.FontMetricsInt fontMetricsInt = mTextPaint.getFontMetricsInt();
    int dy=(fontMetricsInt.bottom-fontMetricsInt.top)/2-fontMetricsInt.bottom;
     int baseline=getHeight()/2 +dy;
    canvas.drawText(stepText,dx,baseline,mTextPaint);
5.完善
   public synchronized void setStepMax(int stepMax){
     this.mStepsMax=stepMax;
    }
   public synchronized void setCurrentStep(int currentStep){
    this.mCurrentStep=currentStep;

    //不斷繪制
    invalidate();
   }
5.設置屬性動畫和使用
   stepView = (stepsView) findViewById(R.id.step_view);
    stepView.setStepMax(4000);

    //屬性動畫
  ValueAnimator valueAnimator= ObjectAnimator.ofFloat(0, 3000);
  valueAnimator.setDuration(1000);
  valueAnimator.setInterpolator(new DecelerateInterpolator());
  valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            float currentstep = (float) animation.getAnimatedValue();
            stepView.setCurrentStep((int)currentstep);

        }
    });
    valueAnimator.start();
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市钾埂,隨后出現(xiàn)的幾起案子扣汪,更是在濱河造成了極大的恐慌断楷,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件崭别,死亡現(xiàn)場離奇詭異冬筒,居然都是意外死亡,警方通過查閱死者的電腦和手機茅主,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門舞痰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人诀姚,你說我怎么就攤上這事响牛。” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵呀打,是天一觀的道長论衍。 經(jīng)常有香客問我,道長聚磺,這世上最難降的妖魔是什么坯台? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮瘫寝,結果婚禮上蜒蕾,老公的妹妹穿的比我還像新娘。我一直安慰自己焕阿,他們只是感情好咪啡,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著暮屡,像睡著了一般撤摸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上褒纲,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天准夷,我揣著相機與錄音,去河邊找鬼莺掠。 笑死衫嵌,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的彻秆。 我是一名探鬼主播楔绞,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼唇兑!你這毒婦竟也來了酒朵?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤扎附,失蹤者是張志新(化名)和其女友劉穎蔫耽,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體帕棉,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡针肥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了香伴。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片慰枕。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖即纲,靈堂內(nèi)的尸體忽然破棺而出具帮,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布蜂厅,位于F島的核電站匪凡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏掘猿。R本人自食惡果不足惜病游,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望稠通。 院中可真熱鬧衬衬,春花似錦、人聲如沸改橘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽飞主。三九已至狮惜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間碌识,已是汗流浹背碾篡。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留丸冕,地道東北人耽梅。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像胖烛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子诅迷,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容