我想製作自定義圓形按鈕,如 Custom circle button中所述,但我也想在執行操作後更改此圓形按鈕的顏色。這個botton將打開一個colorpicker,然後我想要的是把選中的顏色放到按鈕中。以編程方式更改顏色的自定義圓形按鈕
這是最好的選擇,創建一個XML drawable,然後將顏色引用到變量或類似的東西,或創建一個覆蓋onDraw的按鈕的子類,然後繪製一個圓,並可以改變顏色這個圈子容易嗎?
我想製作自定義圓形按鈕,如 Custom circle button中所述,但我也想在執行操作後更改此圓形按鈕的顏色。這個botton將打開一個colorpicker,然後我想要的是把選中的顏色放到按鈕中。以編程方式更改顏色的自定義圓形按鈕
這是最好的選擇,創建一個XML drawable,然後將顏色引用到變量或類似的東西,或創建一個覆蓋onDraw的按鈕的子類,然後繪製一個圓,並可以改變顏色這個圈子容易嗎?
要創建一個可以以編程方式更改其顏色的圓形按鈕,我創建了一個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();
}
}
我遇到了changeColor方法的問題,其中mCanvas顯示爲null並導致NPE。這似乎正在發生,因爲OnSizeChanged在changeColor後被調用。有什麼建議麼? –
你可以嘗試使用'getMeasuredWidth()'和'getMeasuredHeight()'在init方法中實例化變量,但我認爲這可能不起作用,因爲可能會返回0,我們的圓圈將不會被查看,因爲他的尺寸將等於0. 另外,我建議你,如果你不打算改變圓的顏色,你可以在init的'mPaint.setColor(int)'中覆蓋它的顏色你想擁有。 –
可以使用的ImageButton – pvllnspk
但我可以改變所有調色板 –
最好的選擇的顏色dinamically是創建有狀態的可繪製如StateListDrawable – pskink