自定义视图Canvas onDraw()不会绘制任何内容

问题描述 投票:1回答:2

我正在尝试使用画布绘制椭圆形,但从未绘制过。这是我的自定义视图代码。我也用过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
2个回答
2
投票

问题是getWidth()getHeight()为0。将其更改为您的要求。

您可以使用以下内容作为参考。

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.40 f, 0.0 f, 100.60 f, 100.0 f,
            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);

“示例”


2
投票

当在init()中调用时:rect = new RectF(0.1f,0.1f,getWidth(),getHeight());

getWidth()和getHeight()均返回0

© www.soinside.com 2019 - 2024. All rights reserved.