標籤:super style att ima validate display vertica null 文字
轉載:http://www.jianshu.com/p/d3027acf475a今天分享一個Layout布局中的一個小技巧,希望看過之後你也可以寫出效能更好的布局,我個人的目的是用最少的view寫出一樣的效果布局用TextView同時顯示圖片和文字:
先看一下
映像 3.png以上這四塊地區相信大家在項目中經常遇到吧!(一般的寫法ImageView與TextView的組合)現在用一個自訂的TextView就完成能達到一樣的效果,並且也可以設定背景選取器、圖片的尺寸大小,不需要嵌套多層布局在設定相關的屬性第一塊Xml中的代碼
<com.~~~~~~.TextDrawable android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/textdrawable" android:clickable="true" android:drawablePadding="10dp" android:gravity="center_vertical" android:padding="@dimen/space_20" android:text="設定" android:textColor="@color/black_252c3d" android:textSize="@dimen/textsize_20sp_in_normal" app:leftDrawable="@drawable/tab_more_unselect" app:leftDrawableHeight="@dimen/space_60" app:leftDrawableWidth="@dimen/space_60" app:rightDrawable="@drawable/iconfont_youjiantou" app:rightDrawableHeight="20dp" app:rightDrawableWidth="10dp" /> <Space android:layout_width="match_parent" android:layout_height="0.5dp" android:background="@color/gray_888888" />
下面的分割線我建議用Space這個控制項,它是一個非常輕量級的控制項第二塊Xml中的代碼
<com.~~~~~~.TextDrawable android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/textdrawable" android:clickable="true" android:drawablePadding="10dp" android:gravity="center_vertical" android:padding="@dimen/space_20" android:text="訊息" android:textColor="@color/black_252c3d" android:textSize="@dimen/textsize_20sp_in_normal" app:leftDrawable="@drawable/tab_speech_unselect" app:leftDrawableHeight="@dimen/space_60" app:leftDrawableWidth="@dimen/space_60" />
第三塊Xml中的代碼
<com.~~~~~~.TextDrawable android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:background="@drawable/textdrawable" android:clickable="true" android:drawablePadding="10dp" android:gravity="center" android:padding="@dimen/space_20" android:text="首頁" android:textColor="@color/colorPrimary" android:textSize="@dimen/textsize_20sp_in_normal" app:topDrawable="@drawable/tab_home_select" app:topDrawableHeight="@dimen/space_60" app:topDrawableWidth="@dimen/space_60" />
第四塊Xml中的代碼(圖片按鈕)
<com.hightsstudent.highsstudent.ui.widget.TextDrawable android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/textdrawable" android:clickable="true" android:drawablePadding="10dp" android:gravity="center_vertical" android:padding="@dimen/space_15" android:text="退出" android:textColor="@color/black_252c3d" android:textSize="@dimen/textsize_20sp_in_normal" app:rightDrawable="@drawable/icon_backs" app:rightDrawableHeight="@dimen/space_80" app:rightDrawableWidth="@dimen/space_80" />
下面貼出TextDrawable.java代碼
/** * Created by Dengxiao on 2016/11/8. */public class TextDrawable extends TextView { private Drawable drawableLeft; private Drawable drawableRight; private Drawable drawableTop; private int leftWidth; private int rightWidth; private int topWidth; private int leftHeight; private int rightHeight; private int topHeight; private Context mContext; public TextDrawable(Context context) { this.mContext=context; this(context, null, 0); } public TextDrawable(Context context, AttributeSet attrs) { this.mContext=context; this(context, attrs, 0); } public TextDrawable(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); this.mContext=context; init(context, attrs); } private void init(Context context, AttributeSet attrs) { TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.TextDrawable); drawableLeft = typedArray.getDrawable(R.styleable.TextDrawable_leftDrawable); drawableRight = typedArray.getDrawable(R.styleable.TextDrawable_rightDrawable); drawableTop = typedArray.getDrawable(R.styleable.TextDrawable_topDrawable); if (drawableLeft != null) { leftWidth = typedArray.getDimensionPixelOffset(R.styleable.TextDrawable_leftDrawableWidth, dip2px(context, 20)); leftHeight = typedArray.getDimensionPixelOffset(R.styleable.TextDrawable_leftDrawableHeight, dip2px(context, 20)); } if (drawableRight != null) { rightWidth = typedArray.getDimensionPixelOffset(R.styleable.TextDrawable_rightDrawableWidth, dip2px(context, 20)); rightHeight = typedArray.getDimensionPixelOffset(R.styleable.TextDrawable_rightDrawableHeight, dip2px(context, 20)); } if (drawableTop != null) { topWidth = typedArray.getDimensionPixelOffset(R.styleable.TextDrawable_topDrawableWidth, dip2px(context, 20)); topHeight = typedArray.getDimensionPixelOffset(R.styleable.TextDrawable_topDrawableHeight, dip2px(context, 20)); } }public int dip2px(Context context, float dpValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); if (drawableLeft != null) { drawableLeft.setBounds(0, 0, leftWidth, leftHeight); } if (drawableRight != null) { drawableRight.setBounds(0, 0, rightWidth, rightHeight); } if (drawableTop != null) { drawableTop.setBounds(0, 0, topWidth, topHeight); } } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); this.setCompoundDrawables(drawableLeft, drawableTop, drawableRight, null); } /** * 設定左側圖片並重繪 */ public void setDrawableLeft(Drawable drawableLeft) { this.drawableLeft = drawableLeft; invalidate(); } /** * 設定左側圖片並重繪 */ public void setDrawableLeft(int drawableLeftRes) { this.drawableLeft = mContext.getResources().getDrawable(drawableLeftRes); invalidate(); } /** * 設定右側圖片並重繪 */ public void setDrawableRight(Drawable drawableRight) { this.drawableRight = drawableLeft; invalidate(); } /** * 設定右側圖片並重繪 */ public void setDrawableRight(int drawableRightRes) { this.drawableRight = mContext.getResources().getDrawable(drawableRightRes); invalidate(); } /** * 設定上部圖片並重繪 */ public void setDrawable(Drawable drawableTop) { this.drawableTop = drawableTop; invalidate(); } /** * 設定右側圖片並重繪 */ public void setDrawableTop(int drawableTopRes) { this.drawableTop = mContext.getResources().getDrawable(drawableTopRes); invalidate(); }}
附上attrs:
<declare-styleable name="TextDrawable"> <attr name="leftDrawable" format="reference"/> <attr name="leftDrawableWidth" format="dimension"/> <attr name="leftDrawableHeight" format="dimension"/> <attr name="rightDrawable" format="reference"/> <attr name="rightDrawableWidth" format="dimension"/> <attr name="rightDrawableHeight" format="dimension"/> <attr name="topDrawable" format="reference"/> <attr name="topDrawableWidth" format="dimension"/> <attr name="topDrawableHeight" format="dimension"/> </declare-styleable>
以上為全部代碼
3.Android 最佳化布局(解決TextView布局)