关于自定义View
关于自定义View
自定义View的分类
- 继承View重写onDraw方法
- 继承ViewGroup派生特殊的Layout
- 继承特定的View例如TextView
- 继承特定的ViewGroup例如LinearLayout
自定义View的步骤
- 继承 View 或者 View 的子类
- 在 res/values/attrs.xml 声明属性集合
- 将自定义 View 放到布局文件中,需要完整全类名,命名空间不再是android,xmlns:custom="http://schemas.android.com/apk/res/[自定义 View 所在的包路径]"
- 在 xml 文件中设定指定属性值
- 获取自定义属性,并且为 View 设置必要的事件
- 进行自定义的绘制,实现 onDraw 方法,甚至 onMeasure,onLayout等等
- 覆写 onTouch 等事件相关方法
- 优化自定义的 View,比如为了减低刷新频率可以在 onDraw 中调用四个参数 的 invalidate 方法,因为无参的 invalidate 方法刷新的是整个 View 树,而四个参数的 invalidate 方法刷新的是指定部分的 View。等等。
自定义属性
- 在res/values/attrs.xml文件自定义属性
- 继承View
- 在自定义View中获取属性集合
- 给View添加设置属性
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--定义名字叫MyAttributeView属性集合-->
<declare-styleable name="MyAttributeView">
<!--定义一个名字叫my_name并且类型是string的属性-->
<attr name="my_name" format="string"/>
<attr name="my_age" format="integer"/>
<attr name="my_bg" format="reference|color"/>
</declare-styleable>
</resources>
<!--使用自定义View的时候设置自定义属性-->
<cy.review.customattributes.MyAttributeView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:my_age="100"
app:my_bg="@drawable/jtx"
app:my_name="android0220"/>
public class MyAttributeView extends View {
private int myAge;
private String myName;
private Bitmap myBg;
public MyAttributeView(Context context, AttributeSet attrs) {
super(context, attrs);
//获得属性集合
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.MyAttributeView);
for (int i = 0; i < typedArray.getIndexCount(); i++) {
int index = typedArray.getIndex(i);
switch (index) {
case R.styleable.MyAttributeView_my_age:
myAge = typedArray.getInt(index, 0);
break;
case R.styleable.MyAttributeView_my_name:
myName = typedArray.getString(index);
break;
case R.styleable.MyAttributeView_my_bg:
Drawable drawable = typedArray.getDrawable(index);
BitmapDrawable drawable1 = (BitmapDrawable) drawable;
myBg = drawable1.getBitmap();
break;
}
}
// 记得回收
typedArray.recycle();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint = new Paint();
canvas.drawText(myName + "---" + myAge, 50, 50, paint);
canvas.drawBitmap(myBg, 50, 50, paint);
}
}
菜甜二的学习笔记and总结啊。。。总会遇到挫折,可是还是要保持开阔的心态才能开心的学习啊,坚持吧。