// -------------核心类-------------------------
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);
}
}
2万+

被折叠的 条评论
为什么被折叠?



