android 進度條顯示時間專題及常見問題 - CSDN

2021-01-10 CSDN技術社區

一個通俗易懂的環形進度條,可以定製顏色角度,監聽進度。

定義一個attrs.xml

自定義CircleProgressView

package com.sample.circleprogressview.widget;

import android.animation.ValueAnimator;

import android.content.Context;

import android.content.res.TypedArray;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.graphics.RectF;

import android.support.annotation.Nullable;

import android.util.AttributeSet;

import android.view.View;

import android.view.animation.LinearInterpolator;

import com.sample.circleprogressview.R;

/**

* 普通環形進度條

*/

public class CircleProgressView extends View {

private int mCurrent;//當前進度

private Paint mBgPaint;//背景弧線paint

private Paint mProgressPaint;//進度Paint

private float mProgressWidth;//進度條寬度

private int mProgressColor = Color.RED;//進度條顏色

private int locationStart;//起始位置

private float startAngle;//開始角度

private ValueAnimator mAnimator;

public CircleProgressView(Context context) {

this(context, null);

}

public CircleProgressView(Context context, @Nullable AttributeSet attrs) {

this(context, attrs, 0);

}

public CircleProgressView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

init(context, attrs);

}

private void init(Context context, AttributeSet attrs) {

TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CircleProgressView);

locationStart = typedArray.getInt(R.styleable.CircleProgressView_location_start, 1);

mProgressWidth = typedArray.getDimension(R.styleable.CircleProgressView_progress_width, dp2px(context, 4));

mProgressColor = typedArray.getColor(R.styleable.CircleProgressView_progress_color, mProgressColor);

typedArray.recycle();

//背景圓弧

mBgPaint = new Paint();

mBgPaint.setAntiAlias(true);

mBgPaint.setStrokeWidth(mProgressWidth);

mBgPaint.setStyle(Paint.Style.STROKE);

mBgPaint.setColor(Color.parseColor("#eaecf0"));

mBgPaint.setStrokeCap(Paint.Cap.ROUND);

//進度圓弧

mProgressPaint = new Paint();

mProgressPaint.setAntiAlias(true);

mProgressPaint.setStyle(Paint.Style.STROKE);

mProgressPaint.setStrokeWidth(mProgressWidth);

mProgressPaint.setColor(mProgressColor);

mProgressPaint.setStrokeCap(Paint.Cap.ROUND);

//進度條起始角度

if (locationStart == 1) {//左

startAngle = -180;

} else if (locationStart == 2) {//上

startAngle = -90;

} else if (locationStart == 3) {//右

startAngle = 0;

} else if (locationStart == 4) {//下

startAngle = 90;

}

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

int width = MeasureSpec.getSize(widthMeasureSpec);

int height = MeasureSpec.getSize(heightMeasureSpec);

int size = width < height ? width : height;

setMeasuredDimension(size, size);

}

/**

* oval // 繪製範圍

* startAngle // 開始角度

* sweepAngle // 掃過角度

* useCenter // 是否使用中心

*/

@Override

protected void onDraw(Canvas canvas) {

//繪製背景圓弧

RectF rectF = new RectF(mProgressWidth / 2, mProgressWidth / 2, getWidth() - mProgressWidth / 2, getHeight() - mProgressWidth / 2);

canvas.drawArc(rectF, 0, 360, false, mBgPaint);

//繪製當前進度

float sweepAngle = 360 * mCurrent / 100;

canvas.drawArc(rectF, startAngle, sweepAngle, false, mProgressPaint);

}

public int getCurrent() {

return mCurrent;

}

/**

* 設置進度

*

* @param current

*/

public void setCurrent(int current) {

mCurrent = current;

invalidate();

}

private int tCurrent = -1;

/**

* 動畫效果

*

* @param current 精度條進度:0-100

* @param duration 動畫時間

*/

public void startAnimProgress(int current, int duration) {

mAnimator = ValueAnimator.ofInt(0, current);

mAnimator.setDuration(duration);

mAnimator.setInterpolator(new LinearInterpolator());

mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

@Override

public void onAnimationUpdate(ValueAnimator animation) {

int current = (int) animation.getAnimatedValue();

if (tCurrent != current) {

tCurrent = current;

setCurrent(current);

if (mOnAnimProgressListener != null)

mOnAnimProgressListener.valueUpdate(current);

}

}

});

mAnimator.start();

}

public interface OnAnimProgressListener {

void valueUpdate(int progress);

}

private OnAnimProgressListener mOnAnimProgressListener;

/**

* 監聽進度條進度

*

* @param onAnimProgressListener

*/

public void setOnAnimProgressListener(OnAnimProgressListener onAnimProgressListener) {

mOnAnimProgressListener = onAnimProgressListener;

}

public void destroy() {

if (mAnimator != null) {

mAnimator.cancel();

}

}

public static int dp2px(Context context, float dpValue) {

final float scale = context.getResources().getDisplayMetrics().density;

return (int) (dpValue * scale + 0.5f);

}

}

代碼就這麼些,接下來我們測算一下

package com.sample.circleprogressview;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.TextView;

import com.sample.circleprogressview.widget.CircleProgressView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private CircleProgressView circle_progress;

private TextView tv_progress;

private Button btn_start;

private Button btn_reset;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

btn_start = (Button) findViewById(R.id.btn_start);

btn_reset = (Button) findViewById(R.id.btn_reset);

circle_progress = (CircleProgressView) findViewById(R.id.circle_progress);

tv_progress = (TextView) findViewById(R.id.tv_progress);

btn_start.setOnClickListener(this);

btn_reset.setOnClickListener(this);

}

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.btn_start:

//開鎖執行動畫效果

circle_progress.startAnimProgress(50, 1200);

//監聽進度條進度

circle_progress.setOnAnimProgressListener(new CircleProgressView.OnAnimProgressListener() {

@Override

public void valueUpdate(int progress) {

tv_progress.setText(String.valueOf(progress));

}

});

break;

case R.id.btn_reset:

circle_progress.setCurrent(0);

tv_progress.setText("0");

break;

}

}

@Override

protected void onDestroy() {

super.onDestroy();

if (circle_progress != null) {

circle_progress.destroy();

}

}

}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關焦點

  • android啟動頁設計專題及常見問題 - CSDN
    轉載請註明出處:http://blog.csdn.net/wangjihuanghun/article/details/63255144啟動頁幾乎成為了每個app的標配,有些商家在啟動頁中增加了開屏廣告以此帶來更多的收入。
  • android 從後臺啟動頁面專題及常見問題 - CSDN
    這三個Tesseract語言包合起來約有70M左右,APK文件中拷貝語言包到手機存儲中需要幾秒時間,所以我們做了一個啟動頁面,在為用戶展示App第一印象的同時,後臺拷貝這三個語言包。經過比較,知乎日報的啟動頁面有從中心點展開逼進用戶的效果,我們決定利用此效果來設計啟動頁面。最終效果如圖所示:
  • android布局詳解專題及常見問題 - CSDN
    <include android:id=」@+id/cell3 layout=」@layout/workspace_screen」 /></LinearLayout>  上面的代碼中的<include>標籤還使用了一個android:id屬性,實際上,該屬性指定的是workspace_screen.xml布局文件中的根節點的android
  • android可文本框專題及常見問題 - CSDN
    <EditTextandroid:id="@+id/textNormal"android:layout_width="fill_parent"android:layout_height="wrap_content"android:hint="Normaltext"android:inputType="text
  • android 首次打開判斷專題及常見問題 - CSDN
    前言用真機運行appium代碼,首次打開app有的手機會出現權限彈窗問題,一般這種彈窗都是在引導頁前面或者引導頁後面出現。權限彈窗上面的按鈕都是固定的,只需要定位到「始終允許」按鈕,點擊確定就可以了。還有一個問題是這種彈窗的個數不確定,有的app是2個有的是3個,為了解決這個問題,可以專門寫個判斷方法。
  • android 獲取某個控制項的焦點專題及常見問題 - CSDN
    schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:id="@+id/edit_layout"
  • android判斷edittext獲取焦點 - CSDN
    我們在開發中,可能會遇到需要判斷用戶在輸入框裡寫的內容合不合法,比如判斷用戶輸入的內容是否是手機號,接下來我通過詳細說明一個小Demo來解決這個問題首先看一下這個Demo實現的效果圖我多打了一位數字就會提示錯誤了
  • android開發 自我優勢 - CSDN
    3、能夠有效避免APP運行過程中遇到的內存洩漏和內存溢出問題。4、熟練掌握線程之間通過Handler傳遞消息的機制原理5、熟練掌握自定義控制項,自定義組合控制項中View所經過的測量,布局,繪製的流程,以及Touch事件分發機制。
  • iot深圳 nb專題及常見問題 - CSDN
    關注同名公眾號「IoT黑板報」 ,獲取更多物理網資訊及乾貨 關注物聯網領域,尋求報導或投稿請郵件聯繫 jiawd@csdn.net高通驍龍835各項跑分出爐 性能碾壓去年所有旗艦手機@威鋒網 高通最新移動平臺 Snapdragon 835,基本上可以確認是今年旗艦智慧型手機的標配,在驍龍 835 真機到來之前,隨著昨日中國發布會的解禁,越來越多的相關跑分測試也隨之出爐
  • android 垂直約束 - CSDN
    發布的一個新布局( 翻譯成中文 「約束布局「 )它的使用方式有兩種在 AS 2.3 以上版本都可以使用滑鼠拖動使用代碼書寫控制項之間的約束這篇文章雖然是 ConstraintLayout 專題文章,可以直接拖動到視圖上,就可以添加控制項了左下角是顯示當前布局的層級嵌套,點擊每個控制項也可以選中,然後進行一系列操作右邊是一些屬性的調整,上半部分可以調整偏移,layout_margin 以及 layout_width,layout_height,下半部分是具體的屬性
  • android布局和界面 - CSDN
    android:layout_gravity用於設置組件自身在父組件中的對齊方式。需要注意的是,此屬性與布局屬性android: gravity的區別。android:gravity用於設置View組件的對齊方式。
  • android開發中分享功能 - CSDN
    :enable要設置為true如果要動態設置是否在列表中出現時,可以在代碼中設置enable的值 <activity android:theme="@style/No_title_transparent" android:label="@string/other_apps" android:name="
  • c++獲取系統日期時間專題及常見問題 - CSDN
    ("%d\n",1+p->tm_mon);/*獲取當前月份,範圍是0-11,所以要加1*/ printf("%d\n",1900+p->tm_year);/*獲取當前年份,從1900開始,所以要加1900*/ printf("%d\n",p->tm_yday); /*從今年1月1日算起至今的天數,範圍為0-365*/}原文:https://blog.csdn.net
  • Android一種信息提示機制:Toast
    答案當然是肯定的啦,android已經為我們提供了一個非常簡便的方法,那就是Toast,直譯為吐司~ 很可愛的名字吧~ 用起來像它的名字一樣,非常方便。例如我們要想用戶顯示一些文本信息,可以使用下面的方法~  Toast.makeText(self, "Hello World!"
  • android 排列 - CSDN
    android:layout_方向 = id  表示 在這個id對應的控制項的方向上(上|下)android:layout_align方向  = id 表示和這個控制項的(上下左右)對齊android: layout_to方向Of  = id 表示在這個控制項的 左或者右eg:android:layout_below="@id/la1"
  • windows 服務啟動1053專題及常見問題 - CSDN
    1.問題描述今天在啟動一個Windows服務時,服務啟動不了,且提示:1053錯誤那麼是什麼導致了1053錯誤呢?這個問題就能解決了。」 3.實際解決於是根據他的思路,我雙擊了服務程序。結果出現了如下的提示框:
  • android常用的五大布局 - CSDN
    ><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent
  • f檢驗 matlab專題及常見問題 - CSDN
    15.71985 15.91986 15.71987 16.71988 15.31989 16.11990 16.2MATLAB實現參考網上多個代碼可得https://www.ilovematlab.cn/thread-246993-1-1.htmlhttps://blog.csdn.net
  • android關閉開機啟動 - CSDN
    clearProfilerLocked(); } } } } Binder.restoreCallingIdentity(origId); }ActivityStackSuperVisor的activityIdleInternalLocked方法,會報告啟動時間結束
  • android國際化注意專題及常見問題 - CSDN