Android 自定义 View 实现带有光影效果的转圈圈加载动画
"import android.content.Context;\nimport android.graphics.Canvas;\nimport android.graphics.Color;\nimport android.graphics.Paint;\nimport android.graphics.RadialGradient;\nimport android.graphics.Shader;\nimport android.util.AttributeSet;\nimport android.view.View;\n\npublic class LoadingView extends View {\n private static final int DEFAULT_SIZE = 200; // 默认的View尺寸\n private static final int CIRCLE_COUNT = 8; // 圆圈数量\n private static final int CIRCLE_RADIUS = 20; // 圆圈半径\n\n private int mSize; // View尺寸\n private Paint mPaint; // 画笔\n private int[] mColors; // 渐变色数组\n private float mRotateDegree; // 旋转角度\n\n public LoadingView(Context context) {\n this(context, null);\n }\n\n public LoadingView(Context context, AttributeSet attrs) {\n this(context, attrs, 0);\n }\n\n public LoadingView(Context context, AttributeSet attrs, int defStyle) {\n super(context, attrs, defStyle);\n init();\n }\n\n private void init() {\n mPaint = new Paint();\n mPaint.setStyle(Paint.Style.FILL);\n mColors = new int[]{Color.parseColor("#FF9C27B0"), Color.parseColor("#FF00BCD4"), Color.parseColor("#FF009688"), Color.parseColor("#FFCDDC39")};\n }\n\n @Override\n protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {\n int width = measureSize(widthMeasureSpec);\n int height = measureSize(heightMeasureSpec);\n mSize = Math.min(width, height);\n setMeasuredDimension(mSize, mSize);\n }\n\n private int measureSize(int measureSpec) {\n int result;\n int mode = MeasureSpec.getMode(measureSpec);\n int size = MeasureSpec.getSize(measureSpec);\n if (mode == MeasureSpec.EXACTLY) {\n result = size;\n } else {\n result = DEFAULT_SIZE;\n if (mode == MeasureSpec.AT_MOST) {\n result = Math.min(result, size);\n }\n }\n return result;\n }\n\n @Override\n protected void onDraw(Canvas canvas) {\n float centerX = mSize / 2; // 中心点X坐标\n float centerY = mSize / 2; // 中心点Y坐标\n float radius = mSize / 2 - CIRCLE_RADIUS; // 圆圈的半径\n\n canvas.rotate(mRotateDegree, centerX, centerY); // 旋转画布\n\n for (int i = 0; i < CIRCLE_COUNT; i++) {\n float angle = i * 360 / CIRCLE_COUNT; // 圆圈所在角度\n float x = (float) (centerX + radius * Math.cos(Math.toRadians(angle)));\n float y = (float) (centerY + radius * Math.sin(Math.toRadians(angle)));\n\n mPaint.setColor(mColors[i % mColors.length]); // 设置画笔颜色\n\n // 创建径向渐变\n RadialGradient gradient = new RadialGradient(x, y, CIRCLE_RADIUS, Color.WHITE, mColors[i % mColors.length], Shader.TileMode.CLAMP);\n mPaint.setShader(gradient);\n\n canvas.drawCircle(x, y, CIRCLE_RADIUS, mPaint); // 画圆圈\n }\n }\n\n @Override\n protected void onAttachedToWindow() {\n super.onAttachedToWindow();\n startAnimation();\n }\n\n @Override\n protected void onDetachedFromWindow() {\n super.onDetachedFromWindow();\n stopAnimation();\n }\n\n private void startAnimation() {\n // 使用属性动画实现旋转动画\n ObjectAnimator animator = ObjectAnimator.ofFloat(this, "rotateDegree", 0, 360);\n animator.setInterpolator(new LinearInterpolator());\n animator.setDuration(2000);\n animator.setRepeatCount(ValueAnimator.INFINITE);\n animator.start();\n }\n\n private void stopAnimation() {\n // 停止旋转动画\n setRotateDegree(0);\n }\n\n public void setRotateDegree(float rotateDegree) {\n mRotateDegree = rotateDegree;\n invalidate();\n }\n}\n\n```\n"<com.example.LoadingView\n android:layout_width="wrap_content"\n android:layout_height="wrap_content"\n android:layout_gravity="center"\n />\n\
原文地址: https://www.cveoy.top/t/topic/qFHm 著作权归作者所有。请勿转载和采集!