2011-05-16 76 views
8

我在imageview中運行的動畫拒絕保持圖像幀的縱橫比。在所以下面的答案是相當有價值的信息,但似乎並沒有爲我工作: How to scale an Image in ImageView to keep the aspect ratioAndroid:如何在動畫中保持縱橫比

下面是代碼:

private void startAnimation(){ 
    mImageView.setAdjustViewBounds(true); 
    mImageView.setScaleType(ScaleType.CENTER); 
    mImageView.setBackgroundResource(R.anim.my_animation); 

    AnimationDrawable frameAnimation = (AnimationDrawable) mImageView.getBackground(); 

    // Start the animation (looped playback by default). 
    frameAnimation.start(); 
} 

R.anim.my_animation只是一個動畫列表:

<animation-list xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/selected" 
android:oneshot="false"> 
<item 
    android:drawable="@drawable/photo_1" 
    android:duration="100" /> 
<item 
    android:drawable="@drawable/photo__2" 
    android:duration="100" /> 
    ... and so on... 
</animation-list> 
+1

根據您引用的問題,該解決方案使用了XML佈局。發佈您的XML佈局,以便我們可以驗證您是否正確定義了參數。 – user432209 2011-05-16 16:56:21

+0

@ user432209:+1。你幫我弄清楚我的錯誤。我已經將imageview的高度和寬度設置爲絕對值(因爲它顯示了除動畫之外的其他東西)。刪除可以解決問題。謝謝! – OceanBlue 2011-05-16 18:37:52

回答

0

這有點棘手,但它的工作原理。 我有我的動畫列表兩張圖片

<animation-list xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/selected" android:oneshot="false"> 
    <item android:drawable="@drawable/logo1" android:duration="5000" /> 
    <item android:drawable="@drawable/logo2" android:duration="300" /> 
</animation-list> 

然後,我增加了第三個畫面(logo0)即是LOGO1/2的大小相同,但它是完全透明的。 最後,我用這個ImageView的:

<ImageView 
    android:id="@+id/imageViewLogo" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" 
    android:adjustViewBounds="true" 
    android:layout_margin="5dp" 
    android:src="@drawable/logo0" 
/> 

現在我的動畫保存我的圖片標誌的寬高比*。

的代碼是:

@Override 
    public void onCreate(Bundle savedInstanceState) { 
    ... 
    imageView = (ImageView) findViewById(R.id.imageViewLogo); 
    imageView.setBackgroundResource(R.drawable.logo_animation); 
    ... 


    public void onWindowFocusChanged (boolean hasFocus) { 
    super.onWindowFocusChanged(hasFocus); 
    AnimationDrawable frameAnimation = (AnimationDrawable) imageView.getBackground(); 
    if(hasFocus) { frameAnimation.start(); } else { frameAnimation.stop(); } 
    } 

這是非常簡單的,它的成本只是一個額外的虛擬圖像到你的資源:沒有多餘的代碼,沒有複雜的計算。

10

不是在imageview的背景中設置可繪製動畫,而是使用src在前景中設置它,並讓動畫在那裏播放。如果您爲圖像視圖設置了合適的比例類型,則框架動畫中的所有圖像都將調整爲縱橫比不變。

private void startAnimation(){ 
    mImageView.setAdjustViewBounds(true); 
    mImageView.setScaleType(ScaleType.CENTER); 
    mImageView.setImageDrawable(getResources().getDrawable(R.anim.my_animation)); 

    AnimationDrawable frameAnimation = (AnimationDrawable) mImageView.getDrawable(); 

    // Start the animation (looped playback by default). 
    frameAnimation.start(); 
} 
+0

我提高了解決問題的答案。注意,你只能簡單地使用'mImageView.setImageResource(R.anim.my_animation)'。 – 2015-07-28 08:20:01

+0

謝謝,你救了我的一天:) – iscariot 2016-11-24 09:47:56

相關問題