一、自绘控件 继承的是 View
自绘控件的意思就是,这个View上所展现的内容全部都是我们自己绘制出来的。绘制的代码是写在onDraw()方法中的,而这部分内容我们已经在 Android视图绘制流程完全解析
牢记三个方法:
1.onMeasure(int,int)测量:该方法来检查view组件及他所包含的所有子组件的大小;
2.onLayout(boolean,int,int,int,int)位置:当该组件要分配其子组件的位置,大小时调用;(使用频率较少)
3.onDraw(canves)绘制:当该组件将要绘制他的内容时,回调该方法;(使用频率最高,不要在此方法里做耗时操作和对象的建立(代码容易出现错误));
下面实现一个可以拖动的小球:
实现步骤:
1.类继承View(从一个普通的类变成一个控件)
2复写他必须复写的三个方法(这三个方法主要做初始化的逻辑)
我们需要只在最后一个方法中写initView这个方法,并且在前两个方法中也能调用;
这里就用到了java中所学的重载
布局:
3.在OnMeasure和onDrawer方法中写对应的业务逻辑;
下面是代码:
public class MyView extends View{ private int height;
private int width;
private int x;
private int y;
private int mRadius=100;
private double sqrt;
private int xx;
private int yy;
private boolean onBall; //在代码中使用自定义控件(new MyView也就是动态创建对象),自动回调此方法;
public MyView(Context context) {
this(context,null);//此处修改
}
//XML布局使用此自定义控件,自动回调此方法;(也就是在XML中利用包名.类名来写这个自定义控件)
public MyView(Context context, AttributeSet attrs) {
this(context,null,0);//此处修改
}
//XML布局中使用此自定义控件,且带有样式,自动回调;
public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView();
}
//自定义控件初始化操作
private void initView() {
} @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//获取当前空间的宽和高
height = this.getHeight();
width = this.getWidth();
//获取屏幕的正中心点
x = width / 2;
y = height / 2;
}
//此方法进行绘制
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint=new Paint();
paint.setColor(Color.GREEN);
//画圆,根据需要的参数,来给他设置
canvas.drawCircle(x,y,mRadius,paint);
}
//使用触摸事件来实现小球拖动
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN://按下
xx = (int)event.getX();
yy = (int)event.getY();
//判断用户手是否点击在圆上
onBall = isOnBall(xx, yy);
break;
case MotionEvent.ACTION_MOVE://移动
//进行判断用户手机是否在圆上
if (onBall){
x = (int)event.getX();
y = (int)event.getY();
//时时回调onDrawer方法
postInvalidate();
} break;
case MotionEvent.ACTION_UP://松开 break;
}
return true;
} private boolean isOnBall(int xx, int yy) {
//勾股定理,得到按下的半径
sqrt = Math.sqrt((xx - x) * (xx - x) + (yy - y) * yy - y);
//对应圆的半径和按下半径进行判断,看用户的手是否点在圆上
if (sqrt<=mRadius){
return true;
}
return false;
}
}
二、组合控件 继承ViewGroup
组合控件的意思就是,我们并不需要自己去绘制视图上显示的内容,而只是用系统原生的控件就好了,但我们可以将几个系统原生的控件组合到一起,这样创建出的控件就被称为组合控件。
我们的需求是需要实现(点击减号中间文本减一,点击加一;最小不能小于1,最大不能大于5)
效果图:
1.首先创建一个类(继承ViewGroup下的任意自定义控件)
重写三个方法&#x