我正在尝试从自定义视图在画布上绘制测试线。当我调用方法drawBeats()
时,例如通过按一个按钮,它可以工作,但是我想在启动应用程序时通过drawBeats()
的{{1}}执行MainActivity
。这是我的自定义视图的相关行:
onCreate()
这就是我从 public MetronomeBar(Context context, AttributeSet attrs) {
super(context, attrs);
...
width = this.getWidth();
height = this.getHeight();
onMeasure(width, height);
onSizeChanged(width, height,100, 100);
onDraw(drawCanvas);
}
public void drawBeats() {
drawPaint.setStrokeWidth(40);
drawPaint.setColor(0xFFAAA9A9);
drawCanvas.drawLine(0, 0, 0, 30, drawPaint);
invalidate();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int desiredWidth = 100;
int desiredHeight = 100;
int widthMode = MeasureSpec.AT_MOST;
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightMode = MeasureSpec.AT_MOST;
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
//Measure Width
if (widthMode == MeasureSpec.EXACTLY) {
width = widthSize;
} else if (widthMode == MeasureSpec.AT_MOST) {
//MATCH_PARENT
width = Math.max(desiredWidth, widthSize);
} else {
width = desiredWidth;
}
//Measure Height
if (heightMode == MeasureSpec.EXACTLY) {
height = heightSize;
} else if (heightMode == MeasureSpec.AT_MOST) {
//MATCH_PARENT
height = Math.max(desiredHeight, heightSize);
} else {
height = desiredHeight;
}
//MUST CALL THIS
setMeasuredDimension(width, height);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh){
super.onSizeChanged(w, h, oldw, oldh);
canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
drawCanvas = new Canvas(canvasBitmap);
}
@Override
protected void onDraw(Canvas canvas){
canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
}
}
呼叫drawBeats()
的方式:
MainActivity
我需要强制 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
mBar = findViewById(R.id.mBar);
...
mBar.drawBeats();
}
,onMeasure()
和onSizeChanged()
才能在非空的画布上绘画。我也尝试在线程内部使用onDraw()
。画布的背景从一开始就可见。
我只想在打开应用程序时画些东西,但必须在此特定画布上。