自定义控件

来源:互联网 发布:mac无损播放器 编辑:程序博客网 时间:2024/06/06 09:55

三种类型

  1. 组合已有的控件
  2. 完全自定义控件
  3. 继承特定的控件(像TextView,ListView)

记录一下完全自定义控件的实现

1.界面绘制流程

  测量             摆放     绘制  measure   ->  layout  ->  draw      |           |          |  onMeasure -> onLayout -> onDraw 重写这些方法, 实现自定义控件  都在onResume()之后执行  View流程  onMeasure() (在这个方法里指定自己的宽高) -> onDraw() (绘制自己的内容)  ViewGroup流程  onMeasure() (指定自己的宽高, 所有子View的宽高)-> onLayout() (摆放所有子View) -> onDraw() (绘制内容)

2.实现

 //在xml中实现自己的属性 首先在value中的attrs.xml文件中建立自己需要用到的属性: 例如: <resources>    <declare-styleable name="myView">        <attr name="myView_background" format="reference" />        <attr name="myView_state" format="boolean" />    </declare-styleable></resources>在布局文件声明:xmls:myView="http://schemas.android.com/apk/res-auto"然后就可以<xx.xx.myView    android:layout_width = ""    android:layout_height = ""    myView:myView_background = "@mipmap/background"    myView:myView_state = "false">这里可以注意下声明的时候xmls:myView="http://schemas.android.com/apk/res/包名"和xmls:myView="http://schemas.android.com/apk/res-auto/包名"的区别
// private Bitmap  mMyViewBackgroundBitmap; private boolean mState; public myView(Context context, AttributeSet attrs) {        super(context, attrs);        init();        String namespace = "http://schemas.android.com/apk/res-auto";        int myViewBackgroundResource = attrs.getAttributeResourceValue(namespace , "myView_background", -1); //获取资源id        mState = attrs.getAttributeBooleanValue(namespace, "myView_state", false);        mMyViewBackgroundBitmap = BitmapFactory.decodeResource(getResources(),myViewBackgroundResource);//将资源转成bitmap类型            }    //测量      @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        setMeasuredDimension(mMyViewBackgroundBitmap .getWidth(), mMyViewBackgroundBitmap .getHeight()); //设置宽度高度    }    //绘制     @Override    protected void onDraw(Canvas canvas) {         Paint paint =new paint();        canvas.drawBitmap(mMyViewBackgroundBitmap ,0,0,paint);}

这里继承view,简单的实现,就没用到布局onlayout

0 0
原创粉丝点击