1. 程式人生 > >android之自定義view、新增自定義屬性

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>