自定义view

1.先自己创建一个类继承view  然后重写方法

这个代码是view当中自定义属性信息

 

public class CustomAttrView  extends View{
    private String text;
    private Paint paint;
//初始化画笔的方法
    private void initpaint(){
        paint = new Paint();
        paint.setColor(Color.RED);
        paint.setAntiAlias(true);
        setPadding(10,10,10,30);
    }
    public CustomAttrView(Context context) {
        super(context);
        initpaint();
    }

    public CustomAttrView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        initpaint();
        /**
         * 自定义属性在布局当中设置 后,需要在代码当中接收到对应的值
         * */
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomAttrView);

//        获取自定义属性在XML文件当中对应的值
        String text = typedArray.getText(R.styleable.CustomAttrView_titleText).toString();
        setText(text);

        int color = typedArray.getColor(R.styleable.CustomAttrView_titleColor, Color.BLACK);
        setColor(color);

        float size = typedArray.getDimension(R.styleable.CustomAttrView_titleSize, 20);
        setTextSize(size);

        typedArray.recycle();
//        清理资源,回收资源,为了避免对于下一次使用造成影响

    }
    /**
     * 设置文字内容
     * */
    public void setText(String text) {
        this.text = text;
        requestLayout();   //重新绘制界面
        invalidate();     //重新加载数据
    }
    /**
     * 设置文字颜色
     * */
    public void setColor(int color){
        paint.setColor(color);
        requestLayout();
        invalidate();
    }

    /**
     * 设置文字的尺寸
     * */
    public void setTextSize(float size){
        paint.setTextSize(size);
        requestLayout();
        invalidate();
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        canvas.drawColor(Color.GRAY);
        canvas.drawText(text,getPaddingLeft(),getPaddingTop()+(paint.descent()-paint.ascent()),paint);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int wSize = setMeasure(widthMeasureSpec, true);
        int hSize = setMeasure(heightMeasureSpec, false);

        setMeasuredDimension(wSize,hSize);
    }

    public int setMeasure(int measureSpec,boolean mode){   //true-->宽度    false-->高度
        int result = 0;
//        获取测量的模式和尺寸
        int modle = MeasureSpec.getMode(measureSpec);
        int size = MeasureSpec.getSize(measureSpec);

        switch (modle) {
            case MeasureSpec.AT_MOST:
                if (mode){
//                    测量宽度
                    result= (int) (getPaddingLeft() + getPaddingRight() + paint.measureText(text));
                }else {
                   result = (int) (getPaddingTop()+getPaddingBottom()+(paint.descent()-paint.ascent()));
                }
                break;
            case MeasureSpec.EXACTLY:
                result = size;
                break;
        }
        return  result;
    }
}

 

 

 

 

 

 

 

 

 

这个代码是自定义绘制图形

 

public class DrawView  extends View{
    public DrawView(Context context) {
        super(context);
    }
    public DrawView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }
    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawColor(Color.BLACK);

        Paint paint = new Paint();
        paint.setColor(Color.RED);
        canvas.drawText("画圆",10,20,paint);
        canvas.drawCircle(60,20,10, paint);   //画圆
        //抗锯齿
        paint.setAntiAlias(true);
//        设置画笔为空心
        paint.setStyle(Paint.Style.STROKE);
//        画线和弧线
        canvas.drawText("画线和弧线",10,60,paint);
        paint.setColor(Color.GREEN);
        canvas.drawLine(60,40,100,40,paint);   //画横线,和宽度水平的
        canvas.drawLine(110,40,190,80,paint);   //画斜线

//        获取圆弧的外切矩形
        RectF oval = new RectF(150,20,180,40);
        canvas.drawArc(oval,180,180,false,paint);

//        重新设置矩形的位置
        oval.set(190,20,220,40);
        canvas.drawArc(oval,180,180,false,paint);

        oval.set(170,30,200,60);
        canvas.drawArc(oval,0,180,false,paint);

//       创建线性 渲染
        Shader shader = new LinearGradient(0,0,100,100,new int[]{Color.RED,Color.GRAY,Color.YELLOW,Color.BLUE},null, Shader.TileMode.REPEAT);

        paint.setShader(shader);
        paint.setStyle(Paint.Style.FILL);
//        绘制扇形
        RectF rectF = new RectF(120, 100, 260, 240);
        canvas.drawArc(rectF,200,150,true,paint);
//        绘制椭圆
        /**
         * 左   ,上    右    下
         * */
        canvas.drawOval(280,100,320,130,paint);
//        画三角形
        Path path = new Path();
        path.moveTo(80,200);     //绘制多边形的方法
        path.lineTo(120,250);
        path.lineTo(80,250);
        path.close();    //是每一个点都变成封闭的集合图形
        canvas.drawPath(path,paint);
//    绘制圆角矩形
        canvas.drawRoundRect(80,290,220,330,20,20,paint);
//        绘制图片到画布上
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
        canvas.drawBitmap(bitmap,250,350,paint);
    }
}
* 1.绘制图片  :drawBitmap    drawPicture
     * 2.绘制颜色:  drawColor     drawARGB
     * 3.绘制基本几何形状  : 	drawPoint,drawLine,drawCircle,drawArc,drawRect,drawOval,drawRoundRect
     * 4.绘制剪切区: clipPath, 	clipRect,clipRegion,drawPath
     * 5.变换Canvas :save,rotate,restore,translate,scale,
     * 6.绘制顶点数据:drawVertices, 	drawBitmapMesh
canvas.drawRect(50,50,100,100,paint);  //绘制矩形

 

 

 

 

 

 

 

 

 

 

 

2.自定义属性        在values理创建attrs

 

 

 

 

3.在attrs.xml里面写属性

 

<?xml version="1.0" encoding="utf-8"?>
<resources>
    //自定义属性的类型:
    format  可以用|来同时使用
    1、reference   参考某一资源Id
    2、color          颜色值
    3、boolean     布尔值
    4、dimension 尺寸值(带有单位的 sp/dp)
    5、float           浮点型
    6、intager 整形
    7、string 字符串
    8、fraction       百分比
    9、enum 枚举
    10、flag 位或运算
    <declare-styleable name="zdy">
        <attr name="text" format="string"></attr>
        <attr name="color" format="color|reference"></attr>
        <attr name="size" format="dimension"></attr>
    </declare-styleable>
</resources>

 

 

 

 

 

 

 

4.然后在布局理调用

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值