<declare-styleable name="AdTimePickView"> <attr name="mSmallCircleBg" format="color"></attr> <attr name="mTextSize1" format="dimension"></attr> <attr name="mTextColor1" format="color"></attr> <attr name="mProgressWidth" format="dimension"></attr> <attr name="mRadius" format="dimension"></attr> </declare-styleable>
mProgressViewWidth = typedArray.getDimensionPixelSize(R.styleable.AdTimePickView_mProgressWidth, DEFAULT_PROGRESS_WIDTH); mRadius = typedArray.getDimensionPixelSize(R.styleable.AdTimePickView_mRadius1, DEFAULT_RADIUS); mSmallCircleBg = typedArray.getColor(R.styleable.AdTimePickView_mSmallCircleBg, Color.parseColor(DEFAULT_BG_COLOR)); mTextSize = typedArray.getDimensionPixelSize(R.styleable.AdTimePickView_mTextSize1, DEFAULT_TEXT_SIZE); mTextColor = typedArray.getColor(R.styleable.AdTimePickView_mTextColor1, Color.parseColor(DEFAULT_TEXT_COLOR));
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
mWidth = getViewSize(widthMeasureSpec, 0);
mHeight = getViewSize(heightMeasureSpec, 1);
mRadius = Math.min(mWidth, mHeight) / 2;
setMeasuredDimension(mWidth, mHeight);
}
private int getViewSize(int viewMeasureSpec, int type) {
int viewValue = 0;
int viewSize = MeasureSpec.getSize(viewMeasureSpec);
int viewMode = MeasureSpec.getMode(viewMeasureSpec);
if (MeasureSpec.EXACTLY == viewMode) {
viewValue = viewSize;
if (type == 0) {
mCirCleX = viewSize / 2;
} else {
mCircleY = viewSize / 2;
}
} else {
if (type == 0) {
mCirCleX = mRadius;
} else {
mCircleY = mRadius;
}
viewValue = 2 * (mRadius + mProgressViewWidth);
}
return viewValue;
}
canvas.drawCircle(mCirCleX, mCircleY, (float) (mRadius - 1.5 * mProgressViewWidth), mPaint);
Rect textRect = getTextRect(String.valueOf(mAdTIme));
Paint.FontMetrics fontMetrics = mTextPaint.getFontMetrics();
int baseLine = (int) (mHeight / 2 + (fontMetrics.descent - fontMetrics.ascent) / 2 - fontMetrics.descent);
int x = mWidth / 2 - textRect.width() / 2;
canvas.drawText(String.valueOf(mAdTIme), x, baseLine, mTextPaint);
//获取绘制内容的Rect
private Rect getTextRect(String centerContent) {
Rect rect = new Rect();
mTextPaint.getTextBounds(centerContent, 0, centerContent.length(), rect);
return rect;
}
//保存Canvans的状态,因为绘制其他地方时,Canvas坐标系不需要变化 canvas.save(); //将坐标系围绕View的中心逆时针旋转90度数,为了从正上方开始绘制 canvas.rotate(-90, mCirCleX, mCircleY); //计算圆弧的RectF RectF rectF = new RectF(mCirCleX - mRadius + mProgressViewWidth, mCirCleX - mRadius + mProgressViewWidth, mCirCleX + mRadius - mProgressViewWidth, mCirCleX + mRadius - mProgressViewWidth); //第四个参数表示逆时针还是顺时针绘制 canvas.drawArc(rectF, 0, -mCurrentAngle, false, mPaint); //恢复坐标系 canvas.restore();
//interval操作符:从1开始每隔一段时间发射递增的数
Observable.interval(1, TIME_DIFF, TimeUnit.MILLISECONDS)
//map操作符将发射的数据转换成我们需要的数据
.map(value -> {
return countAngel - value.intValue();
})
//限制发射的数据个数,让其停止,负责会一直发射下去
.limit(361)
//接收结果并处理
.subscribe(action -> {
if (action % 72 == 0) {
mAdTIme = action / 72;
}
mCurrentAngle = action;
AdTimePickView.this.postInvalidate();
});
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 360; i>=0;i--){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (i % 72 == 0) {
mAdTIme = i / 72;
}
mCurrentAngle = i;
AdTimePickView.this.postInvalidate();
}
}
}).start();
public class AdTimePickView extends View {
private Paint mPaint;
private Paint mTextPaint;
//大圆半径
private int mRadius = 200;
//内层小圆背景
private int mSmallCircleBg = Color.parseColor("#66f1679b");
//小圆外层线条宽度
private int mProgressViewWidth = 10;
private float mCurrentAngle;
private static final int TIME_DIFF = 25;
//圆心坐标
private int mCirCleX;
private int mCircleY;
//测量之后View的宽高,绘制中心文字时需要用到
private int mWidth;
private int mHeight;
//中心文字的大小与样式
private int mTextSize;
private int mTextColor;
//广告总时间
private int mAdTIme = 5;
private Context mContext;
public AdTimePickView(Context context) {
this(context, null);
}
public AdTimePickView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public AdTimePickView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.AdTimePickView, defStyleAttr, 0);
mProgressViewWidth = typedArray.getDimensionPixelSize(R.styleable.AdTimePickView_mProgressWidth, 10);
mRadius = typedArray.getDimensionPixelSize(R.styleable.AdTimePickView_mRadius1, 100);
mSmallCircleBg = typedArray.getColor(R.styleable.AdTimePickView_mSmallCircleBg, Color.parseColor("#66f1679b"));
mTextSize = typedArray.getDimensionPixelSize(R.styleable.AdTimePickView_mTextSize1, 20);
mTextColor = typedArray.getColor(R.styleable.AdTimePickView_mTextColor1, Color.parseColor("#333333"));
//注意资源的回收
typedArray.recycle();
this.mContext = context;
init();
}
private void init() {
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setAntiAlias(true);
mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mTextPaint.setColor(mTextColor);
mTextPaint.setTextSize(mTextSize);
mTextPaint.setStyle(Paint.Style.FILL);
mTextPaint.setAntiAlias(true);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
mWidth = getViewSize(widthMeasureSpec, 0);
mHeight = getViewSize(heightMeasureSpec, 1);
//大半径
mRadius = Math.min(mWidth, mHeight) / 2;
setMeasuredDimension(mWidth, mHeight);
}
private int getViewSize(int viewMeasureSpec, int type) {
int viewValue = 0;
int viewSize = MeasureSpec.getSize(viewMeasureSpec);
int viewMode = MeasureSpec.getMode(viewMeasureSpec);
if (MeasureSpec.EXACTLY == viewMode) {
viewValue = viewSize;
if (type == 0) {
mCirCleX = viewSize / 2;
} else {
mCircleY = viewSize / 2;
}
} else {
if (type == 0) {
mCirCleX = mRadius;
} else {
mCircleY = mRadius;
}
viewValue = 2 * (mRadius + mProgressViewWidth);
}
return viewValue;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mPaint.setColor(mSmallCircleBg);
mPaint.setStyle(Paint.Style.FILL);
canvas.drawCircle(mCirCleX, mCircleY, (float) (mRadius - 1.5 * mProgressViewWidth), mPaint);
//设置画笔状态
mPaint.setColor(mTextColor);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(mProgressViewWidth);
//保存Canvans的状态
canvas.save();
//将坐标系围绕View的中心逆时针旋转90度数
canvas.rotate(-90, mCirCleX, mCircleY);
RectF rectF = new RectF(mCirCleX - mRadius + mProgressViewWidth, mCirCleX - mRadius + mProgressViewWidth, mCirCleX + mRadius - mProgressViewWidth, mCirCleX + mRadius - mProgressViewWidth);
//第四个参数表示逆时针还是顺时针绘制
canvas.drawArc(rectF, 0, -mCurrentAngle, false, mPaint);
canvas.restore();
Rect textRect = getTextRect(String.valueOf(mAdTIme));
Paint.FontMetrics fontMetrics = mTextPaint.getFontMetrics();
int baseLine = (int) (mHeight / 2 + (fontMetrics.descent - fontMetrics.ascent) / 2 - fontMetrics.descent);
int x = mWidth / 2 - textRect.width() / 2;
canvas.drawText(String.valueOf(mAdTIme), x, baseLine, mTextPaint);
}
private Rect getTextRect(String centerContent) {
Rect rect = new Rect();
mTextPaint.getTextBounds(centerContent, 0, centerContent.length(), rect);
return rect;
}
public void refresh() {
final int countAngel = 360;
Observable.interval(1, TIME_DIFF, TimeUnit.MILLISECONDS)
.map(value -> {
return countAngel - value.intValue();
})
.limit(361)
.subscribe(action -> {
if (action % 72 == 0) {
mAdTIme = action / 72;
}
mCurrentAngle = action;
AdTimePickView.this.postInvalidate();
});
}
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有