import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
/**
* 圓形進度條
* Created by WSJ on 2016/12/15.
*/
public class CircleProgressDrawable extends Drawable {
private static final String TAG = "CircleProgressDrawable";
// 畫筆.
private Paint mPaint;
// 當前進度.
private int mCurProgress;
// 總進度.
private int mMaxProgress;
// 開始角度.
private int mStartAngle;
// 旋轉方向, 順時針,逆時針.
private int mOritation;
// 圓環(huán)寬度.
private int mRingWidth;
/**
* 進度條開始位置.
*/
public interface StartPointType {
// 右
public static final int START_ANGLE_RIGHT = 0;
// 下
public static final int START_ANGLE_BOTTOM = 90;
// 左
public static final int START_ANGLE_LEFT = 180;
// 上
public static final int START_ANGLE_TOP = 270;
}
/**
* 進度條方向
*/
public interface ProgressOrientation {
// 順時針.
public static final int PROGRESS_ORITATION_CLOCKWISE = 0x00;
// 逆時針.
public static final int PROGRESS_ORITAITON_ANTICLOCKWISE = 0x01;
}
public void setOrientation(int orientation){
if (orientation == ProgressOrientation.PROGRESS_ORITAITON_ANTICLOCKWISE || orientation == ProgressOrientation.PROGRESS_ORITATION_CLOCKWISE){
mOritation = orientation;
}else {
throw new RuntimeException("Orientation value must be from interface ProgressOrientation !");
}
}
public CircleProgressDrawable(int maxProgress, int ringWidth, int ringColor,int startAngle){
mMaxProgress = maxProgress;
mCurProgress = 0;
mStartAngle = startAngle;
mRingWidth = ringWidth;
// 默認是逆時針方向.
mOritation = ProgressOrientation.PROGRESS_ORITAITON_ANTICLOCKWISE;
mPaint = new Paint();
// 描邊
mPaint.setStyle(Paint.Style.STROKE);
// 設置顏色
mPaint.setColor(ringColor);
// 設置抗鋸齒
mPaint.setAntiAlias(true);
// 設置圓環(huán)寬度
mPaint.setStrokeWidth(mRingWidth);
// 設置圓角
mPaint.setStrokeCap(Paint.Cap.ROUND);
}
public int getCurProgress(){
return mCurProgress;
}
/**
* 設置進度百分比 .
* @param curProgress 當前進度.
*/
public void setCurProgress(int curProgress){
// 賦值
if (mOritation == ProgressOrientation.PROGRESS_ORITATION_CLOCKWISE){
// 順時針.
mCurProgress = curProgress > mMaxProgress ? mMaxProgress : curProgress;
}else {
// 逆時針
mCurProgress = -(curProgress > mMaxProgress ? mMaxProgress : curProgress);
}
// 重繪
invalidateSelf();
}
@Override
public void draw(Canvas canvas) {
// 清除畫布
canvas.drawColor(Color.WHITE);
// 獲取尺寸
final Rect bounds = getBounds();
// 計算半徑
final int radius = (Math.min(bounds.width(),bounds.height()) - mRingWidth) / 2;
// 計算矩形位置.
final int offsetX = (bounds.width() - radius * 2)/2 ;
final int offsetY = (bounds.height() - radius * 2)/2 ;
RectF rect = new RectF(offsetX,offsetY,offsetX + radius * 2,offsetY + radius *2);
// 1. 繪制圓環(huán)
final int centerX = bounds.width() / 2;
final int centerY = bounds.height() / 2;
final float outRingRadius = radius + mRingWidth / 2;
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(1);
canvas.drawCircle(centerX,centerY,outRingRadius,mPaint);
// 計算角度.
int angle = (int) ((mCurProgress * 1.0 / mMaxProgress) * 360);
// 2. 繪制進度圓環(huán).
mPaint.setStrokeWidth(mRingWidth);
canvas.drawArc(rect,mStartAngle,angle,false,mPaint);
// 3. 繪制內圓
final float innerMaxCircleRadius = radius - mRingWidth / 2 + 1;
final float innerCurCircleRadius = (int) (innerMaxCircleRadius * (mCurProgress * 1.0 / mMaxProgress));
mPaint.setStyle(Paint.Style.FILL);
canvas.drawCircle(centerX,centerY,Math.abs(innerCurCircleRadius),mPaint);
}
@Override
public void setAlpha(int alpha) {
mPaint.setAlpha(alpha);
}
@Override
public void setColorFilter(ColorFilter colorFilter) {
mPaint.setColorFilter(colorFilter);
}
@Override
public int getOpacity() {
return PixelFormat.TRANSPARENT;
}
@Override
public int getIntrinsicHeight() {
return getBounds().height();
}
@Override
public int getIntrinsicWidth() {
return getBounds().width();
}
}
自定義Drawable實現環(huán)形進度條.
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
- 文/潘曉璐 我一進店門改衩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岖常,“玉大人,你說我怎么就攤上這事葫督〗甙埃” “怎么了板惑?”我有些...
- 正文 為了忘掉前任往湿,我火速辦了婚禮,結果婚禮上惋戏,老公的妹妹穿的比我還像新娘领追。我一直安慰自己,他們只是感情好响逢,可當我...
- 文/花漫 我一把揭開白布绒窑。 她就那樣靜靜地躺著,像睡著了一般舔亭。 火紅的嫁衣襯著肌膚如雪些膨。 梳的紋絲不亂的頭發(fā)上,一...
- 文/蒼蘭香墨 我猛地睜開眼噩峦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了抽兆?” 一聲冷哼從身側響起识补,我...
- 正文 年R本政府宣布底循,位于F島的核電站巢株,受9級特大地震影響,放射性物質發(fā)生泄漏熙涤。R本人自食惡果不足惜阁苞,卻給世界環(huán)境...
- 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望祠挫。 院中可真熱鬧那槽,春花似錦、人聲如沸等舔。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽慌植。三九已至甚牲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蝶柿,已是汗流浹背丈钙。 一陣腳步聲響...
推薦閱讀更多精彩內容
- 在ReactNative使用過程中纵顾,我們使用最多的是通過fetch的方法來訪問網絡伍茄。但是當用于下載的時候,好像沒有...
- 參考地址 http://sumile.cn/archives/1523.html attrs.xml
- 在日常iOS開發(fā)中施逾,系統(tǒng)提供的控件常常無法滿足業(yè)務功能敷矫,這個時候需要我們實現一些自定義控件。自定義控件能讓我們完全...