android自定义控件类型,Android学习—— Android自定义控件

Android自定义控件java

安卓在使用中大多数使用已有的一些控件,用法比较简单,还有一部分是比较复杂的、用户本身想的控件,这些就须要进行自定义控件,今天就来简单说一下自定义控件。android

一、绘制过程canvas

建立一个类,继承View类

onMeasure()方法,测量计算视图的大小

onLayout()方法,设置视图在屏幕中显示的位置

onDraw()方法,绘制视图

以上就是自定义控件的绘制过程。bash

二、主要内容解释ide

measure操做

用于计算视图的大小,即视图的宽度和长度。在view中定义为final类型,要求子类不能修改。measure()函数中又会调用下面的函数:函数

(1)onMeasure(),肯定视图大小,也就是说measure只是对onMeasure的一个包装,子类能够覆写onMeasure()方法实现本身的计算视图大小的方式,并经过setMeasuredDimension(width, height)保存计算结果。布局

(2)关于MeasureSpec:学习

**UPSPECIFIED:**父容器对于子容器没有任何限制,子容器想要多大就多大.ui

**EXACTLY:**父容器已经为子容器设置了尺寸,子容器应当服从这些边界,不论子容器想要多大的空间.spa

**AT_MOST:**子容器能够是声明大小内的任意大小.

**layout操做 **

用于设置视图在屏幕中显示的位置。在view中定义为final类型,要求子类不能修改。layout()函数中有两个基本操做:

(1)setFrame(l,t,r,b),l,t,r,b即子视图在父视图中的具体位置,该函数用于将这些参数保存起来;

(2)onLayout(),在View中这个函数什么都不会作,提供该函数主要是为viewGroup类型布局子视图用的;

draw操做

利用前两部获得的参数,将视图显示在屏幕上,到这里也就完成了整个的视图绘制工做。其内部定义了绘图的基本操做:

(1)绘制背景;

(2)若是要视图显示渐变框,这里会作一些前期工做;

(3)绘制视图自己,即调用onDraw()函数。在view中onDraw()是个空函数,也就是说具体的视图都要覆写该函数来实现本身的显示。

(4)绘制子视图,即dispatchDraw()函数。在view中这是个空函数,具体的视图不须要实现该方法,它是专门为容器类准备的,也就是容器类必须实现该方法;

(5)应用程序调用了setVerticalFadingEdge或者setHorizontalFadingEdge,若是须要能够开始绘制渐变框;

(6)绘制滚动条;

从上面能够看出自定义View须要最少覆写onMeasure()和onDraw()两个方法。

自定义View的方法

onFinishInflate(): 回调方法,当应用从XML加载该组件并用它构建界面以后调用的方法

onMeasure():检测View组件及其子组件的大小

onLayout(): 当该组件须要分配其子组件的位置、大小时

onSizeChange():当该组件的大小被改变时

onDraw(): 当组件将要绘制它的内容时

onKeyDown: 当按下某个键盘时

onKeyUp:  当松开某个键盘时

onTrackballEvent: 当发生轨迹球事件时

onTouchEvent: 当发生触屏事件时

onWindowFocusChanged(boolean):当该组件获得、失去焦点时

onAtrrachedToWindow():当把该组件放入到某个窗口时

onDetachedFromWindow():当把该组件从某个窗口上分离时触发的方法

onWindowVisibilityChanged(int):当包含该组件的窗口的可见性发生改变时触发的方法

三、效果图展现

d301762c14c975e8250dfdc4a37c9fef.png

四、代码展现

在java代码中我加了不少注释,方便进行理解、学习。

布局文件

android:id="@+id/container"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_margin="20dp"

/>

复制代码

自定义控件类

public class Customize extends View {

private final static String TAG = Customize.class.getSimpleName();

private Paint mPaint;

private RectF oval;

public Customize(Context context) {

super(context);

init();

}

public Customize(Context context, AttributeSet attrs) {

super(context, attrs);

init();

}

public Customize(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

init();

}

private void init(){

mPaint = new Paint();

mPaint.setAntiAlias(true);

oval=new RectF();

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

int widthMode = MeasureSpec.getMode(widthMeasureSpec);

int widthSize = MeasureSpec.getSize(widthMeasureSpec);

int heightMode = MeasureSpec.getMode(heightMeasureSpec);

int heightSize = MeasureSpec.getSize(heightMeasureSpec);

switch (widthMode) {

case MeasureSpec.EXACTLY:

break;

case MeasureSpec.AT_MOST:

break;

case MeasureSpec.UNSPECIFIED:

break;

}

}

@Override

protected void onLayout(boolean changed, int left, int top, int right, int bottom) {

super.onLayout(changed, left, top, right, bottom);

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

//设置演颜色

mPaint.setColor(Color.GREEN);

// FILL填充, STROKE描边,FILL_AND_STROKE填充和描边

mPaint.setStyle(Paint.Style.FILL_AND_STROKE);

//获取控件的宽度和高度

int with = getWidth();

int height = getHeight();

//设置圆的半径

float radius = with / 4;

//画圆,设置颜色

canvas.drawCircle(with / 2, with / 2, radius, mPaint);

mPaint.setColor(Color.BLUE);

//用于定义的圆弧的形状和大小的界限

oval.set(with / 2 - radius, with / 2 - radius, with / 2

+ radius, with / 2 + radius);

//根据进度画圆弧

canvas.drawArc(oval, 270, 90, true, mPaint);

//画出另外一个圆弧

mPaint.setColor(Color.YELLOW);

canvas.drawArc(oval, 360, 120, true, mPaint);

}

}

复制代码

MainActivity类

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

}

}

复制代码

有兴趣的朋友或者有疑问的朋友欢迎留言讨论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值