android開發學習 ------- 自定義View 圓 ,其點擊事件 及 確定當前view的層級關系


我需要實現下面的效果:   參考文章:https://blog.csdn.net/halaoda/article/details/78177069

涉及的View事件分發機制 https://www.jianshu.com/p/38015afcdb58  (最全面的原理性文章)

   https://www.jianshu.com/p/e99b5e8bd67b   

點擊綠色的圓 - Toast ("點擊大圓的區域")

點擊黃色的圓 - Toast ("點擊小圓的區域")

點擊兩個圓以外的區域 - Toast ("點擊圓以外的區域")

 


/**
* Created by lemon on 2018/3/28.
* 自定義圓形
*/

public class MyCircle extends View{

private Context context;
/**
* 屏幕的寬
*/
private int width;
/**
* 屏幕的高
*/
private int height;
/**
* 大圓的半徑
*/
private float bigR;
/**
* 小圓的半徑
*/
private float litterR;
/**
* 屏幕中間點的X坐標 - 小圓 大圓 圓心的x坐標
*/
private float centerX,centerXlittle;
/**
* 屏幕中間點的Y坐標 - 小圓 大圓 圓心的y坐標
*/
private float centerY,centerYlittle;

/**
*構造函數,由調用此類的的context傳遞width height
*/
public MyCircle(Context context, int width, int height) {
super(context);
this.context = context ;
this.width = width ;
this.height = height ;
setFocusable(true);
//Toast.makeText(context,"width="+width+"<---->height="+height,Toast.LENGTH_SHORT).show();
//設置兩個圓的半徑
bigR = (width - 100)/4;
litterR = bigR/2;

//屏幕的中點-大圓的中心坐標
centerX = width/2;
centerY = height/2;
//小圓的中心坐標
centerXlittle = centerX + bigR ;
centerYlittle = centerY + bigR - 120;
}

/**
*繪制兩個圓的情況
*/
@Override
protected void onDraw(Canvas canvas) {
//畫背景顏色
/*Paint bg = new Paint();
bg.setColor(Color.WHITE);
Rect bgR = new Rect(0,0,width,height);
canvas.drawRect(bgR,bg);*/

//float start = 0F;
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);// 構建Paint時直接加上去鋸齒屬性
//我們一共畫兩個圓
for(int i=0 ; i<2 ; i++){
/**
* 第一種是用圓弧來畫一個圓
在android中Rect和RextF都是用來創建一個矩形的
Rect的參數是int型 ,RectF的參數是float型.
根據中心點 來確定上下左右 的矩形
RectF bigOval = new RectF(centerX - bigR,centerY - bigR,centerX + bigR,
centerY + bigR);
// drawArc - 畫圓弧
// 第一個參數定義的圓弧的形狀和大小的范圍
// 第二個參數的作用是設置圓弧是從哪個角度來順時針繪畫的
// 第三個參數 這個參數的作用是設置圓弧掃過的角度
// 第四個參數 這個參數的作用是設置我們的圓弧在繪畫的時候,是否經過圓形
// 第五個參數 這個參數的作用是設置我們的畫筆對象的屬性
paint.setColor(Color.GREEN);
canvas.drawArc(bigOval,start,360,true,paint);
*/


/**
* 第二種可以直接畫出圓
*/
paint.setColor(Color.GREEN);
//(圓心x0,圓心y0,半徑,paint)
canvas.drawCircle(centerX,centerY,bigR,paint);


/* RectF littleOval = new RectF(centerXlittle - litterR,centerYlittle - litterR,
centerXlittle + litterR, centerYlittle + litterR);
paint.setColor(Color.YELLOW);
canvas.drawArc(littleOval,start,360,true,paint);*/

paint.setColor(Color.YELLOW);
//(圓心x0,圓心y0,半徑,paint)
canvas.drawCircle(centerXlittle,centerYlittle,litterR,paint);
}
super.onDraw(canvas);
}


/**
* View類的dispatchTouchEvent()方法默認實現就是能幫你調用View自己的onTouchEvent方法
*/
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
return super.dispatchTouchEvent(event);//默認實現,可以不寫
}


/**
* 如果View想處理事件,則view設置為clickable 或 復寫 onTouchEvent(),return true;
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
//獲取點擊屏幕時的點的坐標
float x = event.getX();
float y = event.getY();
whichCircle(x,y);
return true;//返回true,代表事件已經消費,事件已經終止。
// return false; 調用父類的onTouchEvent()
// return super.onTouchEvent(event);
}


/**
* 確定點擊的點在哪個圓內
*/
private void whichCircle(float x,float y){
//將屏幕中的點轉換成以屏幕中心為原點的坐標點
float mx = x - centerX;
float my = y - centerY;
float result = mx*mx + my*my ;

float lx = x - centerXlittle;
float ly = y - centerYlittle;
float resultlittle = lx*lx + ly *ly;


if(resultlittle <= litterR*litterR){
Toast.makeText(context,"點擊了小圓的區域",Toast.LENGTH_SHORT).show();
}else if(result <= bigR*bigR){
Toast.makeText(context,"點擊了大圓的區域",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(context,"點擊了圓以外的區域",Toast.LENGTH_SHORT).show();
}

}
}
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
      //  setContentView(R.layout.activity_main);
        DisplayMetrics metrics = new DisplayMetrics();
        this.getWindowManager().getDefaultDisplay().getMetrics(metrics);
        //屏幕的分辨率
        int width = metrics.widthPixels;
        int height = metrics.heightPixels;
        setContentView(new MyCirclebig(this,width,height));
    }
}

 

確定當前view的層級關系

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM