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 ...
随机推荐
- webpack常用加载器和插件
css文件加载器: style-loader,css-loader,sass-loader,less-loader //style和css加载器必须放在一起使用,且style必须放前面(style!c ...
- HTML 学习笔记 CSS(选择器3)
CSS 属性选择器 属性选择器可以根据元素的额属性以及属性值来选择元素 例子1 如果 你希望把包含title的所有元素变成红色 *[title] {color:red} 例子2 与上面类似 可以只对有 ...
- 编译php-5.6出错,xml2-config not found
今天在centos上编译PHP-5.6 cd php-5.6 ./configure --prefix=/usr/local/php5./ --with-apxs2=/usr/local/apache ...
- checkbox与jq<转>2
jQuery中attr()解决checked属性问题 作者:u012885111 这两天在做一个表单提交,其中就包含有checkbox的全选和反选,这是最先开始做出来的版本,代码如下: <inp ...
- PAT 1028. 人口普查(20)
某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人. 这里确保每个输入的日期都是合法的,但不一定是合理的--假设已知镇上没有超过200岁的老人,而今天是2014年9月 ...
- C#事件快捷设置
注解:本文摘自网络 C# 自定义带自定义参数的事件方法 C# 自定义带自定义参数的事件 需要经过以下几个步骤: 1.自定义事件参数 :要实现自定义参数的事件,首先要自定义事件参数.该参数是个类.继承自 ...
- php加载xml编码错误,“Error: Input is not proper UTF-8, indicate encoding! ”
最近在给php中解析xml的时候,抛出一个错误: "Warning: DOMDocument::load(): Input is not proper UTF-8, indicate enc ...
- C#将JSON字符串对象序列化与反序列化
C#将对象序列化成JSON字符串 public string GetJsonString() { List<Product> products = new List<Product& ...
- ViewModelLocator
ViewModelLocator 这里先鼓舞下士气,ViewModelLocator很简单,甚至可以去掉,它不是Mvvm必须的.在初学Mvvm时,一般都是使用NuGet安装 MvvmLight框架,总 ...
- RelayCommand
RelayCommand Mvvm最大的特点就是分离了View和ViewModel,将数据的显示和业务逻辑分开.使用WPF的Binding,我们不仅能够 将数据从ViewModel绑定到View,同时 ...