3.Android 最佳化布局(解決TextView布局)

來源:互聯網
上載者:User

標籤: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布局)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.