个人学习经历,仅供参考
自定义view的步骤:
1.重写构造方法
我写了一个自定义类RectView,重写了三个
public class RectView extends View {
public RectView(Context context) {
//在java代码中调用,比如new RectView();
super(context);
}
public RectView(Context context, AttributeSet attrs) {
//在布局的xml中定义的时候调用
super(context, attrs);
}
public RectView(Context context, AttributeSet attrs, int defStyleAttr) {
//有style属性的时候调用
super(context, attrs, defStyleAttr);
}
}
2.画笔的定义
private void init() {
paint.setFlags(Paint.ANTI_ALIAS_FLAG); //设置一些标志,比如抗锯齿,下划线等等。
paint.setStrokeWidth(5f); //设置画笔的宽度
paint.setColor(Color.RED); //设置画笔颜色
paint.setStyle(Paint.Style.FILL); //画笔的样式 填充
// Paint.Style.FILL_AND_STROKE; 填充+描边
// Paint.Style.STROKE; 描边
}
更多关于Paint的方法:Android Paint的使用详解
3.在onDraw()
方法中画出你想要的图形
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawCircle(500,500,200,paint);
}
public class RectView extends View {
Paint paint=new Paint(); //画笔
public RectView(Context context) {
super(context);
}
public RectView(Context context, AttributeSet attrs) {
super(context, attrs);
init(); //在xml中调用的,所以在这里初始化
}
public RectView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
private void init() {
paint.setFlags(Paint.ANTI_ALIAS_FLAG); //设置一些标志,比如抗锯齿,下划线等等。
paint.setStrokeWidth(5f); //设置画笔的宽度
paint.setColor(Color.RED); //设置画笔颜色
paint.setStyle(Paint.Style.FILL); //画笔的样式 填充
// Paint.Style.FILL_AND_STROKE; 填充+描边
// Paint.Style.STROKE; 描边
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawCircle(500,500,200,paint);
}
}
在布局文件中引用即可
5.添加触摸事件
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
Log.d("TOUCH", "onTouchEvent: 按下");
break;
case MotionEvent.ACTION_MOVE:
Log.d("TOUCH", "onTouchEvent: 移动");
break;
case MotionEvent.ACTION_UP:
Log.d("TOUCH", "onTouchEvent: 抬起 ");
break;
}
return false;
/*设为true 和 false的效果是有区别的:
setOnTouchListener 单独使用的时候返回值需要为true,这样才能保证移动的时候能后获取相应的监听,而非一次监听(即每次只有一个按下的事件)
setOnTouchListener 和 setOnClickListener 同时使用时,onTouch 的返回值要设为 false,这样既可以保证按下移动抬起事件可以被监听,并且点击事件也会被监听。*/
}