【问题标题】:Custom view Canvas onDraw() doesnt draw anything自定义视图 Canvas onDraw() 不绘制任何东西
【发布时间】: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);
    }
}

有什么建议吗?

【问题讨论】:

    标签: android android-canvas android-view ondraw


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多