android 数字滚动抽奖_跳动的数字和金额、滑动的数字

本文介绍了如何在Android中创建一个数字滚动抽奖视图。通过`SingleScrollNumberView`类,实现了数字跳跃和滑动的效果,支持单个数字的跳动。代码中包含了文字边距处理、字体大小设置以及动画滚动的实现逻辑。
摘要由CSDN通过智能技术生成

importandroid.content.Context;importandroid.graphics.Canvas;importandroid.graphics.Color;importandroid.graphics.Paint;importandroid.graphics.Rect;importandroid.support.annotation.Nullable;importandroid.text.TextUtils;importandroid.util.AttributeSet;importandroid.view.View;importcom.shoneworn.supermvp.uitls.NumberUtils;/*** Created by chenxiangxiang on 2019/5/16.

*

*@authorshoneworn

* @只支持单个文字的跳动,只想支持数字。*/

public class SingleScrollNumberView extendsView {private String mText = "";private int mTextColor =Color.BLACK;private int mTextSize = 48;private int textPadding = 6;privatePaint mPaint;privateContext mContext;private static String BASE_NUMBER = "0123456789";/*** 由于只想用一个view完事,但是文字绘制的时候,不带边距,只好在measure的时候,用大字体占个大位置。在onDraw的时候,用小字体。这样文字就自带了边距*/

private inttextOutHeight;private inttextOutWidth;private inttextInnerWidth;private int scrollY = 0;private int scale = 2;publicSingleScrollNumberView(Context context) {this(context, null);

}publicSingleScrollNumberView(Context context, @Nullable AttributeSet attrs) {this(context, attrs, 0);

}public SingleScrollNumberView(Context context, @Nullable AttributeSet attrs, intdefStyleAttr) {super(context, attrs, defStyleAttr);this.mContext =context;

initPaint();

}private voidinitPaint() {

mPaint= newPaint();//设置抗锯齿

mPaint.setAntiAlias(true);//设置字体和颜色

mPaint.setTextSize(mTextSize *scale);

mPaint.setColor(mTextColor);

setPadding(textPadding, textPadding, textPadding, textPadding);

}publicSingleScrollNumberView setText(String text) {this.mText =text;return this;

}public SingleScrollNumberView setTextColor(inttextColor) {this.mTextColor =textColor;

mPaint.setColor(mTextColor);return this;

}public SingleScrollNumberView setTextSize(inttextSize) {this.mTextSize =textSize;

mPaint.setTextSize(mTextSize*scale);return this;

}public SingleScrollNumberView setTextPadding(intpadding) {this.textPadding =padding;

setPadding(textPadding, textPadding, textPadding, textPadding);return this;

}

@Overrideprotected void onMeasure(int widthMeasureSpec, intheightMeasureSpec) {int widthMode =MeasureSpec.getMode(widthMeasureSpec);int heightMode =MeasureSpec.getMode(heightMeasureSpec);int width =MeasureSpec.getSize(widthMeasureSpec);int height =MeasureSpec.getSize(heightMeasureSpec);if (widthMode ==MeasureSpec.AT_MOST) {

Rect bounds= newRect();

mPaint.getTextBounds(mText,0, mText.length(), bounds);

textOutWidth=bounds.width();

width= bounds.width() + getPaddingLeft() +getPaddingRight();

}if (heightMode ==MeasureSpec.AT_MOST) {

Rect bounds= newRect();

mPaint.getTextBounds(mText,0, mText.length(), bounds);

textOutHeight=bounds.height();

height= textOutHeight + getPaddingTop() +getPaddingBottom();

}//设置宽高

setMeasuredDimension(width, height);

}

@Overrideprotected voidonDraw(Canvas canvas) {super.onDraw(canvas);if (TextUtils.isEmpty(mText)) return;if (mText.length() > 1) return;if (!BASE_NUMBER.contains(mText)) return;//保持垂直方向居中//getPaddingLeft() + (textOutWidth - textInnerWidth) / 2 保持水平方向居中

mPaint.setTextSize(mTextSize);

Paint.FontMetricsInt fontMetrics=mPaint.getFontMetricsInt();int dy = (fontMetrics.bottom - fontMetrics.top) / 2 -fontMetrics.bottom;int baseLine = getHeight() / 2 +dy;for (int i = 0; i <= NumberUtils.toInt(mText); i++) {

mPaint.setTextSize(mTextSize);

Rect innerBounds= newRect();

mPaint.getTextBounds(mText,0, mText.length(), innerBounds);

textInnerWidth=innerBounds.width();

canvas.drawText(String.valueOf(i), getPaddingLeft()+ (textOutWidth - textInnerWidth) / 2, baseLine + i * textOutHeight -scrollY, mPaint);

}

}private voidanimateView() {this.postDelayed(newRunnable() {

@Overridepublic voidrun() {//最大数字出现后,就要停下来。还要停稳,不然多几个数字,就会出现高低不平了。

if (scrollY >= textOutHeight *NumberUtils.toInt(mText)) {

scrollY= textOutHeight *NumberUtils.toInt(mText);

SingleScrollNumberView.this.postInvalidate();return;

}

scrollY+= textOutHeight / 4;

SingleScrollNumberView.this.postInvalidate();

animateView();

}

},8);

}public voidstart() {

scrollY= 0;

animateView();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值