2010-10-07 40 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