1. 程式人生 > >自定義控制元件讓TextView、Button的drawableLeft和drawableRight與文字一起居中顯示

自定義控制元件讓TextView、Button的drawableLeft和drawableRight與文字一起居中顯示

TextView的drawableLeft、drawableRight和drawableTop是一個常用、好用的屬性,可以在文字的上下左右放置一個圖片,而不使用更加複雜佈局就能達到,我也常常喜歡用RadioButton的這幾個屬性實現很多效果,但是苦於不支援讓drawbleLeft與文字一起居中,設定gravity為center也無濟於事,終於有空研究了一下,這裡與大家一起分享。

佈局XML

<com.assistant.expand.customview.DrawableCenterButton
                        android:gravity="left|center_vertical"
                        android:drawableLeft="@drawable/icon_erweima"
                        android:drawablePadding="5dp"
                android:id="@+id/btn_scale"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:background="@android:color/transparent"
                android:singleLine="true"
                android:text="掃描二維碼簽到"
                android:textColor="@color/color_button2"
                android:textSize="17sp" />


/**
 * drawableLeft與文字一起居中顯示
 * 
 * 
 */
public class DrawableCenterTextView extends TextView {

    public DrawableCenterTextView(Context context, AttributeSet attrs,
            int defStyle) {
        super(context, attrs, defStyle);
    }

    public DrawableCenterTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public DrawableCenterTextView(Context context) {
        super(context);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        Drawable[] drawables = getCompoundDrawables();
        if (drawables != null) {
            Drawable drawableLeft = drawables[0];
            if (drawableLeft != null) {
                float textWidth = getPaint().measureText(getText().toString());
                int drawablePadding = getCompoundDrawablePadding();
                int drawableWidth = 0;
                drawableWidth = drawableLeft.getIntrinsicWidth();
                float bodyWidth = textWidth + drawableWidth + drawablePadding;
                canvas.translate((getWidth() - bodyWidth) / 2, 0);
            }
        }
        super.onDraw(canvas);
    }
}

下面是用Button的Right 例子

/**
 * drawableRight與文字一起居中顯示
 * 
 * 
 */
public class DrawableCenterButton extends Button {

	public DrawableCenterButton(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
	}

	public DrawableCenterButton(Context context, AttributeSet attrs,
	int defStyle) {
		super(context, attrs, defStyle);
	}

	public DrawableCenterButton(Context context, AttributeSet attrs) {
		super(context, attrs);
	}


	@Override
	protected void onDraw(Canvas canvas) {
		Drawable[] drawables = getCompoundDrawables();
		if (drawables != null) {
			Drawable drawableLeft = drawables[2];
				if (drawableLeft != null) {
			
				float textWidth = getPaint().measureText(getText().toString());
				int drawablePadding = getCompoundDrawablePadding();
				int drawableWidth = 0;
				drawableWidth = drawableLeft.getIntrinsicWidth();
				float bodyWidth = textWidth + drawableWidth + drawablePadding;
				setPadding(0, 0, (int)(getWidth() - bodyWidth), 0);
				canvas.translate((getWidth() - bodyWidth) / 2, 0);
			}
		}
		super.onDraw(canvas);
	}
}




相關推薦

定義控制元件TextViewButton的drawableLeftdrawableRight文字一起居中顯示

TextView的drawableLeft、drawableRight和drawableTop是一個常用、好用的屬性,可以在文字的上下左右放置一個圖片,而不使用更加複雜佈局就能達到,我也常常喜歡用Ra

定義控制元件TextView(Radiobutton)Button的drawableLeftdrawableRight文字一起居中顯示

TextView的drawableLeft、drawableRight和drawableTop是一個常用、好用的屬性,可以在文字的上下左右放置一個圖片,而不使用更加複雜佈局就能達到,我也常常喜歡用RadioButton的這幾個屬性實現很多效果,但是苦於不支援讓drawbl

定義控制元件TextView的drawableLeft文字一起居中顯示

Drawable[] drawables = getCompoundDrawables();          if  (drawables != 

定義控制元件--背景顏色隨ViewPager的滑動而漸變

轉載請註明出處,謝謝~ 今天要說一個簡單但不好想的效果實現。程式碼絕對簡單,實現絕對easy,就是你可能想不到而已。 不多說,上效果圖。第一個效果是仿最美應用的滑動顏色變化,第二個是我專案中要用的效果,實現後我就貼出來了,開源嘛。               下面分別說說

定義控制元件EditText的drawableLeft文字一起居中顯示

如上圖  專案中要求的顯示效果是serch圖片和EditText的文字一起在中間位置。 嘗試設定了很多EditText均不能實現滿意的效果,其中: android:drawableLeft="" android:drawableRight=""設定的位置均在兩邊,不能滿足

[WPF定義控制元件庫]排序篩選以及高亮

1. 如何讓列表的內容更容易查詢 假設有這麼一個列表(資料來源在本地),由於內容太多,要查詢到其中某個想要的資料會比較困難。要優化這個列表,無非就是排序、篩選和高亮。 改造過的結果如上。 2. 排序 在WPF中要實現資料排序的功能有很多種,例如用Linq,但這種場景的標準做法是使用Collection

TextView的drawableLeft文字一起居中顯示(以及程式碼設定drawableLeft)

網上一搜全是自定義控制元件,其實去看看TextView的屬性,就能發現,解決這個問題,直接xml檔案中就能搞定,程式碼如下: <!-- 不明白的屬性請自行查閱資料--> <TextView android:id="@+id/tv_finish"

.net定義控制元件ControlWebControlCompositeControl

一、呈現方法 1、Control主要有以下4個方法用於呈現 1 //該方法為入口方法 2 public virtual void RenderControl (HtmlTextWriter writer) 3 { 4 this.RenderControl(write

你的app提升一個檔次-Android酷炫定義控制元件

這是我近期整理的比較酷炫並且我們會經常用到的custom view,也有一些不是custom view,但是也是android UI相關的,實現了酷炫UI效果的開源庫,合理利用這些開源庫,可以讓你的app提升一個檔次!總結的專案最後維護時間一般不會超過6個月,會持續更新。部落格可能不能實

winfrom載入定義控制元件視窗pannel後閃爍問題

我用一個panel當容器,裡面有好多控制元件,載入的時候一直閃爍。 借鑑網友的思路: 視窗初始化介面加入程式碼 this.DoubleBuffered = true;//設定本窗體 SetStyle(ControlStyles.UserPaint, true); SetStyle(ControlStyle

【轉】WPF定義控制元件樣式(3)-TextBox & RichTextBox & PasswordBox樣式水印Label標籤功能擴充套件

一.前言.預覽   申明:WPF自定義控制元件與樣式是一個系列文章,前後是有些關聯的,但大多是按照由簡到繁的順序逐步釋出的等。 本文主要是對文字輸入控制元件進行樣式開發,及相關擴充套件功能開發,主要內容包括: 基本文字框TextBox控制元件樣式及擴充套件功能,實現了樣式、水印、Label標籤、功

C#中的定義控制元件中的屬性事件及一些相關特性的總結

今天學習了下C#使用者控制元件開發新增自定義屬性的事件,主要參考了MSDN,總結並實驗了一些用於開發自定義屬性和事件的特性(Attribute)。 在這裡先說一下我的環境: 作業系統:Windows7旗艦版(Service Pack 1) VS版本:Microsoft

ASP.NET MVC 重點教程一週年版 第十一回 母版頁使用者定義控制元件及檔案上傳

母版頁(Master) 1.母版頁是與Controller無關的,母版頁只是一個View檔案,而沒有任何Controller與之相對應。 2.其實在ASP.NET MVC中View的aspx與母版頁並不像WebForm中那樣緊密關聯。 例如我想更換一個aspx的母版頁,只要在Action中return

定義控制元件(14)---ViewGroup繪製的Paddingmargin注意

ViewGroup測量子元素有關,其中measureChildWithMargins和measureChildren類似只是加入了對Margins外邊距的處理,ViewGroup提供對子元素測量的方法從measureChildren開始: measureChildren的邏

Android定義控制元件 -- 帶邊框的TextView

使用xml實現邊框 原來使用帶邊框的TextView時一般都是用XML定義來完成,在drawable目錄中定義如下所示的xml檔案: <?xml version="1.0" encoding="utf-8"?> <selector xm

定義控制元件三部曲之繪圖篇(六)——Path之貝賽爾曲線手勢軌跡水波紋效果

前言:好想義無反顧地追逐夢想從這篇開始,我將延續androidGraphics系列文章把圖片相關的知識給大家講完,這一篇先稍微進階一下,給大家把《android Graphics(二):路徑及文字》略去的quadTo(二階貝塞爾)函式,給大家補充一下。 本篇最終將以兩個例子給

C#中定義控制元件隱藏基類成員(屬性方法事件)的方法

       編寫自定義控制元件時,總是繼承C#中提供的Control類,而Control類是C#中所有窗體控制元件的基類,裡面定義了大量的屬性、方法和事件,而很多基類成員在自定義控制元件中可能不需要,因為編寫者會希望在自定義控制元件中隱藏這些成員,避免使用者呼叫這些成員。

SwipeToLoadLayout佈局中新增定義控制元件仿美團餓了嗎等下拉效果

  SwipeToLoadLayout是一個可重用的下拉重新整理和上拉載入控制元件,理論上支援各種View和ViewGroup(ListView,ScrollView,RecyclerView,GridView,WebView,Linearlayout,Rela

定義控制元件三部曲之動畫篇(一)——alphascaletranslaterotateset的xml屬性及用法

前言:這幾天做客戶回訪,感觸很大,使用者只要是留反饋資訊,總是一種恨鐵不成鋼的心態,想用你的app,卻是因為你的技術問題,讓他們不得不放棄,而你一個回訪電話卻讓他們盡釋前嫌,當最後把手機號留給他們以便隨時溝通的時候,總會發來一條條的鼓勵簡訊,讓我不自主的開始內疚。哎,多麼可愛

Qt定義控制元件的建立初步使用(二)之圖片上繪製文字箭頭曲線

本文目的:編輯自定義控制元件的介面ui,並在圖片上添文字、箭頭、曲線、開啟、儲存等功能。並說明了如何去使用這個編輯好的ui介面控制元件! 上次簡單的說明了如何去建立Qt自定義控制元件,當時還是對其瞭解不夠深刻,現在看來,QT自定義控制元件就是你事先把介面寫好(一般基於QWi