1. 程式人生 > >手指拖動小球移動,點選空白處,小球不跟著移動

手指拖動小球移動,點選空白處,小球不跟著移動

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;


    }
}