Android自定义view圆并随手指移动

作者:袖梨 2022-06-25

main代码

publicclassMainActivityextendsAppCompatActivity {
 privateintscreenW;//屏幕宽度
 privateintscreenH;//屏幕高度
 @Override
 protectedvoidonCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 Display dis =this.getWindowManager().getDefaultDisplay();
 // 设置全屏
 requestWindowFeature(Window.FEATURE_NO_TITLE);
 this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
  WindowManager.LayoutParams.FLAG_FULLSCREEN);
 // 获取屏幕宽度
 screenW = dis.getWidth();
 // 获取屏幕高度
 screenH = dis.getHeight();
 setContentView(newMyView(this));
 }
 //自定义绘图类
 classMyViewextendsView {
 privatePaint paint;//定义画笔
 privatefloatcx =50;//圆点默认X坐标
 privatefloatcy =50;//圆点默认Y坐标
 privateintradius =20;
 //定义颜色数组
 privateintcolorArray[] = {Color.BLACK,Color.BLACK,Color.GREEN,Color.YELLOW, Color.RED};
 privateintpaintColor = colorArray[0];//定义画笔默认颜色
 
 publicMyView(Context context) {
  super(context);
  //初始化画笔
  initPaint();
 }
 privatevoidinitPaint(){
  paint =newPaint();
  //设置消除锯齿
  paint.setAntiAlias(true);
  //设置画笔颜色
  paint.setColor(paintColor);
 }
 
 //重写onDraw方法实现绘图操作
 @Override
 protectedvoidonDraw(Canvas canvas) {
  super.onDraw(canvas);
  //将屏幕设置为白色
  canvas.drawColor(Color.WHITE);
  //修正圆点坐标
  revise();
  //随机设置画笔颜色
  setPaintRandomColor();
  //绘制小圆作为小球
  canvas.drawCircle(cx, cy, radius, paint);
 }
 
 //为画笔设置随机颜色
 privatevoidsetPaintRandomColor(){
  Random rand =newRandom();
  intrandomIndex = rand.nextInt(colorArray.length);
  paint.setColor(colorArray[randomIndex]);
 }
 
 //修正圆点坐标
 privatevoidrevise(){
  if(cx <= radius){
  cx = radius;
  }elseif(cx >= (screenW-radius)){
  cx = screenW-radius;
  }
  if(cy <= radius){
  cy = radius;
  }elseif(cy >= (screenH-radius)){
  cy = screenH-radius;
  }
 }
 
 @Override
 publicbooleanonTouchEvent(MotionEvent event) {
  switch(event.getAction()) {
  caseMotionEvent.ACTION_DOWN:
   // 按下
   cx = (int) event.getX();
   cy = (int) event.getY();
   // 通知重绘
   postInvalidate();//该方法会调用onDraw方法,重新绘图
   break;
  caseMotionEvent.ACTION_MOVE:
   // 移动
   cx = (int) event.getX();
   cy = (int) event.getY();
   // 通知重绘
   postInvalidate();
   break;
  caseMotionEvent.ACTION_UP:
   // 抬起
   cx = (int) event.getX();
   cy = (int) event.getY();
   // 通知重绘
   postInvalidate();
   break;
  }
 
  /*
  * 备注1:此处一定要将return super.onTouchEvent(event)修改为return true,原因是:
  * 1)父类的onTouchEvent(event)方法可能没有做任何处理,但是返回了false。
  * 2)一旦返回false,在该方法中再也不会收到MotionEvent.ACTION_MOVE及MotionEvent.ACTION_UP事件。
  */
  //return super.onTouchEvent(event);
  returntrue;
 } }
 
 
}

布局


 

相关文章

精彩推荐