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

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日

相关文章

  • 几种常用的软件生命周期模型详解整合

    几种常用的软件生命周期模型详解整合 软件开发过程中常用的几种生命周期模型包括瀑布模型、迭代模型、螺旋模型、敏捷模型等。本篇攻略将对这几种模型进行详细讲解整合,方便读者了解这些模型的优缺点和使用场景,选择适合自己项目的开发生命周期模型。 瀑布模型 瀑布模型是软件开发生命周期的基础模型,非常适合需求明确、稳定的项目。该模型按照不同阶段的执行顺序,将软件开发过程划…

    other 2023年6月27日
    00
  • win10系统下word2010文档怎样添加绘图

    Win10系统下Word2010文档添加绘图的完整攻略 Microsoft Word是一款常用的文字处理软件,它不仅可以处理文字,还可以添加各种图形和绘图。本文将提供一个完整攻略,介绍Win10系统下Word2010文档添加绘图的方法,并提供两个示例说明。 添加绘图 在Word2010中添加绘图通常包括以下步骤: 步骤1:打开Word 在Windows 10…

    other 2023年5月8日
    00
  • C++提取文件名与提取XML文件的方法详解

    C++提取文件名与提取XML文件的方法详解 C++ 是一种高效、通用的编程语言,常用于开发系统软件、应用程序、游戏等。在程序开发中,需要经常操作文件和解析 XML 文件。本文将详细讲解 C++ 中提取文件名和提取 XML 文件的方法。 提取文件名 在 C++ 中,可以使用 basename 函数来提取文件名。basename 函数定义在 libgen.h 头…

    other 2023年6月26日
    00
  • Shell脚本实现从文件夹中递归复制文件

    想要实现从一个文件夹中递归复制(包括文件夹和子文件夹中的文件)文件,可以通过编写Shell脚本来实现。具体的实现攻略如下: 1. 创建Shell脚本文件 在Linux环境中,右键点击文件夹空白处,选择“打开终端”,在终端中输入以下命令来创建一个新的Shell脚本文件: touch myscript.sh 其中,myscript.sh 是你新建的Shell脚本…

    other 2023年6月27日
    00
  • iOS12降级提示未能更新iPhone,发生未知错误(1667)的解决方法

    iOS12降级提示未能更新iPhone,发生未知错误 (1667) 的解决方法 如果你正在尝试降级到 iOS 12,并且在更新过程中遇到错误代码 1667,则说明升降级过程中出现了一些问题。这里提供了一些可行的解决方法来帮助您解决问题。 解决方法一:更新 iTunes 首先,您需要确保您正在使用最新版本的 iTunes 软件。例如,如果您使用的是旧版 iTu…

    other 2023年6月27日
    00
  • 免费下载!Windows 10简体中文最新预览版下载地址(另附更多语言版本)

    免费下载!Windows 10简体中文最新预览版下载地址(另附更多语言版本)攻略 Windows 10是微软最新的操作系统版本,提供了许多新功能和改进。如果你想尝试Windows 10的最新预览版,并且希望以简体中文为主要语言,下面是一个详细的攻略,告诉你如何免费下载Windows 10简体中文最新预览版,并提供了其他语言版本的下载地址。 步骤1:访问Win…

    other 2023年8月4日
    00
  • b站解除港澳台限制油猴脚本无法授权找不到ip地址

    以下是关于B站解除港澳台限制油猴脚本无法授权找不到IP地址的完整攻略,包括基本知识和两个示例说明。 基本知识 B站是一个中国的在线视频分享平台,它在某些地区(如港澳台地区)可能会受到地区限制。为了解除这些限制,一些用户可能会使用油猴脚本。然而,有些用户可能会遇到油猴脚本无法授权的问题,这可能是由于无法找到IP地址导致的。 示例说明 以下是两个B站解除港澳台限…

    other 2023年5月7日
    00
  • pxcook(像素大厨)

    PxCook(像素大厨)攻略 PxCook(像素大厨)是一款设计师必备的UI设计工具,它可以帮助设计师快速生成设计稿的标注、切图、交互等工作,提高设计率。下面是PxCook的完整攻略,包括安装、使用和示例说明。 安装 PxCook支持Windows和Mac系统,可以在官网下载安装包进行安装。安装完成后,打开PxCook,输入注册码或使用试用版即可开始使用。 …

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