转载:http://www.jianshu.com/p/d3027acf475a

今天分享一个Layout布局中的一个小技巧,希望看过之后你也可以写出性能更好的布局,我个人的目的是用最少的view写出一样的效果布局

用TextView同时显示图片和文字:

先看一下效果图

图像 3.png

以上这四块区域相信大家在项目中经常遇到吧!(一般的写法ImageView与TextView的组合)现在用一个自定义的TextView就完成能达到一样的效果,并且也可以设置背景选择器、图片的尺寸大小,不需要嵌套多层布局在设置相关的属性

第一块Xml中的代码

    <com.~~~~~~.TextDrawableandroid: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.~~~~~~.TextDrawableandroid: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.~~~~~~.TextDrawableandroid: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.TextDrawableandroid: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>

以上为全部代码

转载于:https://www.cnblogs.com/benchao/p/6056157.html

3.Android 优化布局(解决TextView布局)相关推荐

  1. android clickablespan listview,解决TextView中ClickableSpan点击事件

    需求背景: 在TextView中包含局部可点击的链接,且改链接其他地方也是有相应的点击事件 其实需求比较合理,实现也应该不难,于是简单的demo如下: TextView content = (Text ...

  2. Android 系统性能优化(24)--布局优化

    前言 我们知道一个界面的测量和绘制是通过递归来完成的,减少布局的层数就会减少测量和绘制的时间,从而性能就会得到提升.当然这只是布局优化的一方面,那么如何来进行布局的分析和优化呢?本篇文章会给你一个满意 ...

  3. Android 性能优化---(7)布局优化

    Android性能优化:布局优化 详细解析 前言 在 Android开发中,性能优化策略十分重要 本文主要讲解性能优化中的布局优化,希望你们会喜欢. 目录 1. 影响的性能 布局性能的好坏 主要影响 ...

  4. Android绘制优化(二)布局优化

    相关文章 Android绘制优化(一)绘制性能分析 前言 我们知道一个界面的测量和绘制是通过递归来完成的,减少布局的层数就会减少测量和绘制的时间,从而性能就会得到提升.当然这只是布局优化的一方面,那么 ...

  5. Android 性能优化(三)布局优化 秒变大神

    Android 性能优化 (一)APK高效瘦身 http://blog.csdn.net/whb20081815/article/details/70140063 Android 性能优化 (二)数据 ...

  6. Android——四大组件、六大布局、五大存储

    一.android四大组件 (一)android四大组件详解 Android四大组件分别为activity.service.content provider.broadcast receiver. 1 ...

  7. Android UI控件和布局

    说明: 本文是郭霖<第一行代码-第3版>的读书笔记 4.1 如何编写程序界面 编写XML,这是传统的方法 ConstraintLayout,Google推出的新方法,可以在可视化编辑器中拖 ...

  8. Android系统基础与常用布局

    Android学习笔记 一.Android系统简介 1.1 体系架构 采用了分层的架构,如下图 1.1.2 Linux内核 ​ Android 平台的基础是 Linux 内核.例如,Android R ...

  9. Android中使用ViewStub提高布局性能

    2019独角兽企业重金招聘Python工程师标准>>> 注,关于Stub的解释:在Java中,桩(stub)是指用来代替关联代码或者未实现代码的代码. ViewStub使用场景 如上 ...

最新文章

  1. Python:使用ctypes库调用外部DLL 数据类型对应
  2. 操作电脑小心“伤”手
  3. Objective-C学习笔记-使用NSString与NSData读写文件
  4. jenkins部署java项目之小白的笔记
  5. 『飞秋』Html.Label的缺陷及补救办法
  6. C#图解教程 第十三章 委托
  7. 高斯混合模型学习笔记
  8. 米尔电子zynq ultrascale+ mpsoc底板外设资源清单分享
  9. AcWing 4244. 牛的比赛(双向建图BFS)
  10. wpf webbrowser获取选中文本_网页文本高亮插件 web-marker
  11. 电容器原理和计算公式及电容单位换算
  12. 惯量比多少合适_惯量比计算公式
  13. 手把手教你用Python打造一个语音合成系统(已生成软件)
  14. 初学者入门吉他应该怎么选?卡马D1C/A1C和 VEAZEN费森CLR300哪款更适合?
  15. 博雅互动(静态网页)分享
  16. 一看就会!Matplotlib图像基础
  17. MSRA提出通用文档预训练模型LayoutLM,通往文档智能之路!
  18. Windows11原版镜像
  19. 战场环境分析效能评估系统
  20. Java:多态乃幸福本源

热门文章

  1. Autoencoder 详解
  2. 【问链财经-区块链基础知识系列】 第二十七课 区块链与分布式账本的异同
  3. 计算机桌面颜色如何设置标准,电脑调整桌面颜色设置_电脑桌面颜色设置
  4. php分页功能乱码了怎么办,51、PHP文件内容分页操作,避免乱码
  5. JZOJ 100026. 【NOIP2017提高A组模拟7.7】图
  6. python图画制作_用Python把照片制作成素描图片
  7. nginx 配置静态文件目录_nginx配置静态资源服务器
  8. eslint 配置_前端代码规范配置 (一)
  9. 欧几里得空间——正交矩阵
  10. python写一个表白程序_用Python写一个能算出自己年龄的小程序