当我们开发中遇到Android原生的组件无法满足需求时,这时候就应该自定义View来满足这些特殊的组件需求。
一、概述
很多初入Android开发的程序员,对于Android自定义View可能比较恐惧,但这又是高手进阶的必经之路,这里先不做过多学习,只是简单了解。关于高阶的内容会在后续课程陆续进行学习,欢迎关注分享达人秀ShareExpert获取第一手教程。
如果说要按类型来划分的话,自定义View的实现方式大概可以分为三种:自绘控件、组合控件、以及继承控件。
二、方法
介于目前掌握的Android基础知识较为薄弱,本节先简单学习一下自绘控件。首先定义一个继承View基类的子类,然后重写View 类的一个或多个方法。通常可以被用户重写的方法如下。
当需要开发自定义View时,开发者并不需要重写上面列出的所有方法,而是可以根据业务需要重写其中部分方法。
三、示例
下面就实现一个简单的计数器,每点击它一次,计数值就加1并显示出来。
在src/main/java文件下创建新包com.jinyu.cqkxzsxy.android.widgetsample.view,再新建一个CounterView.java文件,其代码如下:
public class CounterView extends View {
// 定义画笔
private Paint mPaint;
// 用于获取文字的宽和高
private Rect mBounds;
// 计数值,每点击一次本控件,其值增加1
private int mCount = 0;
public CounterView(Context context, AttributeSet attrs) {
super(context, attrs);
// 初始化画笔、Rect
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mBounds = new Rect();
// 本控件的点击事件
setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
mCount ++;
// 重绘
invalidate();
}
});
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mPaint.setColor(Color.BLUE);
// 绘制一个填充色为蓝色的矩形
canvas.drawRect(0, 0, getWidth(), getHeight(), mPaint);
mPaint.setColor(Color.YELLOW);
mPaint.setTextSize(50);
String text = String.valueOf(mCount);
// 获取文字的宽和高
mPaint.getTextBounds(text, 0, text.length(), mBounds);
float textWidth = mBounds.width();
float textHeight = mBounds.height();
// 绘制字符串
canvas.drawText(text, getWidth() / 2 - textWidth / 2, getHeight() / 2
+ textHeight / 2, mPaint);
}
}
关于里面的代码不懂也没有关系,后续会详细进行学习的。
到res/layout/目录下创建一个counterview_layout.xml文件,然后在其中填充如下代码片段:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.jinyu.cqkxzsxy.android.widgetsample.view.CounterView
android:id="@+id/counter_view"
android:layout_width="100dp"
android:layout_height="100dp"/>
</LinearLayout>
然后修改一下app/src/java/MainActivity.java文件中加载的布局文件为新建的counterview_layout.xml文件。
运行程序,点击自定义的计数控件,会发现每点击一次控件里面的值+1,如下图所示效果。
至此,一些Android开发中一些常用的控件学习完毕,还记得学过哪些控件吗?都掌握的如何?我们从下一期开始一起来学习Android中的界面布局。