Android自定义TextView实心圆角颜色背景(动态改变圆角背景颜色)
2016-09-22 17:13
776 查看
最近根据项目需求自定义了一个TextView控件,主要用来做状态的标识,比如一个订单状态有各种,当然了这种设置在Android中可以直接用xml文件来处理,但是对于xml文件太过于麻烦,针对不同的颜色需要写一个xml文件,这样太繁琐了,所以就自己写了一个控件,只要动态设置一下属性就可以达到想要的目的,在此把这代码分享出来,当然了,也希望大家多多提意见,毕竟代码优化是一步一步跟进完善的,好了我们先来看看具体的效果图,毕竟有图才能看看是不是自己想要的那种控件,上图:
下面我们就来看看具体的实现吧
首先是自定义控件ColorTextView.java文件:
其中自定义的style在attrs.xml文件中,具体看代码:
接下来我们就来看看是怎么使用的
activity_main.xml
最后我们来看看是怎么在代码中改变背景颜色值的:
MainActivity.java
好啦,使用就是这么简单,需要的可以在这个基础上进行完善,有什么好的建议可以给我留言,如果有需要的也可以点击下载源码:Android自定义TextView带圆角及背景颜色
下面我们就来看看具体的实现吧
首先是自定义控件ColorTextView.java文件:
package com.test.colortextviewdemo; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.RectF; import android.util.AttributeSet; import android.util.TypedValue; import android.view.View; /** * 自定义申请状态textView */ public class ColorTextView extends View { /** * 文本内容 */ private String mTitleText; /** * 文本的颜色 */ private int mTitleTextColor; /** * 文本的大小 */ private int mTitleTextSize; private int ctvBackgroundColor; /** * 圆角大小 */ private int mCornerSize; /** * 绘制时控制文本绘制的范围 */ private Rect mtitleBound; private Paint mtitlePaint; public ColorTextView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public ColorTextView(Context context) { this(context, null); } public void setCtvBackgroundColor(int ctvBackgroundColor) { this.ctvBackgroundColor = ctvBackgroundColor; } /** * 获得我自定义的样式属性 * * @param context * @param attrs * @param defStyle */ public ColorTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); /** * 获得我们所定义的自定义样式属性 */ TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.ColorTextView, defStyle, 0); int n = a.getIndexCount(); for (int i = 0; i < n; i++) { int attr = a.getIndex(i); switch (attr) { case R.styleable.ColorTextView_ctvText: mTitleText = a.getString(attr); break; case R.styleable.ColorTextView_ctvTextColor: // 默认颜色设置为黑色 mTitleTextColor = a.getColor(attr, Color.BLACK); break; case R.styleable.ColorTextView_ctvTextSize: // 默认设置为16sp,TypeValue也可以把sp转化为px mTitleTextSize = a.getDimensionPixelSize(attr, (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_SP, 16, getResources().getDisplayMetrics())); break; case R.styleable.ColorTextView_ctvBackground: //默认为白色 ctvBackgroundColor = a.getColor(attr, Color.WHITE); break; case R.styleable.ColorTextView_ctvCornerSize: //默认圆角为0 mCornerSize = a.getInteger(attr, 0); break; } } a.recycle(); mtitlePaint = new Paint(); mtitlePaint.setTextSize(mTitleTextSize); mtitleBound = new Rect(); mtitlePaint.getTextBounds(mTitleText, 0, mTitleText.length(), mtitleBound); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int widthMode = MeasureSpec.getMode(widthMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); int width; int height; if (widthMode == MeasureSpec.EXACTLY) { width = widthSize; } else { mtitlePaint.setTextSize(mTitleTextSize); mtitlePaint.getTextBounds(mTitleText, 0, mTitleText.length(), mtitleBound); int desired = getPaddingLeft() + mtitleBound.width() + getPaddingRight(); width = desired <= widthSize ? desired : widthSize; } if (heightMode == MeasureSpec.EXACTLY) { height = heightSize; } else { mtitlePaint.setTextSize(mTitleTextSize); mtitlePaint.getTextBounds(mTitleText, 0, mTitleText.length(), mtitleBound); int desired = getPaddingTop() + mtitleBound.height() + getPaddingBottom(); height = desired <= heightSize ? desired : heightSize; } setMeasuredDimension(width, height); } @Override protected void onDraw(Canvas canvas) { Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG); paint.setAntiAlias(true); paint.setColor(ctvBackgroundColor); RectF rec = new RectF(0, 0, getMeasuredWidth(), getMeasuredHeight()); canvas.drawRoundRect(rec, mCornerSize, mCornerSize, paint); mtitlePaint.setColor(mTitleTextColor); Paint.FontMetricsInt fontMetrics = mtitlePaint.getFontMetricsInt(); int baseline = (getMeasuredHeight() - fontMetrics.bottom + fontMetrics.top) / 2 - fontMetrics.top; canvas.drawText(mTitleText, getPaddingLeft(), baseline, mtitlePaint); } }
其中自定义的style在attrs.xml文件中,具体看代码:
<declare-styleable name="ColorTextView"> <attr name="ctvText" format="string" /> <attr name="ctvBackground" format="color"/> <attr name="ctvTextSize" format="dimension"/> <attr name="ctvTextColor" format="color"/> <attr name="ctvCornerSize" format="integer"/> </declare-styleable>
接下来我们就来看看是怎么使用的
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:radiostyle="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <com.test.colortextviewdemo.ColorTextView android:layout_marginTop="15dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:padding="5dp" radiostyle:ctvBackground="@color/app_theme_color" radiostyle:ctvCornerSize="30" radiostyle:ctvText="我是原文本" radiostyle:ctvTextColor="@color/app_white" radiostyle:ctvTextSize="15sp" /> <com.test.colortextviewdemo.ColorTextView android:layout_marginTop="15dp" android:id="@+id/text_0" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:padding="5dp" radiostyle:ctvBackground="@color/app_theme_color" radiostyle:ctvCornerSize="30" radiostyle:ctvText="我是自定义颜色文本1" radiostyle:ctvTextColor="@color/app_white" radiostyle:ctvTextSize="15sp" /> <com.test.colortextviewdemo.ColorTextView android:layout_marginTop="15dp" android:id="@+id/text_1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:padding="5dp" radiostyle:ctvBackground="@color/app_theme_color" radiostyle:ctvCornerSize="30" radiostyle:ctvText="我是自定义颜色文本2" radiostyle:ctvTextColor="@color/app_white" radiostyle:ctvTextSize="15sp" /> <com.test.colortextviewdemo.ColorTextView android:layout_marginTop="15dp" android:id="@+id/text_2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:padding="5dp" radiostyle:ctvBackground="@color/app_theme_color" radiostyle:ctvCornerSize="30" radiostyle:ctvText="我是自定义颜色文本3" radiostyle:ctvTextColor="@color/app_white" radiostyle:ctvTextSize="15sp" /> </LinearLayout>
最后我们来看看是怎么在代码中改变背景颜色值的:
MainActivity.java
package com.test.colortextviewdemo; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; public class MainActivity extends AppCompatActivity { private ColorTextView ctv0; private ColorTextView ctv1; private ColorTextView ctv2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ctv0 = (ColorTextView) findViewById(R.id.text_0); ctv1 = (ColorTextView) findViewById(R.id.text_1); ctv2 = (ColorTextView) findViewById(R.id.text_2); ctv0.setCtvBackgroundColor(getResources().getColor(R.color.progress_color)); ctv1.setCtvBackgroundColor(getResources().getColor(R.color.app_red)); ctv2.setCtvBackgroundColor(getResources().getColor(R.color.colorAccent)); } }
好啦,使用就是这么简单,需要的可以在这个基础上进行完善,有什么好的建议可以给我留言,如果有需要的也可以点击下载源码:Android自定义TextView带圆角及背景颜色
相关文章推荐
- Android自定义TextView边框颜色(动态改变边框颜色以及字体颜色)
- 给一个android的TextView设置背景颜色动态显示,到那时好像不起作用。我是少了什么东西么?
- Android动态改变TextView字体颜色
- Android开发-TextView background 背景 颜色 圆角-AndroidStudio
- Handler动态改变TextView背景和字体颜色
- android动态改变textView字体的颜色
- Android实现连续并排的若干个TextView单击改变背景颜色达到选项卡Tab栏切换效果
- Android 如何点击改变ListView行布局的TextView内容和颜色背景
- Android动态改变TextView字体颜色
- Android实现连续并排的若干个TextView单击改变背景颜色达到选项卡Tab栏切换效果
- Android TextView设置部分字体颜色改变,部分字体背景改变
- android中为TextView动态改变字体颜色,如点击时更改
- Android TextView的点击效果之改变背景颜色
- Android动态改变TextView字体颜色
- Android开发-TextView background 背景 颜色 圆角-AndroidStudio
- 关于android中改变TextView背景颜色以及文字颜色的问题
- Android使用属性动画ValueAnimator动态改变SurfaceView的背景颜色
- [置顶] android自定义view控件之一圆角背景TextView
- Android TextView 动态改变字体颜色
- Android TextView 动态改变字体颜色、大小