手指拖動小球移動,點選空白處,小球不跟著移動
阿新 • • 發佈:2018-12-19
package com.example.xxx.circle; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import java.util.Random; /** * date:2018/11/1 * author:薛鑫欣(吧啦吧啦) * function: */ public class Cicle extends View { private Paint paint; //定義畫筆 private int radius = 20; private int mHeight,mWiddth; private int X,Y;//小球的位置 private int x1,y1;//滑鼠點選的位置 //定義顏色陣列 private int colorArray[] = {Color.BLACK,Color.BLACK,Color.GREEN,Color.YELLOW, Color.RED}; private int paintColor = colorArray[0]; //定義畫筆預設顏色 private boolean mFlag; public Cicle(Context context) { this(context,null); } public Cicle(Context context, AttributeSet attrs) { this(context,attrs,0); } public Cicle(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); //初始化畫筆 initPaint(); } private void initPaint(){ paint = new Paint(); //設定消除鋸齒 paint.setAntiAlias(true); //設定畫筆顏色 paint.setColor(paintColor); } //繪製小球 @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //將螢幕設定為白色 canvas.drawColor(Color.WHITE); //隨機設定畫筆顏色 setPaintRandomColor(); //繪製小圓作為小球 canvas.drawCircle(X, Y, radius, paint); } //為畫筆設定隨機顏色 private void setPaintRandomColor(){ Random rand = new Random(); int randomIndex = rand.nextInt(colorArray.length); paint.setColor(colorArray[randomIndex]); } //設定小球在中心位置 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); mHeight=this.getHeight(); mWiddth=this.getWidth(); X=mWiddth/2; Y=mHeight/2; } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()){ //當手指按下時計算是否點在圓內 case MotionEvent.ACTION_DOWN: x1 = (int) event.getX(); y1 = (int) event.getY(); mFlag =jiSuan(x1,y1); break; case MotionEvent.ACTION_MOVE: case MotionEvent.ACTION_UP: if(mFlag){ // 擡起 X= (int) event.getX(); Y= (int) event.getY(); // 通知重繪 postInvalidate(); } break; } return true; } private boolean jiSuan(int x1, int y1) { //利用勾股定義計算小球是否在圓內 double sqrt=Math.sqrt((x1-X)*(x1-X)+(y1-Y)*(y1-Y)); if(sqrt<radius){ return true; } return false; } }