// -------------核心类-------------------------
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.ProgressBar;
public class HProgress extends ProgressBar {
private static final String TAG="HProgress";
private static final int DEFAULT_TEXT_SIZE = 10;
private static final int DEFAULT_TEXT_COLOR = 0xfffc00d1;
private static final int DEFAULT_UNREACH_COLOR = 0xffd3d6da;
private static final int DEFAULT_REACH_COLOR = DEFAULT_TEXT_COLOR;
private static final int DEFAULT_TEXT_OFFSET = 10;
private static final int DEFAULT_REACH_HEIGHT = 2;
private static final int DEFAULT_UNREACH_HEIGHT = 300;
private int mTextSize = 0;
private int mTextColor = DEFAULT_TEXT_COLOR;
private int mUnReachColor = DEFAULT_UNREACH_COLOR;
private int mReachColor = DEFAULT_REACH_COLOR;
protected int mReachHeight = DEFAULT_REACH_HEIGHT;
protected int mUnReachHeight = DEFAULT_UNREACH_HEIGHT;
private int mTextOffset = DEFAULT_TEXT_OFFSET;
private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
private int mRealWidth = 0;
private boolean mNoNeedUnReach;
public HProgress(Context context) {
this(context, null);
mTextSize = dip2px(context, DEFAULT_TEXT_SIZE * 1.0f);
}
public HProgress(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public HProgress(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray a = null;
a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.HProgress, defStyleAttr, 0);
mTextSize = a.getDimensionPixelSize(R.styleable.HProgress_text_size, mTextSize);
mTextColor = a.getColor(R.styleable.HProgress_text_color, mTextColor);
mReachColor = a.getColor(R.styleable.HProgress_reach_color, mReachColor);
mReachHeight = a.getDimensionPixelSize(R.styleable.HProgress_reach_height, mReachHeight);
mUnReachColor = a.getColor(R.styleable.HProgress_unreach_color, mUnReachColor);
mUnReachHeight = a.getDimensionPixelSize(R.styleable.HProgress_unreach_height, mUnReachHeight);
Log.d(TAG,"mUnReachHeight111 "+mUnReachHeight);
mTextOffset = a.getDimensionPixelOffset(R.styleable.HProgress_text_offset, mTextOffset);
a.recycle();
mPaint.setTextSize(mTextSize);
}
@Override
protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width=MeasureSpec.getSize(widthMeasureSpec);
int heights = measureHeight(heightMeasureSpec);
setMeasuredDimension(width,heights);
mRealWidth=getMeasuredWidth()-getPaddingLeft()-getPaddingRight();
}
private int measureHeight(int heightMeasureSpec) {
int result = 0;
int mode = MeasureSpec.getMode(heightMeasureSpec);
int size = MeasureSpec.getSize(heightMeasureSpec);
Log.d(TAG,"size "+size);
if (mode == MeasureSpec.EXACTLY) {
result = size;
}else {
int textHeight= (int) (mPaint.descent()-mPaint.ascent());
Log.d(TAG,"mUnReachHeight222 "+mUnReachHeight);
result=getTop()+getBottom()+Math.max(Math.max(mReachHeight,mUnReachHeight),Math.abs(textHeight));
Log.d(TAG,"result11 "+result);
if(mode==MeasureSpec.AT_MOST) {
result=Math.min(result,size);
Log.d(TAG,"result22 "+result);
}
}
Log.d(TAG,"result33 "+result);
return result;
}
@Override
protected synchronized void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.save();
canvas.translate(getPaddingLeft(),getHeight()/2);
boolean mNoNeedUnReach= false;
String text=getProgress()+"%";
// int textWidth= (int) mPaint.measureText(text);
Rect rect=new Rect();
mPaint.getTextBounds(text,0,text.length(),rect);
int textWidth=rect.width();
Log.d(TAG,"textWidth2 "+textWidth);
float scale=getProgress()*1.0f/getMax();
float endX=0;
if(scale*mRealWidth+textWidth<mRealWidth){
endX=scale*mRealWidth-mTextOffset/2-textWidth/2;
}else {
endX=mRealWidth-textWidth;
}
if(endX>0){
mPaint.setColor(mReachColor);
mPaint.setStrokeWidth(mReachHeight);
canvas.drawLine(0,0,endX,0,mPaint);
}
float progressX=scale*mRealWidth;
if(progressX+textWidth>mRealWidth){
progressX=mRealWidth-textWidth;
endX=progressX;
mNoNeedUnReach=true;
}
mPaint.setColor(mTextColor);
int y= rect.height()/2;
canvas.drawText(text,endX,y,mPaint);
if(!mNoNeedUnReach){
float start=progressX+mTextOffset/2+textWidth/2;
mPaint.setColor(mUnReachColor);
canvas.drawLine(start,0,mRealWidth,0,mPaint);
}
canvas.restore();
}
/**
* 将dp转换成px
*
* @param context
* @param dpValue
* @return
*/
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
* 将像素转换成dp
*
* @param context
* @param pxValue
* @return
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
}
/-------------------自定义属性---------------------------------
<?xml version="1.0" encoding="utf-8"?> <resources> <attr name="textSize" format="dimension"></attr> <attr name="textColor" format="color"></attr> <declare-styleable name="HuaWeiCircle"> <attr name="outColor" format="color"></attr> <attr name="outRadius" format="dimension"></attr> <attr name="lineColor" format="color"></attr> <attr name="lineHeight" format="dimension"></attr> <attr name="progress" format="integer"></attr> <attr name="textSize" ></attr> <attr name="textColor" ></attr> </declare-styleable> </resources>
----------------------------------使用----------------------------------------------
package com.recyclerview.zhangxiaoqing; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.DividerItemDecoration; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.View; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { private final String TAG="MainActivity"; private final int MSG = 100; private final int MSG_END = 101; private final int MSG_1 = 102; private int aaa=1; private Handler mHandler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { if(msg.what==MSG_END){ mHuaWeiCircle.setState(true); mHuaWeiCircle.endAnimator(); }else if(msg.what==MSG_1){ for (int i = aaa; i <101 ; i++) { Log.d(TAG,"AAA "+aaa); if (aaa >= 100) { /* mHandler.sendEmptyMessageDelayed(MSG_END,0); mHandler.removeMessages(MSG_1);*/ mHandler.removeMessages(MSG_1); mHandler.sendEmptyMessageDelayed(MSG_END,100); }else { mHuaWeiCircle.setProgress(++aaa); mHandler.sendEmptyMessageDelayed(MSG_1,100); break; } } } return true; } }); private RecyclerView mRecyclerView; private List<String> mList = new ArrayList<>(); private CircleLoadingView mCircleLoadingView; private HuaWeiCircle mHuaWeiCircle; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initHuaWei(); } private void initHuaWei() { mHuaWeiCircle = findViewById(R.id.huawei); /*mHuaWeiCircle.setProgress(80); mHuaWeiCircle.setIsStartAnimator(false);*/ mHuaWeiCircle.startAnimator(); mHuaWeiCircle.setProgress(30); mHandler.sendEmptyMessageDelayed(MSG_1,0); } }