android之自定义view、添加自定义属性

-----自定义View的步骤---:

1.写一个类继承View;在类中实现各种方法

2.在xml布局中使用自定义的控件,必须要写全路径,并且使用属性时需要申明命名空间;

3.在res/values下创建atts.xml--声明给那个view添加自定义属性,

4.实现这个构造方法,在这里面吧属性解析出来:

 public AutodefineButton(Context context, @Nullable AttributeSet attrs)
public class AutodefineButton extends View {
    /*
    * 作为背景的图片
    * */
    private Bitmap backgroundBitmap;
    /*
    * 可以滑动的图片
    * */
    private Bitmap slideBtn;
    /*
    * 画笔
    * */
    private Paint paint;

    //在代码里创建对象的时候调用此方法
    public AutodefineButton(Context context) {
        super(context);
    }

    /*在布局中申明的view,自动调用此方法-----必须有此方法否则会报错
    *
    *attrs----对xml解析后的属性集合
    * */
    public AutodefineButton(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        /*TypedArray是对AttributeSet中的原始数据安照图纸中(R.styleable.AutodefineButton实际上就是图纸)的申明类型创建出具体的对象
        *
        * */
        TypedArray ta=context.obtainStyledAttributes(attrs,R.styleable.AutodefineButton);
        int taCount=ta.getIndexCount();//获得被加工过的对象的个数;----被使用的对象个数
for(int i=0;i<taCount;i++){
int index=ta.getIndex(i);//属性的id
    switch (index){
        case AutodefineButton.test_msg:
String msg=ta.getString(index);//根据id的值取出属性值
            break;
    }


}
        initview();
    }

    public AutodefineButton(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    //初始化图片
    private void initview() {

        backgroundBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.abc_btn_default_mtrl_shape);
//初始化画笔
        paint = new Paint();
        paint.setAntiAlias(true);//打开抗锯齿

        //添加事件点击的监听----------如果是有拖动手势的时候,需要禁止点击事件的发生(可以点击了,但是里面不执行相关操作)
        setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {

            }
        });
    }
/*view显示在屏幕上的几个步骤
1.构造方法创建对象
*2.测量view的大小,onMeasure(int,int)
*3.确定view的位置,view自身有一定的建议权,决定权在父vew中,onlayout()
* 4.绘制view的内容,onDraw(canvas);
*
* */

/*
* 测量尺寸的回调方法
* */

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
/*设置当前view的大小
* */
setMeasuredDimension(backgroundBitmap.getWidth(),backgroundBitmap.getHeight());

    }

/* 设置view的位置
*
* */

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
    }

    /*
    * 绘制图片
    * */

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        /*绘制背景
        *backgroundBitmap--要绘制的图片
        * 左边界,
        * 右边界
        * 画笔
        * */
        canvas.drawBitmap(backgroundBitmap,0,0,paint);
        //绘制按钮
        canvas.drawBitmap(slideBtn,0,0,paint);
    }

    //手势

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN://按下

            break;
            case MotionEvent.ACTION_MOVE://移动

                break;
            case MotionEvent.ACTION_UP://抬起

                break;
            default:break;
        }
        invalidate();//这句话是刷新,会调用onDraw() 方法
        return true;
    }

}



在xml中引用自定义的autodefineBtn:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    <!--这里要使用自己定义的属性,就要配置这个命名可能概念,res后面的是包名-->
    xmlns:lambo="http://schemas.android.com/apk/res/com.example.lambo.first"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    >
    <!--这里的AutodefineButton是自定义的,要写全路径-->
<com.example.lambo.first.AutodefineButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    <!--这是自定义的属性-->
    lambo:test_msg="自定义的测试"
    />
</LinearLayout>


------------在res/values下创建atts.xml--声明给那个view添加自定义属性---------------

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!--AutodefineButton是给哪一个view添加属性-->
    <declare-styleable name="AutodefineButton">
        <!--申明属性test_id,类型是integer-->
        <attr name="test_id" format="integer"/>
        <!--申明属性test_msg,类型是string-->
        <attr name="test_msg" format="string"/>
        <!--申明属性test_msg,类型是reference(引用类型)-->
        <attr name="test_bitmap" format="reference"/>
    </declare-styleable>
</resources>







展开阅读全文

没有更多推荐了,返回首页