我在这里读到了关于这个主题的不同问题,但我仍然找不到答案。随时以任何理由关闭此问题。
我有一个简单的Circle
类,可以扩展View
。
此课程的代码是:
public class ProgressCircle extends View {
Paint mCirclePaint;
float extRadius;
float viewWidth, viewHeight;
float centerX, centerY;
public ProgressCircle(Context context, AttributeSet attrs) {
super(context, attrs);
setWillNotDraw(false);
init();
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
float xpad = (float) getPaddingLeft() + getPaddingRight();
float ypad = (float) getPaddingTop() + getPaddingBottom();
float ww = (float)w - xpad; float hh = (float)h - ypad;
extRadius = Math.min(ww, hh) / 2;
viewWidth = this.getWidth();
viewHeight = this.getHeight();
centerX = viewWidth / 2; centerY = viewHeight / 2;
super.onSizeChanged(w, h, oldw, oldh);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawCircle(centerX, centerY, extRadius, mCirclePaint);
canvas.drawText("ciao", 0, 0, mCirclePaint);
}
private void init() {
mCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mCirclePaint.setColor(0x666666);
mCirclePaint.setStyle(Paint.Style.FILL_AND_STROKE);
}
我确认在创建主活动时(通过使用一些Log.d()
s)调用此类中的每个方法。我在主要活动的<com.mypackage.Circle>
中添加了LinearLayout
元素,之后我添加了一个示例测试按钮。
我所取得的成就是我的Circle
没有显示按钮,但按钮(LinearLayout
之后的Circle
)不是第一个元素布局:这让我觉得实际发生了一些事情,但没有得到任何东西。
答案 0 :(得分:3)
这只是一个愚蠢的问题:mCirclePaint.setColor(0x666666)
中的颜色是无效的。它适用于mCirclePaint.setColor(Color.RED)
或res
文件夹中定义的任何其他颜色。
如果需要指定颜色值,则必须包含透明度字节(否则它不是您指定的32位整数,而是24位)。因此0x666666无效,但0xff666666是有效颜色并将绘制。
答案 1 :(得分:0)
阅读文档(http://developer.android.com/guide/topics/graphics/2d-graphics.html)后:
Android框架只会在必要时调用onDraw()。每一次 您的申请准备被提取,您必须要求您的申请 通过调用invalidate()使视图无效。这表明你已经 就像你要绘制的视图一样,Android会调用你的onDraw() 方法(虽然不能保证回调将是 瞬时)。
另外值得检查的是你正在绘制的尺寸,确保没有任何东西像0等高度一样无效。
答案 2 :(得分:0)
我注意到你没有覆盖View.onMeasure()。
因为您没有覆盖此方法,onsizeChanged()
可能会传递大小0.您可以通过在onSizechanged()
方法中放置断点或打印到Logcat来检查这一点。