3.Android 优化布局(解决TextView布局)
转载:http://www.jianshu.com/p/d3027acf475a
今天分享一个Layout布局中的一个小技巧,希望看过之后你也可以写出性能更好的布局,我个人的目的是用最少的view写出一样的效果布局
用TextView同时显示图片和文字:
先看一下效果图
以上这四块区域相信大家在项目中经常遇到吧!(一般的写法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布局)的更多相关文章
- Android绘制优化(二)布局优化
前言 我们知道一个界面的测量和绘制是通过递归来完成的,减少布局的层数就会减少测量和绘制的时间,从而性能就会得到提升.当然这只是布局优化的一方面,那么如何来进行布局的分析和优化呢?本篇文章会给你一个满意 ...
- Android UI学习 - FrameLayou和布局优化(viewstub)
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://android.blog.51cto.com/268543/308090 Fram ...
- Android性能优化之中的一个 布局优化
本文为Android性能优化--布局优化,主要介绍使用抽象布局标签(include, viewstub, merge).去除不必要的嵌套和View节点.降低不必要的infalte及其它Layout方面 ...
- Android实习生 —— 屏幕适配及布局优化
为什么要进行屏幕适配.对哪些设备进行适配?在近几年的发展当中,安卓设备数量逐渐增长,由于安卓设备的开放性,导致安卓设备的屏幕尺寸大小碎片化极为严重.从[友盟+]2016年手机生态发展报告H1中看截止1 ...
- Android——四大组件、六大布局、五大存储
一.android四大组件 (一)android四大组件详解 Android四大组件分别为activity.service.content provider.broadcast receiver. 1 ...
- Android之控件与布局,结构知识点,基础完结
版权声明:未经博主允许不得转载 在Android中我们常常用到很多UI控件,如TextView,EditText,ImageView,Button,ImageButton,ToggleButton,C ...
- Android学习系列(5)--App布局初探之简单模型
人类科技的进步源自探索,探索来自于发现本原,当然App布局没这么先进,本文也只是一个归类总结.这篇文章是Android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用. Androi ...
- Android 自定义View及其在布局文件中的使用示例(三):结合Android 4.4.2_r1源码分析onMeasure过程
转载请注明出处 http://www.cnblogs.com/crashmaker/p/3549365.html From crash_coder linguowu linguowu0622@gami ...
- Android 自定义View及其在布局文件中的使用示例(二)
转载请注明出处 http://www.cnblogs.com/crashmaker/p/3530213.html From crash_coder linguowu linguowu0622@gami ...
随机推荐
- mui禁止滚动条和禁止滚动
mui.plusReady(function () { plus.webview.currentWebview().setStyle({ scrollIndicator: 'none' }); }); ...
- 移动开发webapp开发常用meta设置手机浏览器全屏模式
1.WebApp全屏模式: <meta name="viewport" content="width=device-width,initial-scale=1.0, ...
- php常用函数(不定时更新)
一,数据操作类 1,天花板函数(ceil)和地板函数(floor) 这两个函数是对数据进行向上取整和向下取整的操作的,比如说 echo ceil("3.01"); //这里输出的是 ...
- 【C#】【MySQL】C#获取存储过程的Output输出参数值
创建存储过程 Create PROCEDURE MYSQL @a int, @b int, @c int output AS Set @c = @a + @b GO 通过以下方法可以获得储存过程的输出 ...
- Camera.Parameters 参数
public class Camera.Parameters extends Object java.lang.Object ↳ android.hardware.Camera.Paramete ...
- JS添加DOM元素CSS权重BUG
修改删除table的时候,比如拆分合并单元格,合并全部TR中的某个TD后在拆分还原,即使直接在td标签中设置了td的高宽属性,当td在css文件中设置为宽度auto的时候,不能显示出TD来,显示TD宽 ...
- Apache POI 实现对 Excel 文件读写
1. Apache POI 简介 Apache POI是Apache软件基金会的开放源码函式库. 提供API给Java应用程序对Microsoft Office格式档案读和写的功能. 老外起名字总是很 ...
- 使用 data-* 属性来嵌入自定义数据
1. HTML 实例 <ul> <li data-animal-type="bird">Owl</li> <li data-animal- ...
- iptables规则组成
一.四张表五条链 组成部分:四张表 + 5条链(Hook point) + 规则 四张表:filter nat mangle raw 五条链:PREROUTING INPUT FORWARD OUTP ...
- 如何禁止IE自动生成链接
今天一位园友反馈,他用的是IE浏览器,在博客后台编辑器中输入下面的URL: http://www.windowsphone.com/zh-cn/store/app/博客园-uap/500f08f0-5 ...