android 自定义TextView知识点总结
程序员文章站
2022-07-13 15:31:06
...
自定义TextView 体验后总结关键步骤:
1.
class TextView extends View
自定义类TextView继承自View
2重写父类的构造方法, 还有onMeasure(),onDraw(),onTouchEvent()方法
private String mText;
private int mTextSize = 15;
private int mTextColor = Color.BLACK;
private Paint mPaint;
//构造函数会在代码里面new的时候调用
public TextView(Context context) {
this(context,null);
}
//在布局中使用
public TextView(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
//在布局Layout中使用,但是会有style
public TextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
//获取自定义属性
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.TextView);
mText = array.getString(R.styleable.TextView_text);
mTextColor = array.getColor(R.styleable.TextView_textColor,mTextColor);
//15 sp or px
mTextSize = array.getDimensionPixelSize(R.styleable.TextView_textSize,mTextSize);
//回收
array.recycle();
mPaint = new Paint();
//抗锯齿
mPaint.setAntiAlias(true);
//设置字体的大小和颜色
mPaint.setTextSize(mTextSize);
mPaint.setColor(mTextColor);
// setBackground(Color.TRANSPARENT);
setWillNotDraw(false);
}
3.最关键的三个方法onMeasure(),onDraw(),onTouchEvent()方法解析
onMeasure()用于测量宽高,就是我们自定义的TextView的宽高,比如说固定的值100dp,或者是warp_content,原理细节在代码中呈现
/**自定义view的测量方法
* @param widthMeasureSpec
* @param heightMeasureSpec
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//布局的宽高由这个方法指定---指定控件的宽高需要测量
//获取宽高德模式
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
//AT_MOST--------在布局中指定了warp_content
//EXACTLY--------在布局中制定了确切的值 100dp---match_parent fill_parent
//UNSPECIFIED----尽可能的大,很少能用到,ListView,Scrollview
//1.确定的值,这个时候不需要计算,给的多少就是多少
int width = MeasureSpec.getSize(widthMeasureSpec);
//在自定义viewgroup的时候会详细讲解--给的是warp_content需要计算
if (widthMode == MeasureSpec.AT_MOST){
//计算的宽度与字体的长度有关与字体的大小用画笔来测量
Rect bounds = new Rect();
//获取文本的RECT
mPaint.getTextBounds(mText,0,mText.length(),bounds);
width = bounds.width()+getPaddingLeft()+getPaddingRight();
}
int height = MeasureSpec.getSize(heightMeasureSpec);
if (heightMode == MeasureSpec.AT_MOST){
//计算的宽度与字体的长度有关与字体的大小用画笔来测量
Rect bounds = new Rect();
//获取文本的RECT
mPaint.getTextBounds(mText,0,mText.length(),bounds);
height = bounds.height()+getPaddingTop()+getPaddingBottom();
}
//设置属性的宽高
setMeasuredDimension(width,height);
}
onDraw()用于绘制,就是实现TextView的内容呈现,比如文字,大小颜色,显示在界面上等,代码中有一个小细节知识点,就是基线,说白了就是我们上学时候的知识点,拼音在线条中的书写格式,原理代码中看
//用于绘制
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// //画文本
// canvas.drawText();
// //画弧形
// canvas.drawArc();
// //画圆
// canvas.drawCircle();
//画文字 text x y paint
//x 就是开始的位置 0
//y 基线 baseline 求? getHeight()/2知道的 centerY
//dy 代表的是:高度的一半到baseline的距离
Paint.FontMetricsInt fontMetricsInt = mPaint.getFontMetricsInt();
//top 是一个负值 bottom是一个正值 top,bottom的值代表是 bottom是baseline到文字底部的距离(正值)
//必须要清楚的,自己打印可看
int dy = (fontMetricsInt.bottom-fontMetricsInt.top)/2-fontMetricsInt.bottom;
int baseline = getHeight()/2+dy;
int x = getPaddingLeft();
canvas.drawText(mText,x,baseline,mPaint);
}
onTouchEvent()触摸事件,比如我们在使用TextView的时候会点击,长按,等动作监听,此处为简单demon没有太多功能,只做了一下他的手指监听操作,看代码
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_UP:
//手指抬起
Log.e("Tag","手指抬起--");
break;
case MotionEvent.ACTION_DOWN:
//手指按下
Log.e("Tag","手指按下--");
break;
case MotionEvent.ACTION_MOVE:
//手指移动
Log.e("Tag","手指移动--");
break;
}
return true;
}
demon连接地址:等上传资源通过了,附上地址
下一篇: 自定义View设置转盘
推荐阅读
-
Android开发自定义TextView省略号样式的方法
-
Android自定义TextView跑马灯效果
-
Android自定义竖排TextView实现实例
-
Android开发技巧之在a标签或TextView控件中单击链接弹出Activity(自定义动作)
-
android自动化测试知识点总结
-
Android自定义TextView实现drawableLeft内容居中
-
Android 自定义TextView实现文本内容自动调整字体大小
-
解析在Android中为TextView增加自定义HTML标签的实现方法
-
Android TextView自定义数字滚动动画
-
Android中自定义View的实现方式总结大全