android之自定義view、新增自定義屬性
阿新 • • 發佈:2019-02-06
-----自定義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>