简单的自定义控件

很炫酷自定义控件的一个网址:https://github.com/Trinea/android-open-project

概念:Android 中组件必须是View的直接子类或间接的子类,其中View有一个ViewGroup的子类,用于定义容器(FrameLayout,LinearLayout,都是ViewGroup的子类)
如果组件中还有子组件,就是从ViewGroup类继承,否则从View类继承,View类相当于控件的上帝,只要自定义控件,要么是View的直接子类,要么就是View的间接子类
View类定义组件相关的通用功能,只要是自定义控件,一定会和View产生关系,所以,View是我们开发者必须要详细理解的类

自定义View的三种形式:
1.扩展式自定义View继承自Android原生特定的View:如TextView,ImageView等,我们通过重写OnDraw等回调方法进行扩展,使其实现我们想要的功能或者形式!
     注意:该方法实现的自定义View控件不需要自己支持wrap_content和padding.(继承的View已经实现了)
2.组合式自定义View继承自ViewGroup的子View(LinearLayout,RelativityLayout,FramLayout...),当某种效果看起来像几种View组合在一起实现的时候,我们就可以用这种方法
     注意:该方法实现自定义View不需要自己处理ViewGroup的测量和布局这两个过程(已经估值好了)
3.完全自定义View继承自View(Android中所有控件的基类),通常实现一些不方便布局的组合方式来达到的,需要静态灬动态的显示一些不规则的控件或图形
     注意:该方法实现的自定义View需要自己支持wrap_content和Padding(完全从无到有,系统是无法确定,必须自己写)

padding:padding(填充)属性定义元素边框与元素内容之间的空间
padding简写属性在一个声明中设置所有内边距属性,设置所有当前或者指定元素内边距属性,该属性可以有1-4个值
当元素的Padding(填充)(内边距)被清除时,所"释放"的区域将会受到元素背景颜色的填充
单独使用填充属性是在一个声明中设置元素的所内边距属性,缩写填充属性也可以使用,一旦改变一个数值,则padding对应的距离都会改变

Demo:
1.首先在布局里定义自定义控件(注意导入包时别导错了)
<com.example.m.MyView
    android :layout_width= "match_parent"
    android :layout_height= "match_parent"
    android :layout_alignParentTop= "true"
    android :layout_alignParentLeft= "true"
   android:layout_alignParentStart="true"/>
2.新建一个MyView的class
自定义View
* 步骤 0.类要继承View控件的基类
*      1.重写构造方法
*      2.重写OnMeasure方法(用来测量View控件,决定控件在手机所占位置的大小)
*      3.重写OnDraw方法(用来绘制控件,决定了控件呈现的样式,参数就是画布,可以直接使用)
*      4.使用自定义控件
3.
public class MyView  extends View{     //自动生成三种构造方法
   //为画笔建立全局对象( ,方便我们使用 )
    private Paint  paint ;

    //1.在代码中添加我们自定义View时,所调用的构造方法
    public MyView(Context context) {
        super(context) ;
        //在构造方法中初始化画笔对象
        paint new Paint() ;
    }

        //2.在布局XML文件中添加我们自定义的控件时,所调用的方法,多了一个参数AttributeSet
    public MyView(Context context AttributeSet attrs) {
        super(context attrs) ;
        //在构造方法里初始化画笔对象
        paint new Paint() ;
    }

    //3.这个方法我们一般用不到,不是系统调用,需要我们显示调用并给defStyleAttr传值,多了一个参数
    //引用Style资源属性参数时,也就是我们可以在style中自定义一个默认的属性样式,然后添加进来
    public MyView(Context context AttributeSet attrs , int defStyleAttr) {
        super(context attrs defStyleAttr) ;
    }


    //测量View控件,决定控件在手机所占位置的大小
    @Override
    protected void  onMeasure( int widthMeasureSpec , int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec heightMeasureSpec) ;
    }

    //设置画笔的属性,在构造方法里进行初始化
    private Paint  NewPaint(){
        //1.0 画笔
        Paint paint =  new Paint() ;
        //设置抗锯齿
        paint.setAntiAlias( true) ;
        //设置画笔的宽度
        paint.setStrokeWidth( 7) ;
        //设置画笔的颜色
        paint.setColor(Color. YELLOW) ;
        //设置画笔的样式   Paint.Style.STROKE:画笔为空心   Paint.Style.FILL_AND_STROKE和Paint.Style.FILL:画笔为实心
        paint.setStyle(Paint.Style. FILL) ;
        //设置画笔绘制的文本字体大小
        paint.setTextSize( 50) ;
        return paint ;
    }

    //绘制了控件,决定了控件呈现的样式,参数就是画布,可以直接使用
    @Override
    protected void  onDraw(Canvas canvas) {
        super.onDraw(canvas) ;
        //2.0 画布
        //绘制一个圆,参数1和2:指定圆心  参数3:指定的半径R  参数4:画笔
     //   canvas.drawCircle(80,80,80,paint);
        //绘制一个文本,参数1:要画的文本  参数2和3:要画的起始坐标   参数4:画笔
    //    canvas.drawText("致远",500,400,paint);
        //绘制直线,参数1和2:开始画直线的坐标   参数3和4:直线结束时的坐标  参数5:画笔
    //    canvas.drawLine(200,200,500,500,paint);

        //绘制路径,首先创建路径对象
        Path path =  new Path() ;
        //移动到一个点
//        path.moveTo(60,60);
//        path.moveTo(120,0);
//        path.moveTo(180,120);

先固定好自己需要的点,然后根据这些点连成直线
        path.moveTo( 250 , 0) ;
        path.moveTo( 200 , 200) ;
        path.moveTo( 0 , 200) ;
        path.moveTo( 150 , 300) ;
        path.moveTo( 100 , 500) ;
        path.moveTo( 250 , 400) ;
        path.moveTo( 400 , 500) ;
        path.moveTo( 350 , 300) ;
        path.moveTo( 500 , 200) ;
        path.moveTo( 300 , 200) ;
        //绘制直线
//        path.lineTo(60,60);
//        path.lineTo(120,0);
//        path.lineTo(180,120);

        path.lineTo( 250 , 0) ;
        path.lineTo( 200 , 200) ;
        path.lineTo( 0 , 200) ;
        path.lineTo( 150 , 300) ;
        path.lineTo( 100 , 500) ;
        path.lineTo( 250 , 400) ;
        path.lineTo( 400 , 500) ;
        path.lineTo( 350 , 300) ;
        path.lineTo( 500 , 200) ;
        path.lineTo( 300 , 200) ;
       //图形闭合     当设置的每个点都连接重合的时候,这个方法就无所谓了
        path.close() ;
        //开始画,参数1:path对象    参数2:画笔
        canvas.drawPath(path , paint) ;
    }

}


运行后的截图


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值