2010-10-07 44 views
1

我在製作一個ImageButton,它包含一個可繪製動畫,更確切地說是一個進度條微調器的重複的補間動畫(就像存在的視圖/小部件一樣)。android UI:帶動畫的ImageButton

在XML我在活動的佈局指定本作的ImageButton:

<ImageButton android:id="@+id/i_back_cover" android:layout_width="wrap_content" 
    android:layout_height="wrap_content" android:scaleType="centerInside" 
    android:gravity="center" android:layout_weight="1" android:adjustViewBounds="true" 
    android:src="@anim/progress_large"> 
</ImageButton> 

的 「progress_large」 動畫是在res /動畫/:

<set xmlns:android="http://schemas.android.com/apk/res/android" 
    android:interpolator="@android:anim/linear_interpolator"> 
    <rotate 
     android:drawable="@drawable/spinner_black_76" 
     android:pivotX="50%" 
     android:pivotY="50%" 
     android:fromDegrees="0" 
     android:toDegrees="350" 
     android:duration="1200" /> 
</set> 

我設置toDegrees 350現在,以確保它會旋轉。 spinner_black_76只是一個圖像。

當我打開具有此佈局的活動時,應用程序在顯示之前崩潰。

奇怪,有日誌中沒有實際的堆棧跟蹤,只是殺了VM,如果我是正確的(我幾乎不能相信這一點我自己):

10-07 21:16:18.467: INFO/ActivityManager(59): Starting activity: Intent { act=android.intent.action.EDIT dat=content://net.lp.collectionista.products/items/book/1 cmp=net.lp.collectionista/.ui.activities.items.book.BookItemEditWindow } 
10-07 21:16:18.687: DEBUG/AndroidRuntime(636): Shutting down VM 
10-07 21:16:18.687: WARN/dalvikvm(636): threadid=1: thread exiting with uncaught exception (group=0x4001d800) 
10-07 21:16:18.687: DEBUG/FlurryAgent(636): Ending session 
10-07 21:16:18.977: DEBUG/dalvikvm(636): GC_FOR_MALLOC freed 3876 objects/597200 bytes in 98ms 
10-07 21:16:19.007: WARN/ActivityManager(59): Force finishing activity net.lp.collectionista/.ui.activities.items.book.BookItemEditWindow 
10-07 21:16:19.016: WARN/ActivityManager(59): Force finishing activity net.lp.collectionista/.ui.activities.collections.book.BookCollectionViewWindow 
10-07 21:16:19.507: WARN/ActivityManager(59): Activity pause timeout for HistoryRecord{43fec528 net.lp.collectionista/.ui.activities.items.book.BookItemEditWindow} 
10-07 21:16:21.437: INFO/Process(636): Sending signal. PID: 636 SIG: 9 
10-07 21:16:21.487: INFO/ActivityManager(59): Process net.lp.collectionista (pid 636) has died. 
10-07 21:16:21.517: INFO/WindowManager(59): WIN DEATH: Window{4400f330 net.lp.collectionista/net.lp.collectionista.ui.activities.CollectionsListWindow paused=false} 
10-07 21:16:21.517: INFO/WindowManager(59): WIN DEATH: Window{43fc89d0 net.lp.collectionista/net.lp.collectionista.ui.activities.collections.book.BookCollectionViewWindow paused=true} 
10-07 21:16:21.667: INFO/UsageStats(59): Unexpected resume of com.android.launcher while already resumed in net.lp.collectionista 
10-07 21:16:21.727: WARN/InputManagerService(59): Got RemoteException sending setActive(false) notification to pid 636 uid 10034 
10-07 21:16:27.237: DEBUG/dalvikvm(278): GC_EXPLICIT freed 32 objects/1616 bytes in 81ms 
10-07 21:18:14.047: DEBUG/AndroidRuntime(654): >>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<< 

我是什麼在這種情況下做錯了什麼?或者什麼是更好的方式讓按鈕上的進度條繞着微調器?

+0

崩潰後的logcat輸出是什麼? – Cristian 2010-10-07 19:40:04

+0

@pvj:嘗試將'ImageButton'設置爲'@ drawable/spinner_black_76',以確保它以某種方式與動畫綁定。 – CommonsWare 2010-10-07 20:42:44

+0

@CommonsWare:馬克,這就是我現在使用的。它只是顯示靜態環,並正常工作。 – pjv 2010-10-07 20:47:17

回答

3

::打額頭::

我應該在開始評論之前就已經意識到了這一點。

我期待讓包含動畫繪製的ImageButton的,更準確地說是進度微調(如視圖/小部件存在此)的重複補間動畫。

這不是一個AnimationDrawableAnimationDrawable是一個框架動畫,而不是一個補間。由於您的動畫的documentation XML指示:

編譯資源數據類型:指向動畫的資源指針。

而對於frame animation

編譯的資源數據類型:資源指針的AnimationDrawable。

因此,我不認爲你可以做你想要做的事情,你試圖做到這一點。您可以使用框架動畫並使用少量手動旋轉版本的圖形。

+0

你說得對。補間動畫不是可繪製的,因此我不應該把它放在'android:src'標籤中。事實上,它在res/anim中也應該放棄它。我的錯。有趣的是,如果您將其與簡單的本機ProgressBar xml代碼進行比較,則自己製作旋轉進度條並不是一件容易的事情。最簡單的方法就是自己動手製作動畫中的12個項目,這些項目是靜態的xml旋轉繪圖。謝謝 – pjv 2010-10-07 21:17:16

+0

實際上,ImageButton似乎希望保存一個BitmapDrawable(當它不能從xml中獲取時,它不會抱怨)。所以我上面描述的框架動畫AnimationDrawable的想法也是行不通的。必須嘗試一個.gif。 – pjv 2010-10-07 21:48:25

+0

@pjv:保證GIF在2.1及更低版本下不會工作。可能在2.2上工作 - 我知道添加了一些動畫GIF支持,但我不確定在哪裏。您也可以嘗試將'ImageView'懸浮在無標題的'Button'上,其中'ImageView'將click事件傳遞到'Button'。 – CommonsWare 2010-10-07 21:57:22

4

好了,這個問題有一個公認的答案,是18個月前,但以防萬一別人發現這一點,這似乎爲我工作:

在XML佈局:

 <FrameLayout 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent" 
      android:layout_gravity="center" 
      android:gravity="center"> 

      <ImageButton 
       android:id="@+id/property_button_gps" 
       android:layout_width="wrap_content" 
       android:layout_height="fill_parent" 
       android:layout_alignParentLeft="true" 
       android:paddingTop="@dimen/standardPadding" 
       android:paddingBottom="@dimen/standardPadding" 
       android:background="@drawable/gps_blank" 
       android:src="@drawable/gps_icon"> 
      </ImageButton> 

      <LinearLayout 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center" 
       android:gravity="center"> 

       <ProgressBar 
        android:id="@+id/property_gps_spinner" 
        style="@android:style/Widget.ProgressBar.Small" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:paddingTop="@dimen/standardPadding" 
        android:paddingBottom="@dimen/standardPadding" 
        android:background="@null" 
        android:visibility="gone" /> 
      </LinearLayout> 
     </FrameLayout> 

和這個在java代碼:

/** 
* This method will hide the GPS button image and replace it with a loading spinner 
*/ 
private void showGpsLoading() { 
    gpsSpinner.setVisibility(View.VISIBLE); 
    gpsButton.setImageDrawable(null); 
} 

/** 
* This method will hide the GPS loading spinner and replace it with the GPS button image. 
*/ 
public void hideGpsLoading() { 
    gpsSpinner.setVisibility(View.GONE); 
    gpsButton.setImageResource(R.drawable.gps_icon); 
} 
+0

這是兩個佈局有點貴。 LinearLayout也不是多餘的? – pjv 2012-03-20 19:31:24