自定义一个圆形,并能单击拖动
定义一个类继承View,实现构造器方法
绘制圆形,重新onDraw方法,使用其参数canvas调用drawCircle,并添其必须参数即可
使绘制的图形可以拖动,要重写其onTouchEvent方法,并对其事件状态进行操作,具体下面代码有详细操作
public class MyCircleView extends View { //画笔 private Paint mPaint; //圆的半径 private float mRadius = 50f; //圆的圆心的x坐标 private float pointX = mRadius; //圆的圆心的Y坐标 private float pointY = mRadius; //控制是否可以移动的变量 true的时候可以移动 private boolean moveable; public MyCircleView(Context context) { super(context); } //自定义veiw在布局中使用,必须实现的一个构造器 public MyCircleView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); //构造一个paint mPaint = new Paint(); mPaint.setColor(Color.RED); //设置一个抗锯齿 mPaint.setAntiAlias(true); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //根据圆心的坐标来绘制圆的位置的,而圆心的坐标,我们触摸屏幕的时候被我们修改了 canvas.drawCircle(pointX,pointY,mRadius,mPaint); } @Override public boolean onTouchEvent(MotionEvent event) { //手指触摸的x坐标 float touchX; //手指触摸的y坐标 float touchY; //event.getAction()判断事件的类型 switch (event.getAction()){ //按下的事件 case MotionEvent.ACTION_DOWN: touchX = event.getX(); touchY = event.getY(); if (touchX > pointX - mRadius && touchX < pointX + mRadius && touchY > pointY - mRadius && touchY < pointY + mRadius){ moveable=true; Toast.makeText(getContext(), "我按下了", Toast.LENGTH_LONG).show(); }else{ moveable=false; } break; //移动的事件 case MotionEvent.ACTION_MOVE: if (moveable) { //重新设置一下圆心的位置, 把我们圆心的位置(pointX,pointY)设置成 // 当前触摸的位置(event.getX(),event.getY()) pointX = event.getX(); pointY = event.getY(); //去重新绘制, 会重新走onDraw()方法 invalidate(); } break; //抬起的事件 case MotionEvent.ACTION_UP: break; } return true; } }
定义好类之后,需在xml中引用,如下:包名+类名
<com.hgz.test.test.MyCircleView android:id="@+id/circle" android:layout_width="match_parent" android:layout_height="match_parent" ></com.hgz.test.test.MyCircleView>