好久都沒(méi)有寫自定義了。今天有一個(gè)色盤取色的它褪,本來(lái)以為會(huì)有圖片的饵骨,結(jié)果沒(méi)有,就只能自定義寫了茫打。
這里先看效果圖:
色盤.png
分析思路:先畫一個(gè)大圓居触,給一個(gè)陰影背景;再畫一個(gè)圓老赤,設(shè)置色盤寬度即可轮洋。
直接開(kāi)始寫:
初始化:
private Paint mDiskPaint;//色盤畫筆
private float mDiskPaintWidth;//色盤寬度
private Shader shader; // 色環(huán)顏色的發(fā)散位置
private Paint bgPaint;//背景畫筆
private float r_bgPaint;//背景圓半徑
private float r_shaderPaint;//
//漸變色環(huán)顏色
private int[] mCircleColors = new int[] { 0xFFFF0000, 0xFFFF00FF, 0xFF0000FF, 0xFF00FFFF, 0xFF00FF00, 0xFFFFFF00,
0xFFFF0000 };
public ColorDiskView(Context context) {
super(context);
init();
}
public ColorDiskView(Context context, AttributeSet attrs) {
//this(context, attrs,0);
super(context,attrs);
init();
}
public ColorDiskView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
mDiskPaint=new Paint(Paint.ANTI_ALIAS_FLAG);
mDiskPaint.setStyle(Paint.Style.STROKE);
bgPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
LinearGradient gradient = new LinearGradient(0, 0, 700, 700, 0XFF222222, 0xFF909090, Shader.TileMode.CLAMP);
bgPaint.setShader(gradient);
}
注意色盤顏色的數(shù)組:mCircleColors.
重寫onMeasure 方法:
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int widthSpecMode=MeasureSpec.getMode(widthMeasureSpec);
int widthSpecSize=MeasureSpec.getSize(widthMeasureSpec);
int heightSpecMode=MeasureSpec.getMode(heightMeasureSpec);
int heightSpecSize=MeasureSpec.getSize(heightMeasureSpec);
if (widthSpecMode==MeasureSpec.AT_MOST&&heightSpecMode==MeasureSpec.AT_MOST){
setMeasuredDimension(500,500);
}else if(widthSpecMode==MeasureSpec.AT_MOST){
setMeasuredDimension(500,heightSpecSize);
}else if (heightSpecMode==MeasureSpec.AT_MOST){
setMeasuredDimension(widthSpecSize,500);
}
}
最后重寫onDraw的方法:
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
final int paddingLeft=getPaddingLeft();
final int paddingRight=getPaddingRight();
final int paddingTop=getPaddingTop();
final int paddingBottom=getPaddingBottom();
int width=getWidth()-paddingLeft-paddingRight;
int height=getHeight()-paddingTop-paddingBottom;
r_bgPaint=Math.min(width,height)/2;
mDiskPaintWidth=r_bgPaint/12*5;
r_shaderPaint=r_bgPaint-mDiskPaintWidth/2;
mDiskPaint.setStrokeWidth(mDiskPaintWidth);
//圓心確定在填充
shader=new SweepGradient(paddingLeft+width/2,paddingRight+height/2 ,mCircleColors,null);
mDiskPaint.setShader(shader);
canvas.drawCircle(paddingLeft+width/2,paddingRight+height/2,r_bgPaint,bgPaint); //外圓大小
canvas.drawCircle(paddingLeft+width/2,paddingRight+height/2, r_shaderPaint, mDiskPaint);//色盤大小
}
這樣就OK了。其實(shí)也很簡(jiǎn)單的抬旺,你也試試弊予。