【安卓筆記】帶自訂屬性的view控制項

來源:互聯網
上載者:User

標籤:android   style   blog   http   color   java   使用   os   

開發中經常需要自訂view控制項或者群組控制項,某些控制項可能需要一些額外的配置。比如自訂一個標題列,你可能需要根據不同尺寸的手機定製不同長度的標題列,或者更常見的你需要配置標題列的背景,這時候,你就會考慮到你寫的view的擴充性問題,通常情況下,我們可以為這個自訂的標題列加上一些setXXX方法,供外界調用,設定其顏色、長度等屬性。但是我們都知道,在使用系統控制項時,我們大多數情況下並不需要在代碼中配置控制項,而僅僅只需在布局檔案中對控制項寬、高、顏色等進行配置,這樣做的好處就 將UI與商務邏輯解耦,使代碼更加清晰。自訂帶屬性的view控制項在實現上非常簡單,下面介紹步驟:

1.編寫attrs屬性檔案。android在預設情況下並沒有attrs.xml,我們需要手動在values目錄下建立一個這樣的檔案。檔案根結點是resources,子節點叫declare-styleable,比如下面就是一個attrs檔案:

<?xml version="1.0" encoding="utf-8"?><resources>    <declare-styleable name="myview">        <attr name="radius" format="integer"></attr>        <attr name="color" format="color"></attr>    </declare-styleable></resources>

這個屬性檔案提供了一個叫myview的屬性集,裡面有兩個屬性,一個是integer類型的radius(半徑),另一個是color類型的color,這兩個屬性將來在自訂view中要使用。 2.編寫自訂view。這個想必大家都不陌生,我這裡就來一個最簡單的自訂view,畫圓。
package com.example.attributedemo;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Paint.Style;import android.util.AttributeSet;import android.view.View;public class MyView extends View{private Paint mPaint = null;/** * 圓顏色 */private int mColor;/** * 圓半徑 */private int mRadius;/** * 預設顏色 */private static final int DEFAULT_COLOR = Color.RED;/** * 預設半徑 */private static final int DEFAULT_RADIUS = 50;public MyView(Context context){super(context);mColor = DEFAULT_COLOR;mRadius = DEFAULT_RADIUS;init();}public MyView(Context context, AttributeSet attrs){super(context, attrs, 0);getConfig(context, attrs);init();}/** * 初始化畫筆 */private void init(){mPaint = new Paint();mPaint.setStrokeWidth(1);mPaint.setStyle(Style.FILL);mPaint.setColor(mColor);}/** * 從xml中擷取配置資訊 */private void getConfig(Context context,AttributeSet attrs){//TypedArray是一個數組容器用於存放屬性值TypedArray ta = context.obtainStyledAttributes(attrs,R.styleable.myview);mRadius = ta.getInt(R.styleable.myview_radius, DEFAULT_RADIUS);mColor = ta.getColor(R.styleable.myview_color, DEFAULT_COLOR);//用完務必回收容器ta.recycle();}@Overrideprotected void onDraw(Canvas canvas){//畫一個圓canvas.drawCircle(mRadius, mRadius, mRadius, mPaint);}}

這裡面的邏輯非常簡單,需要注意的是這個getConfig方法,這個方法內部 通過context和AttributeSet構造了一個TypedArray對象,這是個數組容器,裡面存放的就是自訂屬性和對應的值。該對象向外界暴露了一系列get方法,用於擷取不同類型的屬性值。 TypedArray用完之後務必回收
3.編寫布局檔案,使用上面的自訂的view。
RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:myview="http://schemas.android.com/apk/res/com.example.attributedemo"    android:layout_width="match_parent"    android:layout_height="match_parent" >    <com.example.attributedemo.MyView        android:layout_width="200dp"        android:layout_height="200dp"        myview:radius="40"        myview:color="#bc9300" /></RelativeLayout>

需要注意的是,要想使用自訂屬性,必須先加上命名空間,否則android不認識這些自訂屬性。命名控制項一般規則是  xmlns:[attrs中declare-styleable的name] = "http://schemas.android.com/apk/res/包名", 4.在activity中通過setContentView找到布局。
顯示效果:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.