自定义视图 Canvas onDraw() 不绘制任何东西
Posted
技术标签:
【中文标题】自定义视图 Canvas onDraw() 不绘制任何东西【英文标题】:Custom view Canvas onDraw() doesnt draw anything 【发布时间】:2013-05-17 09:12:57 【问题描述】:我正在尝试使用画布绘制一个椭圆,但它永远不会被绘制。
这是我的自定义视图代码。我也使用了setWillNotDraw(false)
仍然没有在屏幕上绘制。
public class Myview extends View
Paint paint;
RectF rect;
public Myview(Context context)
super(context);
init();
setWillNotDraw(false);
public Myview(Context context, AttributeSet attrs)
super(context, attrs);
init();
setWillNotDraw(false);
public Myview(Context context, AttributeSet attrs, int defStyle)
super(context, attrs, defStyle);
init();
setWillNotDraw(false);
private void init()
rect = new RectF(0.1 f, 0.1 f, getWidth(), getHeight());
paint = new Paint();
paint.setShader(new LinearGradient(0.40 f, 0.0 f, 100.60 f, 100.0 f,
Color.parseColor("#ffffff"),
Color.parseColor("#Ffffff"),
Shader.TileMode.CLAMP));
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
setMeasuredDimension(200, 200);
@Override
protected void onDraw(Canvas canvas)
super.onDraw(canvas);
canvas.drawOval(rect, paint);
有什么建议吗?
【问题讨论】:
【参考方案1】:问题是 getWidth() 和 getHeight() 是 O。根据您的要求更改。
您可以参考以下内容。
public class MainActivity extends Activity
MyView mv;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
mv= new MyView(this);
setContentView(mv);
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setDither(true);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeJoin(Paint.Join.ROUND);
mPaint.setStrokeCap(Paint.Cap.ROUND);
mPaint.setStrokeWidth(20);
mPaint.setShader(new LinearGradient(0.40f, 0.0f, 100.60f, 100.0f,
Color.RED,
Color.RED,
Shader.TileMode.CLAMP));
private Paint mPaint;
public class MyView extends View
Paint paint;
RectF rect;
public MyView(Context context)
super(context);
rect = new RectF(20, 20, 100,100);
//canvas.drawOval(new RectF(50, 50, 20, 40), p)
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
setMeasuredDimension(200, 200);
@Override
protected void onDraw(Canvas canvas)
super.onDraw(canvas);
canvas.drawOval(rect, mPaint);
根据您的要求更改坐标和颜色。上面画了一个圆圈,但你可以改变坐标来画椭圆,比如 canvas.drawOval(new RectF(50, 50, 20, 40), mPaint);
【讨论】:
非常感谢您提供的参考代码。在我更改 getwidth() 和 get height() 后它起作用了。但我有一个疑问...... onmeasure() 究竟什么时候被调用?调用 getwidth() 后应该返回 200 对??? @shreyas 检查文档developer.android.com/reference/android/view/View.html。向下滚动并检查 onMeasure 方法。它在视图大小发生变化时调用。【参考方案2】:在 init() 中调用时:rect = new RectF(0.1f, 0.1f, getWidth(),getHeight());
getWidth() 和 getHeight() 都返回 0
【讨论】:
以上是关于自定义视图 Canvas onDraw() 不绘制任何东西的主要内容,如果未能解决你的问题,请参考以下文章