自定义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改图片有啥区别?