目錄
- 效果展示
- 實作方法
- 一、思路
- 二、代碼實作
- 三、完整代碼及使用示例
- Demo示例
- 結語
效果展示

實作方法
一、思路
通過自定義View畫出一個長按出現環形包圍進度條的按鈕,當進度條滿了進行介面回呼,告訴當前運行的Activity,影片執行完畢,
1.畫出中心圓形按鈕
- 確定自定義View的大小尺寸,
- 畫出中心圓按鈕,
2.監聽點擊事件,當手指點擊按鈕時,放大中心圓形按鈕,環形進度條出現,環形進度條自動增加
- 確定獲取焦點時按鈕的大小,重新繪制,
- 畫出外圓環,使用定時器,定時增加圓環的弧度,
- 失去焦點時,中心按鈕恢復,外圓環弧度逐漸減少,
二、代碼實作
自定義View核心代碼:
1.構造方法、介面、初始化
/**
* 初始化自定義屬性
* @param context
* @param attrs
*/
private void initAttrs(Context context, @Nullable AttributeSet attrs){
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.LongClickProgressView);
BitmapDrawable mCenterImageDrawable = (BitmapDrawable) array.getDrawable(R.styleable.LongClickProgressView_centerDrawable);//自定義屬性,可在XML內設定drawable中心圖片
if (mCenterImageDrawable != null){
//XML布局設定的圖片資源作為中心圖片
mDrawBitmap = mCenterImageDrawable.getBitmap();
}
}
/**
* 初始化
*/
private void init() {
//默認顏色
mRingColor = Color.parseColor("#FF3C4A");
mCenterColor = Color.parseColor("#FF3C4A");
//設定中間圓圈大小默認為60dp*60dp
// mCenterCircleWidth = dp2px(mContext, 60);
// mCenterCircleHeight = dp2px(mContext, 60);
//初始化圓環畫筆
mProgressRingPaint = new Paint();
mProgressRingPaint.setAntiAlias(true); //啟用抗鋸齒
mProgressRingPaint.setColor(mRingColor);
mProgressRingPaint.setStyle(Paint.Style.STROKE);//圓弧
mProgressRingPaint.setStrokeCap(Paint.Cap.ROUND);
mProgressRingPaint.setFilterBitmap(true); //對位圖進行濾波處理
//初始化按鈕畫筆
mBtnPaint = new Paint();
mBtnPaint.setAntiAlias(true); //啟用抗鋸齒
mBtnPaint.setFilterBitmap(true); //對位圖進行濾波處理
mRectangleRectF = new RectF();//View的范圍矩形
mBitmapRectF = new RectF();//中心圖片縮放后的范圍矩形
mProgressRectF = new RectF();//進度條顯示范圍矩形
// mDrawBitmap = BitmapFactory.decodeResource(mContext.getResources(),mCenterImage);//中心圖片,如果以圖片為中心按鈕,則設定物件,否則以畫筆畫圓
mHandler = new Handler();
//環形進度條自動增加邏輯
mRunnable = new Runnable() {
@Override
public void run() {
mProgress += 1;
//更新進度的介面回呼
if (mOnLongClickStateListener != null){
mOnLongClickStateListener.onProgress(mProgress);
}
if (mProgress < mTargetProgress){
mHandler.postDelayed(this, 1);
}else {
//當環形進度條達到100,取消回圈,進度置零,呼叫介面的完成回呼
mProgress = 0;
if (mOnLongClickStateListener != null){
mOnLongClickStateListener.onFinish();
}
}
setProgress(mProgress);
}
};
//取消動作的邏輯
mCancelRunnable = new Runnable() {
@Override
public void run() {
//更新進度的介面回呼
if (mOnLongClickStateListener != null){
mOnLongClickStateListener.onProgress(mProgress);
}
//當進度為0時,取消回圈
if (mProgress == 0){
return;
}else if (mProgress < 10){
//當進度降低到較低狀態時,級訓降低的速度,每次減2
mProgress -= 2;
}else {
//進度較高時,進度條減少的速度加快,每次減7
mProgress -= 7;
}
if (mProgress > 0){
mHandler.postDelayed(this, FINISH_TIME / 100);
}else {
//當環形進度條達到0,再次手動置零,呼叫介面的取消回呼,并回傳進度回呼引數
mProgress = 0;
if (mOnLongClickStateListener != null){
mOnLongClickStateListener.onCancel();
}
}
setProgress(mProgress);
}
};
}
/**
* 長按完成和取消的介面
*/
public interface OnLongClickStateListener {
void onFinish();
void onProgress(float progress);
void onCancel();
}
2.其他屬性的設定方法
/**
* 設定中心圖片
* @param centerImageId 圖片id(R.mipmap.xxxx or R.drawable.xxxx)
*/
public void setCenterImage(int centerImageId) {
this.mCenterImage = centerImageId;
mDrawBitmap = BitmapFactory.decodeResource(mContext.getResources(),mCenterImage);
invalidate();
}
/**
* 設定中心顏色
* @param centerColorId
*/
public void setCenterColor(int centerColorId) {
this.mCenterColor = centerColorId;
invalidate();
}
/**
* 控制圓環進度
* @param progress 進度(0-100f)
*/
public void setProgress(float progress) {
this.mProgress = progress;
invalidate();
}
/**
* 設定圓環開始角度
* @param startAngle 開始角度
*/
public void setStartAngle(float startAngle) {
this.mStartAngle = startAngle;
invalidate();
}
/**
* 設定圓環顏色
* @param ringColor 圓環顏色
*/
public void setRingColor(int ringColor) {
this.mRingColor = ringColor;
mProgressRingPaint.setColor(mRingColor); //設定畫筆顏色
invalidate();
}
/**
* 設定圓環寬度
* @param ringWidth 圓環寬度(單位:dp)
*/
public void setRingWidth(float ringWidth) {
this.mRingWidth = dp2px(mContext, ringWidth);
invalidate();
}
3.重寫onDraw方法和onSizeChange方法
每次呼叫invalidate()方法都會進行一次onDraw,
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//算出矩形頂點坐標
mRectangleRectF.set(0, 0, mViewWidth, mViewHeight);
//中心原點固定為60dp*60dp,size為中心圖片與View邊距的距離
float side = (mViewWidth - mCenterCircleWidth) / 2;
mProgressRingPaint.setStrokeWidth(mRingWidth);//圓環寬度
if (mProgress == 0){
mBitmapRectF.set(side, side, mViewWidth - side, mViewHeight - side);
}else {
//增加mViewWidth / 20作為縮放
float scaleSize = (float) ((mViewWidth + mViewHeight) / 2 * 0.05);
mBitmapRectF.set(side - scaleSize,side - scaleSize,
mViewWidth - side + scaleSize, mViewWidth - side + scaleSize);
//圓環進度條的頂點坐標,范圍比圓圈超出:圓圈坐標 + mViewWidth/40
mProgressRectF.set(side - scaleSize - mRingWidth - mViewWidth/40,side - scaleSize - mRingWidth - mViewHeight/40,
mViewWidth - (side - scaleSize) + mRingWidth + mViewWidth/40, mViewHeight - (side - scaleSize) + mRingWidth + mViewHeight/40);
}
//畫中心圖片
if (mDrawBitmap != null){
//設定了中心圖片,畫出bitmap
canvas.drawBitmap(mDrawBitmap, null, mBitmapRectF, mBtnPaint);
}else {
//沒有設定中心圖片,手影片圓
mBtnPaint.setStyle(Paint.Style.FILL);//實心圓型
mBtnPaint.setStrokeCap(Paint.Cap.ROUND);
mBtnPaint.setColor(mCenterColor); //設定顏色
canvas.drawArc(mBitmapRectF, 0, 360, true, mBtnPaint); //畫出360度實心圓
}
//計算進度所占圓環百分比(0-1.0f)
float progressPercent = mProgress / 100;
//計算進度所占旋轉角度
float roateAngle = progressPercent * 360;
//計算圓環直徑
float ringDiameter = mViewWidth - mRingWidth * 2;
//計算圓環圓心x
float x0 = mViewWidth / 2.0f;
//計算圓環圓心y
float y0 = mViewHeight / 2.0f;
//計算圓環半徑
float r = ringDiameter / 2;
if (mProgress > 0 && mProgress <= 1) {
//當進度大于0并且小于等于1時
//計算開始角度startAngle在圓環上的點
PointF pointF1 = calculatePointOfTheCircle(x0, y0, r, mStartAngle);
//畫圓點
canvas.drawCircle(pointF1.x, pointF1.y, mRingWidth / 4, mProgressRingPaint);
} else {
//當進度大于1時
//畫圓環
canvas.drawArc(mProgressRectF, mStartAngle, roateAngle, false, mProgressRingPaint);
}
}
//onSizeChange方法內獲取View的寬高,onSizeChange方法內獲取的是最終決定的引數,不要在onMesure里獲取,因為一個View的繪制有可能會多次測量,執行多次onMesure
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
mViewWidth = w;
mViewHeight = h;
//設定中間圓圈大小為View的6/8
mCenterCircleWidth = mViewWidth * 6 / 8;
mCenterCircleHeight = mViewHeight * 6 / 8;
//根據寬高設定默認初始圓環寬度
if(mRingWidth == 0){
mRingWidth = (mViewWidth + mViewHeight) / 2 / 30; //默認15分之一View的高
}
super.onSizeChanged(w, h, oldw, oldh);
}
4.輔助方法
calculatePointOfTheCircle()方法可以在圓環進度條盡頭加上圓點,使得進度條看起來帶圓角會美觀點,可以去掉該方法,
dp2px()和px2dp(),分別是將dp資料轉化為對應的像素px、將像素px轉化為對應的dp值,
/**
* 根據圓心、半徑、角度計算在圓上的點
* @param x0 圓心x
* @param y0 圓心y
* @param r 半徑
* @param angle 角度(弧度)
* @return 圓上的點
*/
private PointF calculatePointOfTheCircle(float x0, float y0, float r, float angle) {
float radian = angle * 3.1415926f / 180;
float x = (float) (x0 + Math.cos(radian) * r);
float y = (float) (y0 + Math.sin(radian) * r);
return new PointF(x, y);
}
/**
* dp轉px(保持精度)
* @param context
* @param dp
* @return
*/
public float dp2px(Context context, float dp) {
float scale = context.getResources().getDisplayMetrics().density;
return dp * scale + 0.5f;
}
/**
* sp轉px (保持精度)
* @param context
* @param sp
* @return
*/
public float sp2px(Context context, float sp) {
float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return sp * fontScale + 0.5f;
}
三、完整代碼及使用示例
1.自定義View完整代碼
public class LongClickProgressView extends View {
private Context mContext;//背景關系
private float mViewWidth;//當前View的寬度
private float mViewHeight;//當前View的高度
private float mCenterCircleWidth;//中間圓圈的寬(直徑)
private float mCenterCircleHeight;//中間圓圈的高(直徑,等于寬)
private Paint mProgressRingPaint; // 專門用于外沿圓環的畫筆
private Paint mBtnPaint; // 專門用于圓型按鈕的畫筆
private float mRingWidth = 0;//圓環寬度
private float mProgress = 0;//進度
private int mTargetProgress = 100; //最大進度
private float mStartAngle = 180;//圓環進度開始角度(3點方向開始,往順時針加)
private int mRingColor;//圓環顏色
private int mCenterColor;//中間圓型按鈕顏色
private int mCenterImage;//圓環中間圖片
private RectF mRectangleRectF;//View的顯示范圍矩形
private RectF mBitmapRectF;//中心圖片縮放后的顯示范圍矩形
private RectF mProgressRectF;//進度圓環顯示范圍矩形
private Bitmap mDrawBitmap;//用于畫出中心圖片的bitmap物件
private Handler mHandler; //計時用的handler
private Runnable mRunnable; //長按動作的執行
private Runnable mCancelRunnable; //取消動作的執行
private static final int FINISH_TIME = 1000;
private OnLongClickStateListener mOnLongClickStateListener;
//設定回呼
public void setOnLongClickStateListener(OnLongClickStateListener onLongClickStateListener) {
this.mOnLongClickStateListener = onLongClickStateListener;
}
public LongClickProgressView(Context context) {
this(context,null);
}
public LongClickProgressView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs,0);
}
public LongClickProgressView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mContext = context;
//初始化自定義屬性
initAttrs(context, attrs);
//初始化
init();
}
/**
* 設定中心圖片
* @param centerImageId 圖片id(R.mipmap.xxxx or R.drawable.xxxx)
*/
public void setCenterImage(int centerImageId) {
this.mCenterImage = centerImageId;
mDrawBitmap = BitmapFactory.decodeResource(mContext.getResources(),mCenterImage);
invalidate();
}
/**
* 設定中心顏色
* @param
*/
public void setCenterColor(int centerColorId) {
this.mCenterColor = centerColorId;
invalidate();
}
/**
* 控制圓環進度
* @param progress 進度(0-100f)
*/
public void setProgress(float progress) {
this.mProgress = progress;
invalidate();
}
/**
* 設定圓環開始角度
* @param startAngle 開始角度
*/
public void setStartAngle(float startAngle) {
this.mStartAngle = startAngle;
invalidate();
}
/**
* 設定圓環顏色
* @param ringColor 圓環顏色
*/
public void setRingColor(int ringColor) {
this.mRingColor = ringColor;
mProgressRingPaint.setColor(mRingColor); //設定畫筆顏色
invalidate();
}
/**
* 設定圓環寬度
* @param ringWidth 圓環寬度(單位:dp)
*/
public void setRingWidth(float ringWidth) {
this.mRingWidth = dp2px(mContext, ringWidth);
invalidate();
}
/**
* 初始化自定義屬性
* @param context
* @param attrs
*/
private void initAttrs(Context context, @Nullable AttributeSet attrs){
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.LongClickProgressView);
BitmapDrawable mCenterImageDrawable = (BitmapDrawable) array.getDrawable(R.styleable.LongClickProgressView_centerDrawable);//自定義屬性,可在XML內設定drawable中心圖片
if (mCenterImageDrawable != null){
//XML布局設定的圖片資源作為中心圖片
mDrawBitmap = mCenterImageDrawable.getBitmap();
}
}
/**
* 初始化
*/
private void init() {
//默認顏色
mRingColor = Color.parseColor("#FF3C4A");
mCenterColor = Color.parseColor("#FF3C4A");
//設定中間圓圈大小默認為60dp*60dp
// mCenterCircleWidth = dp2px(mContext, 60);
// mCenterCircleHeight = dp2px(mContext, 60);
//初始化圓環畫筆
mProgressRingPaint = new Paint();
mProgressRingPaint.setAntiAlias(true); //啟用抗鋸齒
mProgressRingPaint.setColor(mRingColor);
mProgressRingPaint.setStyle(Paint.Style.STROKE);//圓弧
mProgressRingPaint.setStrokeCap(Paint.Cap.ROUND);
mProgressRingPaint.setFilterBitmap(true); //對位圖進行濾波處理
//初始化按鈕畫筆
mBtnPaint = new Paint();
mBtnPaint.setAntiAlias(true); //啟用抗鋸齒
mBtnPaint.setFilterBitmap(true); //對位圖進行濾波處理
mRectangleRectF = new RectF();//View的范圍矩形
mBitmapRectF = new RectF();//中心圖片縮放后的范圍矩形
mProgressRectF = new RectF();//進度條顯示范圍矩形
// mDrawBitmap = BitmapFactory.decodeResource(mContext.getResources(),mCenterImage);//中心圖片,如果以圖片為中心按鈕,則設定物件,否則以畫筆畫圓
mHandler = new Handler();
//環形進度條自動增加邏輯
mRunnable = new Runnable() {
@Override
public void run() {
mProgress += 1;
setProgress(mProgress);
//更新進度的介面回呼
if (mOnLongClickStateListener != null){
mOnLongClickStateListener.onProgress(mProgress);
}
if (mProgress < mTargetProgress){
mHandler.postDelayed(this, 1);
}else {
//當環形進度條達到100,取消回圈,進度置零,呼叫介面的完成回呼
mProgress = 0;
if (mOnLongClickStateListener != null){
mOnLongClickStateListener.onFinish();
}
}
}
};
//取消動作的邏輯
mCancelRunnable = new Runnable() {
@Override
public void run() {
setProgress(mProgress);
//當進度為0時,取消回圈
if (mProgress <= 0){
return;
}else if (mProgress < 10){
//當進度降低到較低狀態時,級訓降低的速度,每次減2
mProgress -= 2;
}else {
//進度較高時,進度條減少的速度加快,每次減7
mProgress -= 7;
}
if (mProgress > 0){
mHandler.postDelayed(this, FINISH_TIME / 100);
}else {
//當環形進度條達到0,再次手動置零,呼叫介面的取消回呼,并回傳進度回呼引數
mProgress = 0;
if (mOnLongClickStateListener != null){
mOnLongClickStateListener.onCancel();
}
}
//更新進度的介面回呼
if (mOnLongClickStateListener != null){
mOnLongClickStateListener.onProgress(mProgress);
}
}
};
}
@Override
public boolean onTouchEvent(MotionEvent motionEvent) {
// Log.e("TAG", "onTouchEvent: " + mProgress );
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN:
mHandler.post(mRunnable);
mHandler.removeCallbacks(mCancelRunnable);
// Log.e("TAG", "onTouchEvent: ACTION_DOWN");
return true;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
mHandler.removeCallbacks(mRunnable);
mHandler.post(mCancelRunnable);
// Log.e("TAG", "onTouchEvent: ACTION_UP");
break;
case MotionEvent.ACTION_MOVE:
// float x = motionEvent.getX();
// float y = motionEvent.getY();
// if (this.getLeft() > x || this.getTop() > y || this.getRight() < x || this.getBottom() < y){
// mHandler.removeCallbacks(mRunnable);
// setProgress(0);
// }
// Log.e("TAG", "onTouchEvent: ACTION_MOVE");
break;
}
return false;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//算出矩形頂點坐標
mRectangleRectF.set(0, 0, mViewWidth, mViewHeight);
//中心原點固定為60dp*60dp,size為中心圖片與View邊距的距離
float side = (mViewWidth - mCenterCircleWidth) / 2;
mProgressRingPaint.setStrokeWidth(mRingWidth);//圓環寬度
if (mProgress == 0){
mBitmapRectF.set(side, side, mViewWidth - side, mViewHeight - side);
}else {
//增加mViewWidth / 20作為縮放
float scaleSize = (float) ((mViewWidth + mViewHeight) / 2 * 0.05);
mBitmapRectF.set(side - scaleSize,side - scaleSize,
mViewWidth - side + scaleSize, mViewWidth - side + scaleSize);
//圓環進度條的頂點坐標,范圍比圓圈超出:圓圈坐標 + mViewWidth/40
mProgressRectF.set(side - scaleSize - mRingWidth - mViewWidth/40,side - scaleSize - mRingWidth - mViewHeight/40,
mViewWidth - (side - scaleSize) + mRingWidth + mViewWidth/40, mViewHeight - (side - scaleSize) + mRingWidth + mViewHeight/40);
}
//畫中心圖片
if (mDrawBitmap != null){
//設定了中心圖片,畫出bitmap
canvas.drawBitmap(mDrawBitmap, null, mBitmapRectF, mBtnPaint);
}else {
//沒有設定中心圖片,手影片圓
mBtnPaint.setStyle(Paint.Style.FILL);//實心圓型
mBtnPaint.setStrokeCap(Paint.Cap.ROUND);
mBtnPaint.setColor(mCenterColor); //設定顏色
canvas.drawArc(mBitmapRectF, 0, 360, true, mBtnPaint); //畫出360度實心圓
}
//計算進度所占圓環百分比(0-1.0f)
float progressPercent = mProgress / 100;
//計算進度所占旋轉角度
float roateAngle = progressPercent * 360;
//計算圓環直徑
float ringDiameter = mViewWidth - mRingWidth * 2;
//計算圓環圓心x
float x0 = mViewWidth / 2.0f;
//計算圓環圓心y
float y0 = mViewHeight / 2.0f;
//計算圓環半徑
float r = ringDiameter / 2;
if (mProgress > 0 && mProgress <= 1) {
//當進度大于0并且小于等于1時
//計算開始角度startAngle在圓環上的點
PointF pointF1 = calculatePointOfTheCircle(x0, y0, r, mStartAngle);
//畫圓點
canvas.drawCircle(pointF1.x, pointF1.y, mRingWidth / 4, mProgressRingPaint);
} else {
//當進度大于1時
//畫圓環
canvas.drawArc(mProgressRectF, mStartAngle, roateAngle, false, mProgressRingPaint);
}
}
/**
* 根據圓心、半徑、角度計算在圓上的點
* @param x0 圓心x
* @param y0 圓心y
* @param r 半徑
* @param angle 角度(弧度)
* @return 圓上的點
*/
private PointF calculatePointOfTheCircle(float x0, float y0, float r, float angle) {
float radian = angle * 3.1415926f / 180;
float x = (float) (x0 + Math.cos(radian) * r);
float y = (float) (y0 + Math.sin(radian) * r);
return new PointF(x, y);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
mViewWidth = w;
mViewHeight = h;
//設定中間圓圈大小為View的6/8
mCenterCircleWidth = mViewWidth * 6 / 8;
mCenterCircleHeight = mViewHeight * 6 / 8;
//根據寬高設定默認初始圓環寬度
if(mRingWidth == 0){
mRingWidth = (mViewWidth + mViewHeight) / 2 / 30; //默認15分之一View的高
}
super.onSizeChanged(w, h, oldw, oldh);
}
/**
* dp轉px(保持精度)
* @param context
* @param dp
* @return
*/
public float dp2px(Context context, float dp) {
float scale = context.getResources().getDisplayMetrics().density;
return dp * scale + 0.5f;
}
/**
* sp轉px (保持精度)
* @param context
* @param sp
* @return
*/
public float sp2px(Context context, float sp) {
float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return sp * fontScale + 0.5f;
}
/**
* 長按完成和取消的介面
*/
public interface OnLongClickStateListener {
void onFinish();
void onProgress(float progress);
void onCancel();
}
}
2.在xml進行參考
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="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=".MainActivity">
<!-- 暫時當前進度的TextView -->
<TextView
android:id="@+id/tv_progress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="sans-serif-medium"
android:gravity="center"
android:text="0%"
android:textColor="#000000"
android:textSize="39dp"
android:layout_marginTop="60dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<!-- 可以設定app:centerDrawable="" 替換中心圖片 -->
<com.map.viewdemo.views.LongClickProgressView
android:id="@+id/btn_long_click_finish"
android:layout_width="80dp"
android:layout_height="80dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
<TextView
android:id="@+id/tv_pause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="@id/btn_long_click_finish"
app:layout_constraintEnd_toEndOf="@id/btn_long_click_finish"
app:layout_constraintTop_toTopOf="@id/btn_long_click_finish"
app:layout_constraintBottom_toBottomOf="@id/btn_long_click_finish"
android:fontFamily="sans-serif-medium"
android:gravity="center"
android:text="Finish"
android:textAllCaps="true"
android:textSize="12sp"
android:textColor="#ffffff" />
</androidx.constraintlayout.widget.ConstraintLayout>
3.在Activity中對自定義View進行修改
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = findViewById(R.id.tv_progress);
LongClickProgressView longClickProgressView = findViewById(R.id.btn_long_click_finish);
longClickProgressView.setRingColor(Color.parseColor("#000000")); //設定外進度條顏色
longClickProgressView.setCenterColor(Color.parseColor("#000000")); //設定內圓型按鈕顏色
//設定進度監聽回呼
longClickProgressView.setOnLongClickStateListener(new LongClickProgressView.OnLongClickStateListener() {
@Override
public void onFinish() {
//當完成讀條時執行
Toast.makeText(MainActivity.this, "Finish!", Toast.LENGTH_SHORT).show();
}
@Override
public void onProgress(float progress) {
//進度條改變時執行
textView.setText(progress + "%");
}
@Override
public void onCancel() {
//取消長按時執行
Toast.makeText(MainActivity.this, "Cancel!", Toast.LENGTH_SHORT).show();
}
});
}
}
Demo示例
1.效果圖

2.Demo地址
Github鏈接,歡迎Star和給出寶貴意見
https://github.com/Dengyaohui/LongClickProgressViewDemo
CSDN下載地址
https://download.csdn.net/download/Nobody_else_/15087754
結語
下一篇會詳細介紹另一種長按出現水漫效果的按鈕,共勉!
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/257133.html
標籤:其他
