最近遇到個比較蛋疼的需求,是需要傳圖片然後變圓角,另外還需要根據後臺返回的顏色值進行背景漸變
所以寫了一個自定義的View 代碼如下
public class GradualCirView extends View {
private Paint paintBK;
private Paint paintNR;
private boolean isGradua=true;
private int color[]={0xff2D0081,0xff8B3097,0xffD14E7A};
public GradualCirView(Context context) {
super(context);
init();
}
public GradualCirView(Context context,AttributeSet attrs) {
super(context, attrs);
init();
}
public GradualCirView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init(){
paintBK=new Paint();
paintNR=new Paint();
paintBK.setColor(Color.WHITE);
paintBK.setAntiAlias(true);
paintBK.setStrokeWidth(10);
paintBK.setStyle(Paint.Style.STROKE);
paintBK.setTextSize(30);
paintNR.setColor(Color.RED);
paintNR.setAntiAlias(true);
paintNR.setStyle(Paint.Style.FILL);
paintNR.setTextSize(30);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int miniwidth=getSuggestedMinimumWidth();
int miniheight=getSuggestedMinimumHeight();
int width=mesuerWidth(miniwidth,widthMeasureSpec);
int height=mesuerHeight(miniheight,heightMeasureSpec);
setMeasuredDimension(width,height);
}
private int mesuerWidth(int defw,int mespc){
int specMode=MeasureSpec.getMode(mespc);
int specSize=MeasureSpec.getSize(mespc);
switch (specMode){
case MeasureSpec.AT_MOST:
defw=300;
break;
case MeasureSpec.EXACTLY:
defw=specSize;
break;
case MeasureSpec.UNSPECIFIED:
defw=Math.max(defw,specSize);
break;
}
return defw;
}
private int mesuerHeight(int defh,int mespc){
int specMode=MeasureSpec.getMode(mespc);
int specSize=MeasureSpec.getSize(mespc);
switch (specMode){
case MeasureSpec.AT_MOST:
defh=300;
break;
case MeasureSpec.EXACTLY:
defh=specSize;
break;
case MeasureSpec.UNSPECIFIED:
defh=Math.max(defh,specSize);
break;
}
return defh;
}
public void isGradud(boolean isGradua,int[] colors){
this.isGradua=isGradua;
this.color=colors;
}
@Override
public void draw(Canvas canvas) {
super.draw(canvas);
if (isGradua==false){
canvas.drawRoundRect(new RectF(0,0,getMeasuredWidth(),getMeasuredHeight()), 15, 15, paintBK);
}else{
LinearGradient shader=new LinearGradient(0,0,getMeasuredWidth(),0,color,null, Shader.TileMode.CLAMP);
paintNR.setShader(shader);
canvas.drawRoundRect(new RectF(0,0,getMeasuredWidth(),getMeasuredHeight()), 20, 20, paintNR);
}
}
}