2013-10-12 77 views
0

我想製作自定義圓形按鈕,如 Custom circle button中所述,但我也想在執行操作後更改此圓形按鈕的顏色。這個botton將打開一個colorpicker,然後我想要的是把選中的顏色放到按鈕中。以編程方式更改顏色的自定義圓形按鈕

這是最好的選擇,創建一個XML drawable,然後將顏色引用到變量或類似的東西,或創建一個覆蓋onDraw的按鈕的子類,然後繪製一個圓,並可以改變顏色這個圈子容易嗎?

+0

可以使用的ImageButton – pvllnspk

+0

但我可以改變所有調色板 –

+0

最好的選擇的顏色dinamically是創建有狀態的可繪製如StateListDrawable – pskink

回答

1

要創建一個可以以編程方式更改其顏色的圓形按鈕,我創建了一個View的子類,然後重寫onDraw方法以覆蓋方法drawCircle()。要改變另一個類的顏色,我創建了改變顏色的方法changeColor(int),然後繪製另一個圓並使視圖無效()以再次製作onDraw。

下面的代碼:

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.util.AttributeSet; 
import android.view.View; 

public class ColorCircleButton extends View{ 

private Paint mPaint; 
private Paint mBitmapPaint; 
private Bitmap mBitmap; 
private Canvas mCanvas; 
private int width, height; 

public ColorCircleButton(Context context) { 
    super(context); 
    init(); 
} 
public ColorCircleButton(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    init(); 
} 
public ColorCircleButton(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    init(); 
} 
private void init() { 
    mPaint = new Paint(); 
    mPaint.setColor(Color.BLACK); 
    mPaint.setStrokeWidth(1); 
    mPaint.setStyle(Paint.Style.FILL_AND_STROKE); 
    mBitmapPaint = new Paint(Paint.DITHER_FLAG); 
} 
@Override 
protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    super.onSizeChanged(w, h, oldw, oldh); 
    width = w; 
    height = h; 
    mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 
    mCanvas = new Canvas(mBitmap); 
    mCanvas.drawCircle(w/2, h/2, h/3, mPaint); 
} 
@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); 
} 
public void changeColor(int color){ 
    mPaint.setColor(color); 
    mCanvas.drawCircle(width/2, height/2, height/3, mPaint); 
    invalidate(); 
} 
} 
+0

我遇到了changeColor方法的問題,其中mCanvas顯示爲null並導致NPE。這似乎正在發生,因爲OnSizeChanged在changeColor後被調用。有什麼建議麼? –

+0

你可以嘗試使用'getMeasuredWidth()'和'getMeasuredHeight()'在init方法中實例化變量,但我認爲這可能不起作用,因爲可能會返回0,我們的圓圈將不會被查看,因爲他的尺寸將等於0. 另外,我建議你,如果你不打算改變圓的顏色,你可以在init的'mPaint.setColor(int)'中覆蓋它的顏色你想擁有。 –

相關問題