android自定义view(三)

自定义view第三种是:完全自定义
效果如下:
这里写图片描述
需要解决的问题:
1 view的测量 onMeasure()
2 view的绘制onDraw()
3 如果需要变换图形,需要使用invalid更新,可以实现动态的效果

public class MyView extends View {
    //view测绘的大小
    //内圆部分
    private int mMeasureWidth,mMeasureHeight;
    private Paint mCirclePaint;
    private float mCircleXY;
    private float mCircleRadis;
//外圈部分
    private Paint mArcPaint;
    private RectF mArcRectF;
    private float mSweepAngle;
    //扫过的弧度
    private float mSweepValue = 50;
//文字部分
    private Paint mTextPaint;
    private String mShowText;
    private float mShowTextSize;
//下面的构造方法  不要删除
    public MyView(Context context) {
        super(context);
    }
    public MyView(Context context, AttributeSet attrs,
                              int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //这里处理一些绘画
        // 绘制圆api 参数 圆心X,Y 半径 画笔
        canvas.drawCircle(mCircleXY, mCircleXY, mCircleRadis, mCirclePaint);
        // 绘制弧线
        canvas.drawArc(mArcRectF, 270, mSweepAngle, false, mArcPaint);
        // 绘制文字
        canvas.drawText(mShowText, 0, mShowText.length(),
                mCircleXY, mCircleXY + (mShowTextSize / 4), mTextPaint);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        mMeasureWidth=MeasureSpec.getSize(widthMeasureSpec);
        mMeasureHeight=MeasureSpec.getSize(heightMeasureSpec);
        //设置测绘尺寸
        setMeasuredDimension(mMeasureWidth,mMeasureHeight);
        initView();
    }
    private void initView(){
        float lenght=0;
        lenght=Math.min(mMeasureWidth,mMeasureHeight);
        //圆心坐标
        mCircleXY=lenght/2;
        mCircleRadis=(float) (lenght * 0.5 / 2);
        mCirclePaint=new Paint();
        //防锯齿效果
        mCirclePaint.setAntiAlias(true);
        mCirclePaint.setColor(getResources().getColor(android.R.color.holo_blue_bright));
        mArcRectF=new RectF(
                (float) (lenght * 0.1),
                (float) (lenght * 0.1),
                (float) (lenght * 0.9),
                (float) (lenght * 0.9));
        mSweepAngle = (mSweepValue / 100f) * 360f;

        //画圆
        mArcPaint = new Paint();
        mArcPaint.setAntiAlias(true);
        mArcPaint.setColor(getResources().getColor(
                android.R.color.holo_blue_bright));
        mArcPaint.setStrokeWidth((float) (lenght * 0.1));
        //空心
        mArcPaint.setStyle(Paint.Style.STROKE);
        //文字部分
        mShowText = setShowText();
        mShowTextSize = setShowTextSize();
        mTextPaint = new Paint();
        mTextPaint.setTextSize(mShowTextSize);
        mTextPaint.setTextAlign(Paint.Align.CENTER);

    }
    private String setShowText() {
        this.invalidate();
        return "Android Skill";
    }
    private float setShowTextSize() {
        this.invalidate();
        return 50;
    }
    //提供外部接口 设置弧度值
    public void setSweepValue(float sweepValue) {
        if (sweepValue != 0) {
            mSweepValue = sweepValue;
        } else {
            mSweepValue = 25;
        }
        this.invalidate();
    }

}

整个绘制过程都比较简单,需要注意的是
view的默认构造方法要保留,否则会出错

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值