界面无小事(五):自定义TextView
界面无小事(一): RecyclerView+CardView了解一下
界面无小事(二): 让RecyclerView展示更多不同视图
界面无小事(三):用RecyclerView + Toolbar做个文件选择器
界面无小事(四):来写个滚动选择器吧!
界面无小事(五):自定义TextView
界面无小事(六):来做个好看得侧拉菜单!
github传送门
目录
- 效果图
- 前言
- 自定义属性
- MeasureSpec类
- 颜色解析
- 字号转换
- 最后
效果图
不多废话, 直接上图, 如果感兴趣再看下去.
前言
写第四篇滚动选择器的时候, 在自定义视图这里含糊了, 有些地方没说清楚, 这次补上关于自定义视图的部分.
自定义属性
自定义视图的一个要点就是添加自定义属性. 这里我们填上三个常用的, 文本, 颜色, 字号. 然后在布局文件中就可以使用了. 最后在自定义类中获取属性并赋值.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MyTextView">
<attr name="text" format="string" />
<attr name="color" format="color" />
<attr name="size" format="dimension" />
</declare-styleable>
</resources>
xmlns:app="http://schemas.android.com/apk/res-auto"
<com.so.mytextview.ui.view.MyTextView
android:id="@+id/mtv_test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
app:color="@color/colorAccent"
app:size="60sp"
app:text="hello world" />
public MyTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs);
}
private void init(Context context, AttributeSet attrs) {
// 获取自定义属性
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MyTextView);
mSize = ta.getDimension(R.styleable.MyTextView_size, 16);
mText = ta.getString(R.styleable.MyTextView_text);
mColor = ta.getColor(R.styleable.MyTextView_color, Color.BLACK);
ta.recycle();
// 设置画笔
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setTextSize(mSize);
// 设置背景颜色
mBkColor = Color.BLUE;
}
MeasureSpec类
MeasureSpec类官方文档
关于onMeasure方法, 最重要的就是就是MeasureSpec类的使用了. 其实主要也就是要算好match_parent和wrap_content. match_parent和具体数值都是EXACTLY. wrap_content是AT_MOST. ScrollView或者是ListView就会是UNSPECIFIED.
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = 0;
int height = 0;
int specMode = MeasureSpec.getMode(widthMeasureSpec);
int specSize = MeasureSpec.getSize(widthMeasureSpec);
switch (specMode) {
case MeasureSpec.EXACTLY:
width = getPaddingLeft() + getPaddingRight() + specSize;
break;
case MeasureSpec.AT_MOST:
case MeasureSpec.UNSPECIFIED:
width = (int) (getPaddingLeft() + getPaddingRight()
+ mPaint.measureText(mText));
break;
}
specMode = MeasureSpec.getMode(heightMeasureSpec);
specSize = MeasureSpec.getSize(heightMeasureSpec);
switch (specMode) {
case MeasureSpec.EXACTLY:
height = getPaddingTop() + getPaddingBottom() + specSize;
break;
case MeasureSpec.AT_MOST:
case MeasureSpec.UNSPECIFIED:
Paint.FontMetrics fmi = mPaint.getFontMetrics();
float textHeight = Math.abs(fmi.bottom - fmi.top);
height = (int) (getPaddingTop() + getPaddingBottom() + textHeight);
break;
}
setMeasuredDimension(width, height);
}
有两个要点, 就是算字符串的宽度和高度, 宽度用Paint实例的measureText方法即可. 高度涉及到我在第四篇写的Paint.FontMetrics类, 就是用底部减去顶部取绝对值.
颜色解析
Color是个要处理的类, 当你用getColor函数获取到函数, 它是一个int值, 如果我们需要重新在原有颜色基础上变化, 就需要解析这个int, 将它还原成RGB.
/**
* 依据颜色值获取rgb值
*
* @param color 颜色值
* @return rgb值
*/
public int[] setColor(int color) {
int[] rgb = new int[3];
rgb[0] = (color & 0x00ff0000) >> 16;
rgb[1] = (color & 0x0000ff00) >> 8;
rgb[2] = (color & 0x000000ff);
return rgb;
}
字号转换
要处理好字号问题, 最重要的就是转换, 代码中都是用px的, 但是布局文件一般用sp.
/**
* sp转px
*/
public static int sp2px(float spVal) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,
spVal, getContext().getResources().getDisplayMetrics());
}
/**
* px转sp
*/
public static float px2sp(float pxVal) {
return (pxVal / getContext().getResources().getDisplayMetrics().scaledDensity);
}
最后
这样可以自定义一些简单的视图类了, 如果要更复杂的, 还需要去处理更多的参数, 特别是构造方法那个四参数的. 有意见或者建议评论区见, 喜欢记得点赞或者关注我哦~

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
Android 7.0 FileProvider使用
1). FileProvider Android 7.0的新特性规定,对于android 7.0应用(仅仅对于android 7.0版本的sdk而言,若是编译版本低于25仍然不会受到影响),android框架使用StrictMode Api禁止我们的应用对外部(跨越应用分享)公开file://,若使用file://格式共享文件则会报FileUriExposedException异常,android 7.0应用间的文件共享需要使用content://类型的URI分享,并且需要为其提供临时的文件访问权限 (Intent.FLAG_GRANT_READ_URI_PERMISSION和Intent.FLAG_GRANT_WRITE_URI_PERMISSION),对此,官方给我们的建议是使用FileProvider类进行分享。 2). 使用步骤 manifest中声明FileProvider res/xml中定义对外暴露的文件夹路径 生成content://类型的Uri 给Uri授予临时权限 使用Intent传递Uri 3). AndroidManifest.xml文件声明 <provi...
-
下一篇
加载一张图片到ImageView到底占据多少内存
https://blog.csdn.net/BUG_delete/article/details/79557939 简介 Android中经常要通过ImageView进行图片资源显示。在加载图片时,首先要考虑的两个因素就是体验问题和性能问题。 其中,体验问题是指图片显示的是否正确(例如Universal-Image-Loader在适配Adapter图片资源时会导致图片显示错位),分辨率是否合适等。而体验问题主要是指图片加载速度,以及更加重要的图片加载的内存占用问题。本文重点介绍ImageView加载图片中的内存占用问题。 问题 在开发的过程中,经常会发现因为加载图片而引起的Out of Memory(OOM)问题,有的时候会很奇怪,明明加载的图片只有几十K,为什么就会导致OOM呢?另外在图片资源设置过程中,只放置某一个dpi文件夹(例如drawable-xxhdpi文件夹)的资源,在不同设备中对ImageView占用会有影响吗?下面会对图片加载的内存占用相关问题进行展开分析。 概念描述 首先,图片对内存的占用是一个叠加的过程,也就是说图片资源不是及时释放的,使用过的图片在回收过程中可能...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS6,CentOS7官方镜像安装Oracle11G
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS关闭SELinux安全模块