當前位置:首頁 » 安卓系統 » android獲取控制項的坐標

android獲取控制項的坐標

發布時間: 2023-04-10 17:29:50

1. 怎樣獲取控制項的屏幕坐標

c#的方式
private void CaptureJpeg()
{
var catchBmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
var g = Graphics.FromImage(catchBmp);
//轉換成控沒察輪件在屏幕上的坐沒備標
var screenPoint = PointToScreen(pictureBox1.Location);
//拷貝屏幕枯信區域到Bitmap
g.CopyFromScreen(screenPoint, new Point(0, 0), new Size(pictureBox1.Width, pictureBox1.Height));
//存文件
catchBmp.Save(string.Format(@"D:\image\{0}.jpg",MAC));
}

2. 請問大俠:我在android界面上任意添加一個Button,怎麼獲取Butoon的中心坐標呢

可以用戚敏銷 (getLeft()+getRight())/2 ,(getBottom()+getHeight()/2) 獲得Button 在屏幕的坐標 你試高游試拿爛

3. 怎樣獲得一個組件相對於父容器的坐標 android

可以在相對布局裡面,再寫一個Linelayout布局,源沖給兩個控制項一樣做賣的權重,也就是android:gravity=1,或者任意數值,只要是一樣的數值。
一般這樣的布局問題,都可以通過權純裂逗重來達到平分的效果,如果受制於手機的虛擬鍵問題,還可以通過設置scrollview來解決。

4. android中獲得控制項的位置(相對於布局文件)

正確的代碼如下所示

java">TextViewtv=(TextView)findViewById(R.id.text);
tv.getViewTreeObserver().addOnGlobalLayoutListener(newOnGlobalLayoutListener(){
@Override
publicvoidonGlobalLayout(){
//這里執行獲取位置大小操作
intleft=tv.getLeft();
inttop=tv.getTop();
intbottom=tv.getBottom();
intright=tv.getRight();
//tv相對於父布局的坐標就得出來了

}
}

view的位置和大小是通過onLayout和onMeasure方法計算出來的,執行到activity的onCreate()方法時,尚未開始計算控制項的大小和位置,所以是取不到的

OnGlobalLayoutListener 是ViewTreeObserver的內部類,當一個視圖樹的布局發生改變時,可以被ViewTreeObserver監聽到,這是一個注冊監聽視圖樹的觀察者(observer),在視圖樹的全局事件改變時得到通知

除了OnGlobalLayoutListener ,ViewTreeObserver還有如下內部類:


interfaceViewTreeObserver.OnGlobalFocusChangeListener

當在一個視圖樹中的焦點狀態發生改變時,所要調用的回調函數的介面類


interfaceViewTreeObserver.OnGlobalLayoutListener

當在一個視圖樹中全局布局發生改變或者視圖樹中的某個視圖的可視狀態發生改變時,所要調用的回調函數的介面類


interfaceViewTreeObserver.OnPreDrawListener

當一個視圖樹將要繪制時,所要調用的回調函數的介面類


interfaceViewTreeObserver.OnScrollChangedListener

當一個視圖樹中的一些組件發生滾動時,所要調用的回調函數的介面類


interfaceViewTreeObserver.OnTouchModeChangeListener

當一個視圖樹的觸摸模式發生改變時,所要調用的回調函數的介面類

5. Android開發 在代碼中怎麼動態改變Button坐標

首先,獲取需要改變的Button 通過Button myButton = findviewById(R.id.xxx);

之後有2種方式改變坐標

第一種,帶動畫的改變

//位移動畫從左到右參數分別為
//x軸方向起始位置x差值,x軸方向結束位置x差值,y軸方向起始位置y差值,y軸方向結束位置y差值
=newTranslateAnimation(fromXDelta,toXDelta,fromYDelta,toYDelta);
translateAnimation.setDuration(300);//設置動畫世界

button.setAnimation(translateAnimation);

上面的示例只是許多動畫中的一種簡單地位移動畫,如果有興趣可以查閱一下android動畫方面的知識

第二種,直接改變控制項的位置

這種方法裡面也有2種不用的情況

//這是第一種直接付給此button新的xy坐標
button.setX();
button.setY();

//這是第二種讓button有一個位移到指定地點
button.setTranslationX();
button.setTranslationY();

第一種直接改變了xy坐標,第二種是添加了坐標位移但是控制項本身的xy坐標還是在原來的位置

6. Android自定義控制項 | 小紅點的三種實現(終結)

上一篇通過在父控制項繪制前景的方式展示小紅點,在布局文件中配置標記控制項就能為任意子控制項添加小紅點。實現方案是」布局文件中配置帶小紅點控制項 id,在父控制項中獲取它們的坐標,並在其右上角繪制圓圈「。但這個方案有一個漏洞,當子控制項做動畫,即子控制項尺寸發生變化時,小紅點不會聯動。效果入下圖:

在父控制項的 draw() , dispatchDraw() , drawChild() 中打 log,子控制項做動畫時都未能捕獲到聯動的事件。

突然想起 androidx.coordinatorlayout.widget.CoordinatorLayout 中的 Behavior ,在 onDependentViewChanged() 中可以實時獲得關聯控制項的屬性變化。它是如何做到的?沿著調用鏈往上查找:

當關聯子控制項發生變化時,會遍歷關聯控制項並將變換通過 onDependentViewChanged() 傳遞出去。沿著調用鏈再往上:

CoordinatorLayout 在 onAttachedToWindow() 時注冊了 View 樹觀察者,子控制項屬性變化時必定會觸發 View樹重繪,這樣就可以在 onPreDraw() 中監聽到它們的屬性變化。

將這套機制照搬到自定義容器控制項 TreasureBox :

這樣當需要繪制小紅點的子控制項屬性發生變化時,標記控制項就可以在 onPreDraw() 中收到通知:

每次 View 樹重繪前都可以在 onPreDraw() 中實時獲取子控制項的寬高及坐標,為了衡銀避免過度重繪,只有當屬性變化時,才觸發父控制項重繪。需要記憶上次重繪的屬性,通過比較就能知道屬性是否發生變更:

還需要變更下小紅點繪制邏輯,之前的邏輯如下:

如果沿用這套繪制邏輯,即使父控制項監聽到子控制項重繪,小紅點也不會跟著聯動。那是因為 View 的 getTop() 和 getRight() 不包含位移值:

而 getX() 和 getY() 則包含了位移值:

只需要將繪制邏輯中的 v.right 和 v.top 換成 v.x 和 v.y ,小紅點就能和動畫聯動了。為控制項添加位移和縮放動畫,測試一下:

GG思密達~
。位移動畫的確會聯動,但縮放並沒有~

打了 log 才發現,View 通過 setScale() 的方式進行動畫時,它的寬高和坐標並不會發生變化。。。

但必然是有一個屬性的值變化了,雖然暫且不知道它是啥?

只能打開 View 源碼,遍歷所有 get 開頭的函數,然後把它們的值列印在 onPreDraw() 中。經過多次嘗試,終於找到了一個函數,它的返回值和咐晌宴子控制項縮放動畫聯動:

當子控制項做縮小動畫時,該函數返回的 Rect 中的 left 會變大而 right 會變小。

函數的返回值在 mLeft , mRight , mTop , mBottom 的基礎上疊加了 matrix 的值。做動畫的屬性值最終都會反映到 matrix 上,這樣一分析好像能自圓其說,即該函數會實時返回 view 因動畫而改變的屬性值。

如此一來,只需要記憶上一次的 Rect ,就能在下次重繪前通過比較得知子控制項是否做了動畫:

繪制小紅點邏輯也要做響應改動:

大功告謹罩成,效果如下:

7. 【安卓開發】怎麼獲取用戶點擊圖片中的坐標

我想你應該是要獲取被用戶點擊的那張圖片的坐標吧,首先給你的圖片加一個監聽,如果被點擊了,獲取手機屏幕的寬高,然後獲取圖片自身的寬高,屏幕的坐標減去圖片的寬高就是該圖片所在的坐標,如果你神則要獲取圖片相對於其他某個舉掘控制項的坐標,只要獲取另一個正瞎核控制項的坐標,然後進行計算就可以了

8. 在android中如何改變控制項的坐標(例如一個button,我想讓它向右移動20dp)

RelativeLayout.LayoutParams ballLp = (android.widget.RelativeLayout.LayoutParams)b.getLayoutParams();
ballLp.leftMargin = 從你控制項的基礎上加20像素;
ballLp.topMargin = 不變:
b.setLayoutParams(ballLp);

這沒有移動的動畫,只是直接跳到次位置上
要有移動的話可以加動畫,或者讓這段代碼執行20次,每次leftMargin增加1就可以了。

熱點內容
重慶壓縮機廠 發布:2025-07-05 00:14:53 瀏覽:756
php55兼容 發布:2025-07-05 00:14:52 瀏覽:543
公主出國訪問 發布:2025-07-05 00:13:26 瀏覽:570
伺服器IP作為登錄IP 發布:2025-07-05 00:10:56 瀏覽:979
防雷支架應配置什麼電纜 發布:2025-07-05 00:05:56 瀏覽:220
iosc語言函數 發布:2025-07-05 00:02:40 瀏覽:993
android打飛機 發布:2025-07-04 23:59:34 瀏覽:210
mr底層演算法 發布:2025-07-04 23:14:59 瀏覽:781
怎麼注冊作業盒子密碼 發布:2025-07-04 23:14:51 瀏覽:924
速達伺服器ip 發布:2025-07-04 23:07:38 瀏覽:262