【5年Android从零复盘系列之八】Android自定义View(3):衍生/扩展式 详解(图文)
发布日期:2021-06-29 18:17:38
浏览次数:2
分类:技术文章
本文共 3972 字,大约阅读时间需要 13 分钟。
1.简述
简而言之,即 如继承TextView,修改默认background、marquee状态时,elevation值、取消默认最小高度等。
2.前提基础
了解View的生命周期,关联Activity联动时的函数调用顺序
- 【View】构造方法
- 【View】onFinishInflate()
- 【Activity】 onCreate()
- 【Activity】onStart()
- 【Activity】onResume()
- 【View】onAttachedToWindow()
- 【View】onMeasure() (可能调用n次)
- 【View】onSizeChanged() (可能调用n次)
- 【View】onLayout() (可能调用n次)
- 【View】onDraw() (可能调用n次)
- 【View】onWindowFocusChanged() (调用Activity.onPause()前,被调用,hasWindowFocus==false)
- 【Activity】onPause()
- 【Activity】onStop()
- 【Activity】onDestroy()
- 【View】onDetachedFromWindow
可参考 :
细节注意:
运行时,动态更新View的两种方法区别
1.invalidate():简单重绘View:如更新其文本、颜色、状态等。只调用onDraw()方法。
2.requestLayout():
可约等于视为完全重绘整个View,因为该方法调用后,会从onMeasure()开始更新View
3. 实践
改写内容见代码备注
3.1 自定义View类
package com.cupster.base_super_resource;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.text.TextUtils;import android.util.AttributeSet;import android.widget.TextView;import androidx.annotation.Nullable;public class AlwaysMarqueeTextView extends TextView { public AlwaysMarqueeTextView(Context context) { super(context); initExTool(context , null); } public AlwaysMarqueeTextView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); initExTool(context ,attrs); } public AlwaysMarqueeTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initExTool(context ,attrs); } public AlwaysMarqueeTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); initExTool(context ,attrs); } //======================================================================== //============================ 扩展1 ================================= //======================================================================== //重置父类判断跑马灯滚动条件1 @Override public boolean isFocused() { return true; } //重置父类判断跑马灯滚动条件2 @Override public void setSelected(boolean selected) { super.setSelected(true); } //======================================================================== //============================ 扩展2 ================================= //======================================================================== private Paint mPaint; private int underColor = -1; private void initExTool(Context context ,AttributeSet attrs){ mPaint = new Paint(); if (attrs == null){ mPaint.setColor(Color.BLUE); }else { TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.AlwaysMarqueeTextView); //取值 underColor= typedArray.getInt(R.styleable.AlwaysMarqueeTextView_under_color, Color.parseColor("#0000ff")); //使用 mPaint.setColor(underColor); //释放 typedArray.recycle(); } //---------------------- //------- 扩展3 --------- //---------------------- initSetting(); } @Override protected void onDraw(Canvas canvas) { //添加下划线 super.onDraw(canvas); mPaint.setColor(Color.GREEN); canvas.drawLine( 0 ,getHeight()/2 ,getWidth() ,getHeight()/2 , mPaint); } //======================================================================== //============================ 扩展3 ================================= //======================================================================== private void initSetting() { setEllipsize(TextUtils.TruncateAt.MARQUEE);//跑马灯滚动 setMarqueeRepeatLimit(-1);//-1无限循环,1循环一次 ,n 循环n次 setSingleLine(true); setHorizontallyScrolling(true); setFocusable(true); setFocusableInTouchMode(true); }}
3.2 自定义属性
res/values/attrs.xml
3.3 布局文件中使用
转载地址:https://cupster.blog.csdn.net/article/details/112185401 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
关注你微信了!
[***.104.42.241]2024年04月03日 09时22分38秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
训练自己haar-like特征分类器并识别物体(1)
2019-04-30
iOS容易造成循环引用的三种场景,就在你我身边!
2019-04-30
有一个会做饭的女友是一种怎样的体验?
2019-04-30
Storm入门之第一章
2019-04-30
java提高篇之数组(1):认识JAVA数组
2019-04-30
java提高篇之数组(2)
2019-04-30
浅析数据一致性
2019-04-30
Java 多维数组遍历
2019-04-30
深入分析Java中的length和length()
2019-04-30
数据库连接池浅析
2019-04-30
Java面试参考指南——同步
2019-04-30
在Java中如何高效的判断数组中是否包含某个元素
2019-04-30
线程安全与共享资源
2021-07-03
八成Java开发者解答不了的问题
2021-07-03
关于Spring的69个面试问答——终极列表
2021-07-03
Java并发编程(5):volatile变量修饰符—意料之外的问题(含代码)
2021-07-03
设计模式(十一)代理模式Proxy(结构型)
2021-07-03
eclipse 配置黑色主题
2021-07-03
开发团队里是否需要测试人员?
2021-07-03