3.Android 优化布局(解决TextView布局)

转载: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>

以上为全部代码

时间: 2024-11-05 11:57:06

3.Android 优化布局(解决TextView布局)的相关文章

Android开发技巧——解决TextView加载HTML的一些问题

前几天在做一个Gradle用户指南的应用程序,使用的是TextView来加载HTML内容(至于为什么不用WebView,我也没有认真使用并比较过,也许以后会换吧),其中遇见了一些纠结的问题,所幸主要的问题都一一解决了. 下面说一下遇见的几个问题及我的解决方法. TextView异步加载HTML中的图片及图文重叠 在TextView中加载HTML图片,需要实现Html.ImageGetter接口,然后在public Drawable getDrawable(String source)中去获取图片

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

相关文章 Android绘制优化(一)绘制性能分析 前言 我们知道一个界面的测量和绘制是通过递归来完成的,减少布局的层数就会减少测量和绘制的时间,从而性能就会得到提升.当然这只是布局优化的一方面,那么如何来进行布局的分析和优化呢?本篇文章会给你一个满意的答案. 1.布局优化工具 在讲到如何去布局优化前,我们先来学习两种布局优化的工具. Hierarchy Viewer Hierarchy Viewer是Android SDK自带的可视化的调试工具,用来检查布局嵌套和绘制的时间.需要注意的是在在A

Android实习生 &mdash;&mdash; 屏幕适配及布局优化

为什么要进行屏幕适配.对哪些设备进行适配?在近几年的发展当中,安卓设备数量逐渐增长,由于安卓设备的开放性,导致安卓设备的屏幕尺寸大小碎片化极为严重.从[友盟+]2016年手机生态发展报告H1中看截止16年手机分辨率使用情况:Android设备720p和1080p是主流,如果对前5中Android设备分辨率进行适配就能让app在90%的安卓设备上比较美观的兼容. 涉及重要概念及关系 1.硬件属性 ── 屏幕尺寸.屏幕分辨率.屏幕像素密度 [屏幕尺寸]:屏幕对角线长度.单位是英寸,1英寸=2.54厘

Android 第八课——UI布局2

Android布局分为:线性布局.相对布局.表格布局.帧布局.网格布局五种 1)FrameLayout(帧布局) 帧布局是最简单的布局对象,它被定制为用户屏幕上的一个空白备用区域,之后用户可以在其中填充一个单一对象,例如一张图片等.所有的子元素将会固定在屏幕左上角:我们不能为FrameLayout中的一个子元素指定一个位置.而且新增的子元素将会直接覆盖填充旧的子元素,类似于一个栈结构,当然也不一定是全部挡住,这样看透明度以及大小来决定. <FrameLayout xmlns:android= &qu

Android侧滑菜单DrawerLayout(抽屉布局)实现

应用场景: 由于侧滑菜单有更好的用户体验效果,所以更多的App使用侧滑抽屉式菜单列表,如网易客户端.百度影音.爱奇艺等等.至此,侧滑菜单有了更多的使用需求. 知识点介绍: 实现侧滑菜单功能的方法有很多,如果开源的项目SlidingMenu,下载地址为https://github.com/jfeinstein10/SlidingMenu.该开源项目依赖于另一个开源项目ActionBarSherlock,下载地址为https://github.com/JakeWharton/ActionBarShe

Android基础_3 Activity相对布局

相对布局要比前面讲的线性布局和表格布局要灵活一些,所以平常用得也是比较多的.相对布局控件的位置是与其周围控件的位置相关的,从名字可以看出来,这些位置都是相对的,确定出了其中一个控件的位置就可以确定另一个控件的位置了. 本次实验就是显示如下的activity: 其中只有2个button,1个textview,1个edittext. 在相对布局中,一般用到的控件属性解释如下: 在相对布局中有如下属性,解释如下: android:layout_above  为将该控件的底部放在指定id控件的上方 an

Android基础_2 Activity线性布局和表格布局

在activity的布局中,线性布局和表格布局是最简单的,这次分别从线性布局,表格布局以及线性布局和表格混合布局做了实验,实验中只需要编写 相应的xml的代码,java代码不需要更改,因为我们这里只是练习android的界面设计.参考的资料为mars老师的教程. 线性布局: 线性布局就是将各种控件按照行或者列依次进行排列. 其中本实验用到的各控件的属性解释如下: android:layout_weight属性是指不同的控件在activity中占有体积大小的比例. android:paddingL

Android五大布局之一帧布局(FrameLayout)

一.FrameLayout(帧布局)重点: FrameLayout(帧布局)可以说是五大布局中最为简单的一个布局,这个布局会默认把控件放在屏幕上的左上角的区域,后续添加的控件会覆盖前一个,如果控件的大小一样大的话,那么同一时刻就只能看到最上面的那个控件 二.FrameLayout(帧布局)常用属性: android:foreground:设置改帧布局容器的前景图像 android:foregroundGravity:设置前景图像显示的位置 三.例子: 1.首先先创建一个FrameLayout的X

Android——布局(线性布局linearLayout,表格布局TableLayout,帧布局FrameLayout)

线性布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent&q