点击打开链接--大神链接一
点击打开链接--大神链接二
介绍:很多控件在编写代码是感觉不是很好,想要更方便就要学会自定义View,自定义View可以是组合、继承、自绘控件,在这里,就有一篇较简单的自定义View
效果图:
效果介绍:自定义控件为圆形且为红色,随着手指的滑动而滑动
效果分析:
1.
创建自定义View类BallView,自定义属性:ball_size
2. 在values下
新建attrs.xml文件,自定义属性ball_size,可以在布局文件里设置小球的大小
3.
实现onDraw()方法;
1) 用canvas将屏幕设为白色
2) 设置画笔颜色为红色
3) 绘制小圆作为小球,半径通过自定义属性设置
4. 实现onTouchEvent方法,处理触摸事件;
1) 实现MotionEvent.ACTION_DOWN,记录按下的x,y坐标
2) 实现MotionEvent.ACTION_MOVE 记录移动的x,y坐标
3) 实现MotionEvent.ACTION_UP 记录抬起的x,y坐标
4) 使用 postInvalidate()方法实现重绘小球,跟随手指移动
代码实现:
注释:attrs在values下
<com.b.zzz.views.BallView
android:layout_width="100dp"
android:layout_height="100dp"
attrs:ball_size="20sp"/>
public class BallView extends View {
private Paint mpaint;
private TypedArray ta;
private float dimension;
private int l;
private int r;
private int t;
private int b;
private int lastX;
private int lastY;
public BallView(Context context) {
this(context, null);
}
public BallView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public BallView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
//自定义ballsize
ta = context.obtainStyledAttributes(attrs, R.styleable.BallView, defStyleAttr, 0);
dimension = ta.getDimension(R.styleable.BallView_ball_size, 40);
//自定义画笔
mpaint = new Paint(Paint.ANTI_ALIAS_FLAG);//抗锯齿
mpaint.setColor(Color.RED);//颜色
mpaint.setStrokeWidth(3);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//用canvas将屏幕设为白色
canvas.drawColor(Color.WHITE);
//绘制小圆作为小球,半径通过自定义属性设置
canvas.drawCircle(100, 100, dimension, mpaint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
//获取开始的坐标
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
//获取移动时候的坐标
//减去手指按下时候的坐标
//得到移动的间距
int mX = (int) event.getRawX();
int dx = mX - lastX;
int mY = (int) event.getRawY();
int dy = mY - lastY;
//将间距,加到原来的坐标(上下左右)
int l = getLeft();
int r = getRight();
int t = getTop();
int b = getBottom();
l = l + dx;
r = r + dx;
t = t + dy;
b = b + dy;
//判断是否溢出屏幕
// if (l<0){
// l = 0;
// r = getWidth();
// }
//重新赋值给布局
layout(l, t, r, b);//规定了View的位置
//将lastX,lastY重新赋值
lastX = mX;
lastY = mY;
break;
case MotionEvent.ACTION_UP:
break;
}
return true;//返回true代表自己处理事件
}
}