Android学习笔记-----通过继承View实现自定义View

自定义view工作流程

view的绘制流程包括measure,layout和draw。这三步分别代表测量,布局,绘制。这次的方法里我们重写绘制过程。。。。
关于继承view,简单来讲就是先新建一个class extends View,在这里重写onDraw实现图形绘制,再在values里新建一个对应的xml文件,给定组件的各项属性指标。

重写onDraw

这里我搞了位图和简单的绘制图形,大家过过眼就好。

@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        final int paddingLeft = getPaddingLeft();
        final int paddingRight = getPaddingRight();
        final int paddingTop = getPaddingTop();
        final int paddingBottom = getPaddingBottom();
        int width = getWidth() - paddingLeft - paddingRight;
        int height = getHeight() - paddingBottom - paddingTop;
        canvas.drawBitmap(bitmap,width/2+paddingLeft,height/2+paddingTop,mPaint);
        /* int radius = Math.min(width,height)/2;
        canvas.drawCircle(paddingLeft+width/2,paddingTop+height/2,radius,mPaint);*/
    }

以上是在页面中央绘制位图,注释里的内容为绘制圆形

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="pic_button">
        <attr name="image_id" format="reference" />
        <attr name="image_size" format="dimension" />
    </declare-styleable>
</resources>

以上是自定义属性的写法,注意这个xml文件是放在values里的。name就是自定义属性名字,format就是对应属性。

public CircleView(Context context,AttributeSet attrs, int defStyleAttr){
        super(context, attrs, defStyleAttr);
        TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.CircleView);
        mColor = a.getColor(R.styleable.CircleView_circle_color,Color.RED);
        //bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.y_1);
        a.recycle();
        init();
    }

以上是自定义属性发生作用的通道,也很好理解,定义一个TypedArray来获取自定义组件,再通过对应的get方法获得用户输入的数据,在onDraw里使用这数据。这里的注释是位图。。。

    <com.example.diy_view.CircleView
        android:id="@+id/circle_1"
        android:layout_width="match_parent"
        app:circle_color="#692F2F"
        android:layout_height="100dp"/>

在activity_main.xml里可以如上这么应用,app就是我们的自定义属性。。要注意的是别忘了加

xmlns:app="http://schemas.android.com/apk/res-auto"

这个app是自定义前缀,随便写,只要和自定义属性前面的前缀一样就行了。毕竟做绘制工作的是onDraw,我们只要保证数据准确传到onDraw就好了。

通过重写onDraw实现自定义View方法要注意的问题有padding和wrap_parent,后者是因为我们在做自定义View的时候没有容器,所以没有填满容器的说法,解决方法就是设置容器,给个固定值像200dp,而且我们继承view的时候如果没做啥手脚,wrap_parent自动视为match_parent。至于前者是因为padding在这里是默认不生效的,得我们手动设置,所以有了代码中的paddingLeft和paddingTop。

差不多就这些,但有个问题还不大清楚,这种重写和我通过src改图片有啥区别?

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值