Templates实战之更优雅实现自定义View构造方法详解

yizhihongxing

Templates实战之更优雅实现自定义View构造方法详解

背景

自定义View是Android开发的重要组成部分,而在自定义View的创建过程中,构造方法也是非常重要的一步。在很多情况下,我们需要给自定义View设置一些特殊的属性,或者在初始化的时候进行一些特殊的操作。这时,我们就需要对自定义View的构造方法进行改造,以便更好地满足我们的需求。

常规做法

常规的做法是通过在构造方法中增加一些参数来实现自定义View的初始化,例如:

public class CustomView extends View {
    public CustomView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO: 在这里进行初始化操作
    }
}

在这个例子中,我们将Context和AttributeSet作为参数传入自定义View的构造方法中,然后在方法内部进行初始化操作。

更好的做法

然而,这种做法有一个不足之处,那就是如果我们需要设置的属性非常多,那么就需要增加很多个参数,导致方法很难看,而且增加了出错的风险。为了解决这个问题,我们可以使用模板模式。模板模式是一种非常常见的设计模式,它可以将公共的代码放置在一个父类中,然后让子类继承这个父类,并实现特定的逻辑。

首先,我们创建一个模板类BaseCustomView,这个类作为所有自定义View的基类,包含了一些公共的代码,例如设置padding和背景颜色等操作。然后,我们再创建一个CustomView类,继承BaseCustomView类,并在这个类中实现我们想要做的特殊操作。

示例一

public abstract class BaseCustomView extends View {
    public BaseCustomView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(attrs);
    }

    private void init(AttributeSet attrs) {
        int padding = getResources().getDimensionPixelSize(R.dimen.dimen_8dp);
        setPadding(padding, padding, padding, padding);
        setBackgroundColor(Color.GRAY);
        initialize(attrs);
    }

    protected abstract void initialize(AttributeSet attrs);
}

public class CustomView extends BaseCustomView {

    private String mText;

    public CustomView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void initialize(AttributeSet attrs) {
        TypedArray ta = getContext().obtainStyledAttributes(attrs, R.styleable.CustomView);
        mText = ta.getString(R.styleable.CustomView_text);
        ta.recycle();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(Color.WHITE);
        paint.setTextSize(getResources().getDimensionPixelSize(R.dimen.dimen_14sp));
        canvas.drawText(mText, getWidth() / 2, getHeight() / 2, paint);
    }
}

在这个例子中,我们创建了一个BaseCustomView类,重写了它的构造方法和初始化方法,并在这个类中进行了一些公共的操作。然后,我们创建了一个CustomView类,继承自BaseCustomView类,并重写了它的initialize方法,在这个方法中获取了我们自定义的属性text,并保存在mText变量中。在CustomView的onDraw方法中,我们使用保存的mText值来绘制一个文字。

示例二

public abstract class BaseCustomView extends View {
    public BaseCustomView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(attrs);
    }

    private void init(AttributeSet attrs) {
        int padding = getResources().getDimensionPixelSize(R.dimen.dimen_8dp);
        setPadding(padding, padding, padding, padding);
        setBackgroundColor(Color.GRAY);
        initialize(attrs);
    }

    protected abstract void initialize(AttributeSet attrs);

    protected void setAutoMeasure() {
        if (getLayoutParams() == null) {
            setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
        }
    }
}

public class CustomView extends BaseCustomView {

    private String mText;
    private int mTextSize;

    public CustomView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setAutoMeasure();
    }

    @Override
    protected void initialize(AttributeSet attrs) {
        TypedArray ta = getContext().obtainStyledAttributes(attrs, R.styleable.CustomView);
        mText = ta.getString(R.styleable.CustomView_text);
        mTextSize = ta.getDimensionPixelSize(R.styleable.CustomView_textSize, getResources().getDimensionPixelSize(R.dimen.dimen_14sp));
        ta.recycle();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        setMeasuredDimension(getMeasuredWidth(), mTextSize + getPaddingTop() + getPaddingBottom());
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(Color.WHITE);
        paint.setTextSize(mTextSize);
        canvas.drawText(mText, getWidth() / 2, getHeight() / 2 + mTextSize / 2, paint);
    }
}

在这个例子中,我们同样创建了一个BaseCustomView类,并且重写了这个类的构造方法和初始化方法。然后,我们创建了一个CustomView类,继承自BaseCustomView类,并重写了它的initialize方法,在这个方法中获取了我们自定义的属性text和textSize,并保存在相应的变量中。在CustomView的onMeasure方法中,我们根据获取到的mTextSize值来计算CustomView的高度。最后,在CustomView的onDraw方法中,我们再次使用mTextSize值来绘制文字,同时为了达到更好的效果,我们将文字描绘在CustomView的中央。

总结

在这篇文章中,我们使用了模板模式的思想,创建了一个BaseCustomView类,并且让所有自定义View都继承自这个类。在BaseCustomView类中,我们实现了一些公共的操作,包括设置padding和背景颜色等操作。然后,在每个自定义View的子类中,我们重写了BaseCustomView类的initialize方法,并在这个方法中获取了我们自定义的属性,并保存在相应的变量中。通过这种方式,我们可以更好地实现自定义View的构造方法,使代码更加简洁、清晰。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Templates实战之更优雅实现自定义View构造方法详解 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • Windows下git使用代理服务器的设置方法

    在Windows下使用Git时,如果需要通过代理服务器进行网络连接,需要进行相应的设置。本文将为您提供一份完整攻略,包括设置方法、示例说明、注意事项等。 设置方法 在Windows下使用Git时,可以通过以下步骤设置代理服务器: 打开Git Bash终端。 输入以下命令,设置HTTP代理服务器: bash git config –global http.p…

    other 2023年5月5日
    00
  • R语言画正弦曲线

    R语言画正弦曲线的完整攻略 在R语言中,我们可以使用sin函数来画正弦曲线。本文将为您提供一份完整攻略,介绍如何使用R语言画正弦曲线,并提供两个示例说明。 画正弦曲线的步骤 步骤1:创建x轴数据 在画正弦曲线之前,我们需要先创建x轴数据。可以使用以下代码来创建x轴数据: x <- seq(0, 2*pi, length.out = 100) 在上面的代…

    other 2023年5月5日
    00
  • 电脑向右键菜单发送到中添加二级菜单的方法

    添加二级菜单有两种方法,一种是使用注册表编辑器手动添加,另一种是使用第三方软件进行添加。 方法一:使用注册表编辑器手动添加 按下“Win+R”快捷键,打开运行对话框。 输入“regedit”并按下回车键,打开注册表编辑器。 在注册表编辑器中,依次展开:HKEY_CLASSES_ROOT\Directory\Background\shell。 右键shell键…

    other 2023年6月27日
    00
  • MySQL中的JSON字段List成员检查

    标题:MySQL中的JSON字段List成员检查 1. JSON字段List成员检查 在MySQL中,可以使用JSON字段来存储数据。在JSON字段中,可以包含List类型数据。如果需要检查一个List数据中是否包含某个成员,可以使用MySQL中提供的JSON函数进行查询。 2. 使用JSON_CONTAINS函数 使用JSON_CONTAINS函数可以判断…

    other 2023年6月25日
    00
  • 剑灵6月30日万物有灵版本预下载指南 预下载地址教程介绍

    剑灵6月30日万物有灵版本预下载指南 1. 简介 剑灵是一款热门的多人在线角色扮演游戏,而6月30日的万物有灵版本是一次重要的更新。为了避免更新当天服务器过载,官方提供了预下载的选项,让玩家在更新当天能够快速进入游戏。本指南将详细介绍预下载的步骤和预下载地址。 2. 预下载步骤 步骤一:访问官方网站 首先,打开你的浏览器,访问剑灵的官方网站。你可以在搜索引擎…

    other 2023年8月4日
    00
  • Java处理表格的实用工具库

    Java处理表格的实用工具库 在Java开发中,有许多实用的工具库可用于处理表格数据。以下是使用两个常用的Java表格处理工具库的详细攻略: Apache POI Apache POI是一个流行的Java库,用于读取、写入和操作Microsoft Office格式的文件,包括Excel表格。以下是使用Apache POI处理表格的示例说明: 首先,确保已经添…

    other 2023年10月15日
    00
  • Ubuntu系统英文怎么改成中文语言?

    以下是详细讲解如何将Ubuntu系统的语言从英文改为中文的攻略: 1. 检查系统语言支持 首先,我们需要确认系统是否已经安装了中文语言支持。在终端中输入以下命令: locale -a 如果您看到了列表中有”zh_CN.utf8″、”zh_TW.utf8″或”zh_HK.utf8″等中文语言环境,则说明系统已经支持中文了。否则,你需要在终端中输入以下命令安装中…

    other 2023年6月27日
    00
  • 剑指Offer之Java算法习题精讲二叉搜索树与数组查找

    首先,我们需要了解什么是二叉搜索树。二叉搜索树是一棵有序树,其中每个节点的值都大于其左子树中的所有节点的值,且小于其右子树中的所有节点的值。 在 Java 中,我们可以用节点类和树类来实现二叉搜索树。 接着,我们可以学习如何向二叉搜索树中插入节点,删除节点和查找节点。 对于删除节点,我们有三种情况需要考虑:该节点是叶子节点、该节点有一个子节点或该节点有两个子…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部