第一次在简书上写东西,还不太熟悉,希望能一直坚持写。
刚刚模仿了一个启动页倒数读秒按钮。效果如下:
CircleProgressView.class
package com.test.circleprogressviewtest;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
/**
* 启动页-倒数读秒跳转按钮
*/
public class CircleProgressView extends View {
private Paint pProgress;
private Paint pText;
private Paint pBorder;
private Paint pCircle;
private int progressColor;
private int borderColor;
private int circleColor;
private float circleRadius;
private float borderWidth;
private float circleAndBorderRadius;
private String text = "";
private float textSize = 20.0F;
private int textColor;
private int halfWidth;
private int halfHeight;
private float topOffset = 60.0F;
private int borderAlpha = 100;
private int currentAlpha = 100;
private ITimeout iTimeout;
public CircleProgressView(Context paramContext, AttributeSet paramAttributeSet) {
super(paramContext, paramAttributeSet);
TypedArray typedArray = paramContext.getTheme().obtainStyledAttributes(paramAttributeSet, R.styleable.CircleProgressView, 0, 0);
circleRadius = typedArray.getDimension(R.styleable.CircleProgressView_circleRadius, 80.0F);
circleColor = typedArray.getColor(R.styleable.CircleProgressView_circleColor, 0);
borderColor = typedArray.getColor(R.styleable.CircleProgressView_circleBorderColor, -1);
progressColor = typedArray.getColor(R.styleable.CircleProgressView_circleProgressColor, -1);
borderWidth = typedArray.getDimension(R.styleable.CircleProgressView_circleBorderWidth, 10.0F);
borderAlpha = typedArray.getInteger(R.styleable.CircleProgressView_circleBorderAlpha, 100);
text = typedArray.getString(R.styleable.CircleProgressView_circleText);
textSize = typedArray.getDimension(R.styleable.CircleProgressView_circleTextSize, 0.0F);
textColor = typedArray.getColor(R.styleable.CircleProgressView_circleTextColor, -1);
circleAndBorderRadius = (circleRadius + borderWidth / 2.0F);
pProgress = new Paint();
pProgress.setAntiAlias(true);
pProgress.setColor(progressColor);
pProgress.setStyle(Paint.Style.FILL);
pBorder = new Paint();
pBorder.setAntiAlias(true);
pBorder.setColor(borderColor);
pBorder.setStyle(Paint.Style.STROKE);
pBorder.setStrokeWidth(borderWidth);
pCircle = new Paint();
pCircle.setAntiAlias(true);
pCircle.setColor(circleColor);
pCircle.setStyle(Paint.Style.STROKE);
pCircle.setStrokeWidth(borderWidth);
pText = new Paint();
pText.setAntiAlias(true);
pText.setStyle(Paint.Style.FILL);
pText.setColor(textColor);
pText.setTextSize(textSize);
}
public int getCurrentAlpha() {
return currentAlpha;
}
public void invalidate(int alpha) {
currentAlpha = alpha;
postInvalidate();
}
public void startProgress(long totalTime, ITimeout iTimeout) {
this.iTimeout = iTimeout;
new Thread(new CountDownRunnable(this, totalTime)).start();
}
protected void onDraw(Canvas paramCanvas) {
halfWidth = (getWidth() / 2);
halfHeight = (getHeight() / 2);
paramCanvas.drawCircle(halfWidth, halfHeight, circleRadius, pProgress);
if (currentAlpha >= 0) {
RectF localRectF = new RectF();
localRectF.left = (halfWidth - circleAndBorderRadius);
localRectF.top = (halfHeight - circleAndBorderRadius);
localRectF.right = (circleAndBorderRadius * 2.0F + (halfWidth - circleAndBorderRadius));
localRectF.bottom = (circleAndBorderRadius * 2.0F + (halfHeight - circleAndBorderRadius));
paramCanvas.drawArc(localRectF, -90.0F, -360.0F, false, pCircle);
paramCanvas.drawArc(localRectF, -90.0F, 360.0F * (100 - currentAlpha) / borderAlpha, false, pBorder);
float textWidth = pText.measureText(text, 0, text.length());
paramCanvas.drawText(text, halfWidth - textWidth / 2.0F, halfHeight + topOffset / 4.0F, pText);
if (currentAlpha == 0 && iTimeout != null) {
iTimeout.timeout();
}
}
}
public interface ITimeout {
void timeout();
}
}
CountDownRunnable.class
package com.test.circleprogressviewtest;
final class CountDownRunnable implements Runnable {
private CircleProgressView circleProgressView;
private long totalTime = 2000L;
public CountDownRunnable(CircleProgressView circleProgressView, long paramLong) {
this.circleProgressView = circleProgressView;
this.totalTime = paramLong;
}
public final void run() {
long sleepTime = this.totalTime / circleProgressView.getCurrentAlpha();
circleProgressView.invalidate(100);
while (circleProgressView.getCurrentAlpha() > 0) {
circleProgressView.invalidate(circleProgressView.getCurrentAlpha() - 1);
try {
Thread.sleep(1L * sleepTime);
} catch (Exception localException) {
localException.printStackTrace();
}
}
}
}
attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="CircleProgressView">
<attr name="circleRadius" format="dimension" />
<attr name="circleColor" format="color" />
<attr name="circleText" format="string" />
<attr name="circleTextSize" format="dimension" />
<attr name="circleTextColor" format="color" />
<attr name="circleBorderWidth" format="dimension" />
<attr name="circleBorderColor" format="color" />
<attr name="circleBorderAlpha" format="integer" />
<attr name="circleProgressColor" format="color" />
</declare-styleable>
</resources>
activity_splash.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:progress="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.test.circleprogressviewtest.SplashActivity">
<com.test.circleprogressviewtest.CircleProgressView
android:id="@+id/jump_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="28dp"
android:layout_marginRight="28dp"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
progress:circleRadius="20.0dp"
progress:circleColor="#66000000"
progress:circleText="跳转"
progress:circleTextSize="14sp"
progress:circleTextColor="#e6ffffff"
progress:circleBorderWidth="2dp"
progress:circleBorderColor="#ffe2e2e2"
progress:circleBorderAlpha="100"
progress:circleProgressColor="#fff39c11" />
</android.support.constraint.ConstraintLayout>
SplashActivity.class
package com.test.circleprogressviewtest;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class SplashActivity extends AppCompatActivity implements
View.OnClickListener, CircleProgressView.ITimeout {
CircleProgressView circleProgressView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
circleProgressView = (CircleProgressView) findViewById(R.id.jump_btn);
circleProgressView.startProgress(2000, this);
circleProgressView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
Toast.makeText(SplashActivity.this, "点击了跳转", Toast.LENGTH_SHORT).show();
}
@Override
public void timeout() {
Toast.makeText(SplashActivity.this, "跳转", Toast.LENGTH_SHORT).show();
}
}