當前位置:首頁 » 安卓系統 » android控制項縮放

android控制項縮放

發布時間: 2025-05-28 09:53:54

⑴ Android自定義控制項之可平移、縮放、旋轉圖片控制項

先上效果圖

源碼

單點拖動圖片對圖片進行平移操作。雙手縮放圖片大小和旋轉圖片到一定的角度。圖片縮放的時候 不能大於最大的縮放因子和小於最小的縮放因子。大於最大縮放因子或者小於最小縮放因子需要對圖像進行回彈。圖片旋轉的角度只能為90度的倍數,不滿足90度要進行回彈。圖片回彈要一個漸變的效果。

大體思路: 首先,Android中提供了Matrix類可以對圖像進行處理。其次,要顯示一張圖片最容易想到的就是ImageView。回彈要求漸變的過程,可以通過屬性動畫進行設置。所以大體的思路是:繼承ImageView,重寫onTouchEvent()方法,判斷事件類型,在對應的事件使用Matrix對圖像進行變換。
Matrix是一個已經封裝好的矩陣,最重要的作用就是對坐標點進行變換。
舉個栗子:
1.某個點(x0,y0,1)通過單位矩陣E映射得到的點還是(x0,y0,1)。

3.點(x0,y0,1)通過矩陣T映射得到的點就會做如下的變換

可以看到點(x0,y0,1)經過T矩陣在x軸方向上平移了dx,在y軸方向上平移了dy。

通過以上的變換可以得到具體的思路: 我們維護一個圖像對應的矩陣mCurrentMatrix,該矩陣主要是對ImageView中的圖像的各個點進行映射。ImageView在容器位置擺放完成之後,置mCurrentMatrix矩陣為單位矩陣。當onTouchEvent()方法中觸發單點觸控並且手指進行平移的時候,調用矩陣mCurrentMatrix的postTranslate(dx,dy),對mCurrentMatrix進行變換。當手指抬起,利用變換結束後的矩陣對圖像的各個點進行映射,從而得到平移變換後的圖像。同理可得,在兩只手指進行縮放旋轉的時候,我們對矩陣mCurrentMatrix進行各種變換,當縮放旋轉的事件結束再利用變換完的矩陣去映射圖像的各個點,從而得到縮放、旋轉後的圖像。

安卓自定義View進階 - Matrix原理
安卓自定義View進階 - Matrix詳解

首先理清事件的邏輯:

初始化圖像大小和位置

縮放圖像大小和控制項大小自適應,平移圖像中心和控制項中心重合

onTouchEvent()函數

平移操作

將圖像對應的矩陣進行變換。

縮放操作

mBoundRectF為記錄圖像邊界的矩形。縮放的時候選取圖像的中心進行縮放。

旋轉操作

旋轉的時候旋轉的旋轉中心也是圖像的中心

圖像中各個點的映射

調用ImageView的setImageMatrix(Matrix matrix)會讓ImageView根據設置的matrix去重新繪制圖像。

更新圖像的矩形邊界

獲得圖像的矩形,並根據矩陣映射矩形各個點的坐標。

縮放回彈

旋轉回彈

一些計算方法

要求圖像的變換是一個漸變的過程,很容易想到的就是屬性動畫。因為屬性動畫本身就是對值進行不斷set的過程。而我們維護的矩陣也是一個值,所以很自然可以想到,如果得到回彈之前的矩陣的值以及回彈之後矩陣的值,就可以根據動畫監聽器中動畫當前的系數值去改變矩陣的值。

對animator對象設置完監聽器之後,就可以在手指抬起的時候調用屬性動畫的start()方法開啟動畫。

自定義可平移、縮放、旋轉的控制項主要點有兩個方面:一是onTouchEvent()中判斷平移、旋轉、縮放的觸發條件,平移位移量、縮放比例因子、旋轉角度的計算。二是Matrix矩陣的應用。

⑵ 求一個實現android布局文件整體縮放的實現方法

題主可以先繼承布局類,如另寫一個類繼承LineatLayout ,然後實現onMeasure()方法,在方法裡面獲取布局的寬度和高度,再根據獲取到的寬度和高度 設置控制項內元素的寬高,比如元素Title的高 TitleHeight = measureHeight *0.5 ,意思是占布局高的二分之一,這時就可以整體縮放了。
onmeasure()內獲取寬高的方法:
int measureWidth = measureWidth(widthMeasureSpec);
int measureHeight = measureHeight(heightMeasureSpec);

其中寬度的函數:
private int measureWidth(int widthMeasureSpec) {
int specMode = MeasureSpec.getMode(widthMeasureSpec);
int specSize = MeasureSpec.getSize(widthMeasureSpec);
int result = 500;
if (specMode == MeasureSpec.AT_MOST) {
result = specSize;
} else if (specMode == MeasureSpec.EXACTLY) {
result = specSize;
}
return result;
}

⑶ 最新的百度地圖Android開發包中,如何隱藏右下角的放大縮小控制項

// 隱藏縮放控制項

int childCount = mMapView.getChildCount();

View zoom = null;

for (int i = 0; i < childCount; i++) {

View child = mMapView.getChildAt(i);

if (child instanceof ZoomControls) {

zoom = child;

break;

}

}

zoom.setVisibility(View.GONE);

// 隱藏比例尺控制項

int count = mMapView.getChildCount();

View scale = null;

for (int i = 0; i < count; i++) {

View child = mMapView.getChildAt(i);

if (child instanceof ZoomControls) {

scale = child;

break;

}

}

scale.setVisibility(View.GONE);

// 隱藏指南針

mUiSettings = mBaiMap.getUiSettings();

mUiSettings.setCompassEnabled(true);

// 刪除網路地圖logo

mMapView.removeViewAt(1);

熱點內容
如何讓蘋果藍牙耳機在安卓上顯示電量 發布:2025-05-29 16:55:52 瀏覽:565
帶有模組的幾個伺服器名字和地址 發布:2025-05-29 16:49:08 瀏覽:273
創新在配置中起什麼作用 發布:2025-05-29 16:47:37 瀏覽:402
編程器術語 發布:2025-05-29 16:36:54 瀏覽:93
c語言整數轉字元 發布:2025-05-29 16:35:33 瀏覽:767
顏值高的配置有哪些 發布:2025-05-29 16:35:28 瀏覽:137
實邊演算法 發布:2025-05-29 16:35:26 瀏覽:471
什麼配置才能帶動地平線4 發布:2025-05-29 16:34:49 瀏覽:683
minecraft伺服器怎麼建 發布:2025-05-29 16:33:19 瀏覽:644
網頁的編譯器有哪些 發布:2025-05-29 16:29:24 瀏覽:170