关于自定义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);
    }
}
posted @ 2020-03-01 17:50  甜树果子二号  阅读(178)  评论(0编辑  收藏  举报