日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

android view 渐变动画,Android自定义view渐变圆形动画

發(fā)布時(shí)間:2024/9/30 Android 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android view 渐变动画,Android自定义view渐变圆形动画 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文實(shí)例為大家分享了Android自定義view漸變圓形動(dòng)畫(huà)的具體代碼,供大家參考,具體內(nèi)容如下

直接上效果圖

自定義屬性

attrs.xml文件

創(chuàng)建一個(gè)類(lèi) ProgressRing繼承自 view

public class ProgressRing extends View {

private int progressStartColor;

private int progressEndColor;

private int bgStartColor;

private int bgMidColor;

private int bgEndColor;

private int progress;

private float progressWidth;

private int startAngle;

private int sweepAngle;

private boolean showAnim;

private int mMeasureHeight;

private int mMeasureWidth;

private Paint bgPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);

private Paint progressPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);

private RectF pRectF;

private float unitAngle;

private int curProgress = 0;

public ProgressRing(Context context, AttributeSet attrs) {

super(context, attrs);

TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.ProgressRing);

progressStartColor = ta.getColor(R.styleable.ProgressRing_pr_progress_start_color, Color.YELLOW);

progressEndColor = ta.getColor(R.styleable.ProgressRing_pr_progress_end_color, progressStartColor);

bgStartColor = ta.getColor(R.styleable.ProgressRing_pr_bg_start_color, Color.LTGRAY);

bgMidColor = ta.getColor(R.styleable.ProgressRing_pr_bg_mid_color, bgStartColor);

bgEndColor = ta.getColor(R.styleable.ProgressRing_pr_bg_end_color, bgStartColor);

progress = ta.getInt(R.styleable.ProgressRing_pr_progress, 0);

progressWidth = ta.getDimension(R.styleable.ProgressRing_pr_progress_width, 8f);

startAngle = ta.getInt(R.styleable.ProgressRing_pr_start_angle, 150);

sweepAngle = ta.getInt(R.styleable.ProgressRing_pr_sweep_angle, 240);

showAnim = ta.getBoolean(R.styleable.ProgressRing_pr_show_anim, true);

ta.recycle();

unitAngle = (float) (sweepAngle / 100.0);

bgPaint.setStyle(Paint.Style.STROKE);

bgPaint.setStrokeCap(Paint.Cap.ROUND);

bgPaint.setStrokeWidth(progressWidth);

progressPaint.setStyle(Paint.Style.STROKE);

progressPaint.setStrokeCap(Paint.Cap.ROUND);

progressPaint.setStrokeWidth(progressWidth);

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

/*for (int i = 0, end = (int) (progress * unitAngle); i <= end; i++) {

progressPaint.setColor(getGradient(i / (float) end, progressStartColor, progressEndColor));

canvas.drawArc(pRectF,

startAngle + i,

1,

false,

progressPaint);

}*/

if (!showAnim) {

curProgress = progress;

}

drawBg(canvas);

drawProgress(canvas);

if (curProgress < progress) {

curProgress++;

postInvalidate();

}

}

// 只需要畫(huà)進(jìn)度之外的背景即可

private void drawBg(Canvas canvas) {

float halfSweep = sweepAngle / 2;

for (int i = sweepAngle, st = (int) (curProgress * unitAngle); i > st; --i) {

if (i - halfSweep > 0) {

bgPaint.setColor(getGradient((i - halfSweep) / halfSweep, bgMidColor, bgEndColor));

} else {

bgPaint.setColor(getGradient((halfSweep - i) / halfSweep, bgMidColor, bgStartColor));

}

canvas.drawArc(pRectF,

startAngle + i,

1,

false,

bgPaint);

}

}

private void drawProgress(Canvas canvas) {

for (int i = 0, end = (int) (curProgress * unitAngle); i <= end; i++) {

progressPaint.setColor(getGradient(i / (float) end, progressStartColor, progressEndColor));

canvas.drawArc(pRectF,

startAngle + i,

1,

false,

progressPaint);

}

}

public void setProgress(@IntRange(from = 0, to = 100) int progress) {

this.progress = progress;

invalidate();

}

public int getProgress() {

return progress;

}

public int getGradient(float fraction, int startColor, int endColor) {

if (fraction > 1) fraction = 1;

int alphaStart = Color.alpha(startColor);

int redStart = Color.red(startColor);

int blueStart = Color.blue(startColor);

int greenStart = Color.green(startColor);

int alphaEnd = Color.alpha(endColor);

int redEnd = Color.red(endColor);

int blueEnd = Color.blue(endColor);

int greenEnd = Color.green(endColor);

int alphaDifference = alphaEnd - alphaStart;

int redDifference = redEnd - redStart;

int blueDifference = blueEnd - blueStart;

int greenDifference = greenEnd - greenStart;

int alphaCurrent = (int) (alphaStart + fraction * alphaDifference);

int redCurrent = (int) (redStart + fraction * redDifference);

int blueCurrent = (int) (blueStart + fraction * blueDifference);

int greenCurrent = (int) (greenStart + fraction * greenDifference);

return Color.argb(alphaCurrent, redCurrent, greenCurrent, blueCurrent);

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

mMeasureWidth = getMeasuredWidth();

mMeasureHeight = getMeasuredHeight();

if (pRectF == null) {

float halfProgressWidth = progressWidth / 2;

pRectF = new RectF(halfProgressWidth + getPaddingLeft(),

halfProgressWidth + getPaddingTop(),

mMeasureWidth - halfProgressWidth - getPaddingRight(),

mMeasureHeight - halfProgressWidth - getPaddingBottom());

}

}

}

xml布局

android:layout_width="320dp"

android:layout_height="320dp"

android:layout_gravity="center_horizontal"

app:pr_bg_end_color="#00ffffff"

app:pr_bg_mid_color="#CCCCCC"

app:pr_bg_start_color="#00ffffff"

app:pr_progress="70"

app:pr_progress_end_color="#F78930"

app:pr_progress_start_color="#00ffffff"

app:pr_progress_width="40dp" />

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持編程圈。

總結(jié)

以上是生活随笔為你收集整理的android view 渐变动画,Android自定义view渐变圆形动画的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。