Android 重写View来实现全新的控件

需要创建两个文件


attrs_MyArcScaleMap.xml文件定义新控件的xml属性,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="MyArcScaleMap">
        <attr name="myArcScaleMap_titleText" format="string"/>
        <attr name="myArcScaleMap_titleTextColor" format="color"/>
        <attr name="myArcScaleMap_titleTextSize" format="dimension"/>
    </declare-styleable>
</resources>

MyArcScaleMap.java文件包括如下内容:

构造方法:获取自定义的属性集(attrs.xml),创建TypedArray类来获取属性集,获取完属性集后需要调 用recycle()方法来避免重新创建的时候的错误;

画笔初始化方法initXxx():初始化画笔参数;

重载onDraw()方法:定义新控件的画布;

重载onMeasure()方法:获取并设置新控件的宽 高;

全部代码如下:

package com.example.administrator.customwidget;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;

public class MyArcScaleMap extends View {

    private int mMeasureHeight;
    private int mMeasureWidth;

    private String mArcScaleMapTitleText;
    private int mArcScaleMapTitleTextColor;
    private float mArcScaleMapTitleTextSize;

    private Paint mCirclePaint,mArcPaint,mTextPaint;
    private float mCircleXY;
    private float mRadius;      //定义圆弧半径

    private RectF mArcRectF;
    float mSweepAngle = 0;
    private float mSweepValue = -60;




    //构造方法
    public MyArcScaleMap(Context context){
        super(context);

    }

    public MyArcScaleMap(Context context, AttributeSet attrs,int defStyleAttr){
        super(context,attrs,defStyleAttr);
    }

    /**
     * MyArcScaleMap 构造方法
     * @param context  上下文 参数
     * @param attrs    xml参数
     */
    public MyArcScaleMap(Context context, AttributeSet attrs){

        super(context,attrs);

        TypedArray ta = context.obtainStyledAttributes( attrs,R.styleable.MyArcScaleMap);

        mArcScaleMapTitleText = ta.getString(R.styleable.MyArcScaleMap_myArcScaleMap_titleText);
        mArcScaleMapTitleTextColor = ta.getColor(R.styleable.MyArcScaleMap_myArcScaleMap_titleTextColor, 0);
        mArcScaleMapTitleTextSize =ta.getDimension(R.styleable.MyArcScaleMap_myArcScaleMap_titleTextSize,40);

        ta.recycle();

    }

    /**
     * 重载onDraw方法,重定义画布
     * @param canvas     控件画布参数
     * canvas.drawCircle 画圆
     * canvas.drawArc 画圆弧
     * canvas.drawText 写字
     */

    @Override
    protected void onDraw(Canvas canvas){
        super.onDraw(canvas);
        this.initMyArcScaleMap();
        //绘制圆
        canvas.drawCircle(mCircleXY,mCircleXY,mRadius,mCirclePaint);
        //绘制圆弧
        canvas.drawArc(mArcRectF,0,mSweepAngle,false,mArcPaint);
        //绘制TEXT
        canvas.drawText(mArcScaleMapTitleText,0,mArcScaleMapTitleText.length(),
                mCircleXY,mCircleXY + (mArcScaleMapTitleTextSize/4),mTextPaint);

    }

    /**
     * 控件大小测量
     * @param widthMeasureSpec  控件宽
     * @param heightMeasureSpec 控件高
     */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
        mMeasureWidth = MeasureSpec.getSize(widthMeasureSpec);
        mMeasureHeight = MeasureSpec.getSize(heightMeasureSpec);
        setMeasuredDimension(mMeasureWidth,mMeasureHeight);

    }

    /**
     * initMyArcScaleMap() 初始化方法
     * 初始化mCirclePaint mArcPaint mTextPaint等画笔参数
     */

    public void initMyArcScaleMap(){

        float length = 0;
        if(mMeasureHeight >= mMeasureWidth){
            length = mMeasureWidth;
        }else {
            length =mMeasureHeight;
        }

        mCircleXY = length/2;
        mRadius = (float)(length*0.5)/2;

        mCirclePaint = new Paint();
        mCirclePaint.setAntiAlias(true);
        mCirclePaint.setColor(getResources().getColor(android.R.color.holo_blue_bright));


        mArcRectF = new RectF(
                (float) (length * 0.1),
                (float) (length * 0.1),
                (float) (length * 0.9),
                (float) (length * 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) (length * 0.1));
        mArcPaint.setStyle(Paint.Style.STROKE);



        mTextPaint = new Paint();
        mTextPaint.setTextSize(mArcScaleMapTitleTextSize);
        mTextPaint.setColor(mArcScaleMapTitleTextColor);
        mTextPaint.setTextAlign(Paint.Align.CENTER);

        this.invalidate();
    }



}

猜你喜欢

转载自blog.csdn.net/weixin_42400401/article/details/80595836
今日推荐