導航:首頁 > 操作系統 > android中心點旋轉

android中心點旋轉

發布時間:2023-01-18 19:48:25

A. android繪圖之Canvas變換(6)

前面講解了Canvas的基本概念, Android繪圖之Canvas概念理解(5) ,
對Canvas的概念進行了分析,但是沒有說明和屏幕的關系,Canvas不等於屏幕,屏幕不會動的,我們也無法對屏幕進行(平移,縮放等)操作,只能對Canvas進行操作,所以對Canvas進行操作,屏幕不動,最終會導致看到的圖像不同。

下面開始講解Canvas的變幻操作:
包括:translate,rotate,scale,skew,clip,clipout,matrix

先從最簡單的平移開始:

對Canvas進行平移,
dx: x軸方向進行平移,正值向屏幕右側
dy:y軸方向進行平移,正值向屏幕下方

繪制兩個點查看原點位置。

原點顯然改變了,以後再繪制任何形狀都是以translate後的原點開始繪制。

參數說明
sx:橫向的縮放,默認為1,小數縮小,整數放大
sy:縱向的縮放,默認為1,小數縮小,整數放大

px,py,看源碼知道是先translate,執行sx,sy然後再translate反方向。
第二次translate的坐標為(-px sx,-px sy),最終的效果就是px,py是縮放後不動的點。

縮放後坐標減半。

如果想控制縮放後的位置,如何控制呢,這就需要第二個函數。

還可以控制其他位置,例如控制縮放後在中心。

rotate有兩個函數:
rotate(float degrees)
rotate(float degrees, float px, float py)
Degree:旋轉的角度,正值為順時針,負值為逆時針
Px,py:旋轉的中心,如果不指定旋轉中心默認為(0,0)點

指定旋轉中心為矩形中心

參數說明:
sx:畫布在x方向上傾斜相應的角度,sx傾斜角度的tan值,
sy:畫布在y軸方向上傾斜相應的角度,sy為傾斜角度的tan值,

根據矩形或者路徑裁剪畫布,畫布被切割之後,只有部分區域可用,其他區域無法繪制內容。
Clip函數切割的區域可用,clipOut未被切割的區域可用。(過時函數不再講解)

Matrix提供了一些方法來控制變換:

android繪圖之Paint(1)
android繪圖之Canvas基礎(2)
Android繪圖之Path(3)
Android繪圖之drawText繪制文本相關(4)
Android繪圖之Canvas概念理解(5)
Android繪圖之Canvas變換(6)
Android繪圖之Canvas狀態保存和恢復(7)
Android繪圖之PathEffect (8)
Android繪圖之LinearGradient線性漸變(9)
Android繪圖之SweepGradient(10)
Android繪圖之RadialGradient 放射漸變(11)
Android繪制之BitmapShader(12)
Android繪圖之ComposeShader,PorterDuff.mode及Xfermode(13)
Android繪圖之drawText,getTextBounds,measureText,FontMetrics,基線(14)
Android繪圖之貝塞爾曲線簡介(15)
Android繪圖之PathMeasure(16)
Android 動態修改漸變 GradientDrawable

B. 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矩陣的應用。

C. android 中用畫布旋轉圖片的時候怎麼讓讓他 圍著一個坐標旋轉

方法只有一種。

步驟:

1、畫布平移坐標原點

2、旋轉畫布

示例代碼

java">canvas.save();//保存當前畫布狀態
canvas.translate(x,y);//將坐標中心平移到要圍繞的坐標點x,y
canvas.rotate(90);//旋轉角度,這里比如90度
canvas.restore();//恢復畫圖狀態到保存前

D. android中如何讓圖標繞一個中心點旋轉

1、定義一個ImageView
定義一個ImageView是為了裝載圖片,其中的圖片將被rotate用來進行旋轉,其他View亦可。
資源文件為
Java代碼
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/infoOperating"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/operating"
android:scaleType="center">
</ImageView>
</LinearLayout>
其中的android:src為圖片內容,可使用附件中的圖片。
java代碼為
Java代碼
ImageView infoOperatingIV = (ImageView)findViewById(R.id.infoOperating);

2、定義rotate旋轉效果
在res/anim文件夾下新建tip.xml文件,內容如下
Java代碼
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<rotate
android:fromDegrees="0"
android:toDegrees="359"
android:ration="500"
android:repeatCount="-1"
android:pivotX="50%"
android:pivotY="50%" />
</set>
含義表示從0到359度開始循環旋轉,0-359(若設置成360在停止時會出現停頓現象)度旋轉所用時間為500ms,旋轉中心距離view的左頂點為50%距離,距離view的上邊緣為50%距離,即正中心,具體每個含義見下面的具體屬性介紹。
java代碼為
Java代碼
Animation operatingAnim = AnimationUtils.loadAnimation(this, R.anim.tip);
LinearInterpolator lin = new LinearInterpolator();
operatingAnim.setInterpolator(lin);
setInterpolator表示設置旋轉速率。LinearInterpolator為勻速效果,Accelerateinterpolator為加速效果、DecelerateInterpolator為減速效果,具體可見下面android:interpolator的介紹。

a. 關於其中的屬性意義如下(紅色部分加以注意):
android:fromDegrees 起始的角度度數
android:toDegrees 結束的角度度數,負數表示逆時針,正數表示順時針。如10圈則比android:fromDegrees大3600即可
android:pivotX 旋轉中心的X坐標
浮點數或是百分比。浮點數表示相對於Object的左邊緣,如5; 百分比表示相對於Object的左邊緣,如5%; 另一種百分比表示相對於父容器的左邊緣,如5%p; 一般設置為50%表示在Object中心
android:pivotY 旋轉中心的Y坐標
浮點數或是百分比。浮點數表示相對於Object的上邊緣,如5; 百分比表示相對於Object的上邊緣,如5%; 另一種百分比表示相對於父容器的上邊緣,如5%p; 一般設置為50%表示在Object中心
android:ration 表示從android:fromDegrees轉動到android:toDegrees所花費的時間,單位為毫秒。可以用來計算速度。
android:interpolator表示變化率,但不是運行速度。一個插補屬性,可以將動畫效果設置為加速,減速,反復,反彈等。默認為開始和結束慢中間快,
android:startOffset 在調用start函數之後等待開始運行的時間,單位為毫秒,若為10,表示10ms後開始運行
android:repeatCount 重復的次數,默認為0,必須是int,可以為-1表示不停止
android:repeatMode 重復的模式,默認為restart,即重頭開始重新運行,可以為reverse即從結束開始向前重新運行。在android:repeatCount大於0或為infinite時生效
android:detachWallpaper 表示是否在壁紙上運行
android:zAdjustment 表示被animated的內容在運行時在z軸上的位置,默認為normal。
normal保持內容當前的z軸順序
top運行時在最頂層顯示
bottom運行時在最底層顯示

b. 運行速度
運行速度為運行時間(android:ration)除以運行角度差(android:toDegrees-android:fromDegrees),比如android:ration為1000,android:toDegrees為360,android:fromDegrees為0就表示1秒轉1圈。

c. 循環運行
Java代碼
android:fromDegrees="0"
android:toDegrees="360"
android:repeatCount="-1"
android:repeatCount="-1"即表示循環運行,配合上android:fromDegrees="0" android:toDegrees="360"表示不間斷

3、開始和停止旋轉
在操作開始之前調用
Java代碼
if (operatingAnim != null) {
infoOperatingIV.startAnimation(operatingAnim);
}
在操作完成時調用
Java代碼
infoOperatingIV.clearAnimation();
許多朋友不知道如何停止旋轉animation,所以強制設置rotate轉動多少圈表示操作,但卻無法與操作實際的進度匹配上,實際上只要如上代碼所示清除animation即可。

閱讀全文

與android中心點旋轉相關的資料

熱點內容
程序員那麼可愛陸漓和姜逸城吻戲 瀏覽:802
android獲取窗口大小 瀏覽:180
程序員為世界帶來的貢獻 瀏覽:214
程序員招聘自薦信 瀏覽:693
魔獸鍵位設置命令宏 瀏覽:645
程序員沒有目標了 瀏覽:828
搶答器c程序編程 瀏覽:703
什麼app可以自己玩 瀏覽:76
刨客app是什麼 瀏覽:963
cad輸入命令欄不見了 瀏覽:834
做故事集可以用什麼app 瀏覽:692
qq郵箱發送壓縮包 瀏覽:672
程序員桌面機器人 瀏覽:589
xjr快速開發平台源碼 瀏覽:159
java介面runnable 瀏覽:31
python怎麼運行web伺服器 瀏覽:349
notepad編程代碼 瀏覽:740
什麼安卓的毛病最少 瀏覽:611
hp的pjl設備訪問命令 瀏覽:635
googlewebp圖片壓縮技術 瀏覽:215