国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Android > 正文

Android如何判斷當(dāng)前點(diǎn)擊位置是否在圓的內(nèi)部

2019-12-12 00:51:08
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

我們都知道,一個(gè)圓形的ImageView控件(本項(xiàng)目中使用的圓形控件是github上的),其實(shí)所占的區(qū)域還是正方形區(qū)域,只是顯示內(nèi)容為圓形,當(dāng)我們給ImageView設(shè)置觸摸事件時(shí),沒(méi)有顯示區(qū)域也會(huì)相應(yīng)點(diǎn)擊事件,而我們可以通過(guò)計(jì)算當(dāng)前點(diǎn)擊的位置來(lái)判斷ImageView是否相應(yīng)觸摸事件。

效果如圖所示:

如上圖所示,當(dāng)點(diǎn)擊圓之內(nèi)拖動(dòng)時(shí),圓跟著移動(dòng),但是點(diǎn)擊圓之外拖動(dòng)時(shí),圓沒(méi)有任何反應(yīng)。

要實(shí)現(xiàn)這個(gè)效果并不難,首先,先計(jì)算出圓的中心點(diǎn)坐標(biāo)(x1,y1),注意,x1,y1是相對(duì)于屏幕的坐標(biāo),不是相對(duì)于布局的坐標(biāo);
然后獲取當(dāng)前按下的坐標(biāo)(x2,y2),只需要計(jì)算出當(dāng)前按下的點(diǎn)的坐標(biāo)(x2,y2)與圓心(x1,y1)的距離d的長(zhǎng)度,然后與圓的半徑r相比較,如果d>r則當(dāng)前按下的點(diǎn)在圓之外,如果d<r,則當(dāng)前按下的點(diǎn)在圓之內(nèi), 如下圖所示:

這樣注意一下,以上都應(yīng)在MotionEvent.ACTION_DOWN里面計(jì)算,當(dāng)距離d大于半徑r時(shí),return false,則當(dāng)前控件不消費(fèi)事件,

代碼如下:

public class MainActivity extends Activity { int lastX; int lastY; boolean isView = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final CircleImageView civ = (CircleImageView) findViewById(R.id.civ_levitate); civ.setOnTouchListener(new View.OnTouchListener() {  @Override  public boolean onTouch(View v, MotionEvent event) {  switch (event.getAction()){   case MotionEvent.ACTION_DOWN:   lastX = (int) event.getRawX();   lastY = (int) event.getRawY();   //獲取控件在屏幕的位置   int[] location = new int[2];   civ.getLocationOnScreen(location);   //控件相對(duì)于屏幕的x與y坐標(biāo)   int x = location[0];   int y = location[1];   //圓半徑 通過(guò)左右坐標(biāo)計(jì)算獲得getLeft   int r = (civ.getRight()-civ.getLeft())/2;   //圓心坐標(biāo)   int vCenterX = x+r;   int vCenterY = y+r;   //點(diǎn)擊位置x坐標(biāo)與圓心的x坐標(biāo)的距離   int distanceX = Math.abs(vCenterX-lastX);   //點(diǎn)擊位置y坐標(biāo)與圓心的y坐標(biāo)的距離   int distanceY = Math.abs(vCenterY-lastY);   //點(diǎn)擊位置與圓心的直線距離   int distanceZ = (int) Math.sqrt(Math.pow(distanceX,2)+Math.pow(distanceY,2));   //如果點(diǎn)擊位置與圓心的距離大于圓的半徑,證明點(diǎn)擊位置沒(méi)有在圓內(nèi)   if(distanceZ > r){    return false;   }   isView = true;   break;   case MotionEvent.ACTION_MOVE:   if(isView){    int moveX = (int) event.getRawX();    int moveY = (int) event.getRawY();    int disX = moveX - lastX;    int disY = moveY - lastY;    int left = civ.getLeft()+disX;    int right = civ.getRight()+disX;    int top = civ.getTop()+disY;    int bottom =     civ.getBottom()+disY;    civ.layout(left,top,right,bottom);    lastX = moveX;    lastY = moveY;   }   break;   case MotionEvent.ACTION_UP:   isView = false;   break;  }  return true;  } }); }}

好了,demo下載地址:點(diǎn)擊下載

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 上思县| 北川| 定远县| 绍兴市| 通河县| 介休市| 陈巴尔虎旗| 资溪县| 兖州市| 井研县| 洞口县| 漳浦县| 嫩江县| 陆良县| 临清市| 宽甸| 井陉县| 景德镇市| 成武县| 巴南区| 连平县| 汉寿县| 天峨县| 光山县| 资溪县| 环江| 兴文县| 成武县| 陇南市| 会宁县| 申扎县| 平度市| 宁陕县| 淮北市| 万州区| 武隆县| 永泰县| 漠河县| 镇赉县| 西盟| 常熟市|