2009-10-13 82 views
11

當我使用圖庫部件,我怎麼得到的圖像說規模達 & 上被選中,並縮小 & 上是未選擇未煥發煥發Android:圖庫視圖中的動畫?

我見過的所有教程有這種效果,但我沒能看到它... ...

是否有某種的動畫,我要附加到畫廊的?

+0

我正在做同樣的事情,但它不是在一些Android設備上工作,如果您已在圖庫視圖中實現此動畫,請發送給我代碼。 – Hasmukh 2013-10-10 06:06:09

回答

15

希望這是有幫助的。我設法用Gallery小部件「模擬」縮小/增長解決方案。由於他們刪除了getScale(),事情變得有點複雜。我認爲這不是最好的解決方案,但至少我可以接受它。

我發現的是Gallery管理重點極其糟糕。因此,第一種方法是在顯示的ImageView上添加焦點更改偵聽器,但在那裏沒有運氣。焦點在那裏是一個MESS ......就這一點而言,所選圖像並不是當前關注的視圖。我發送了一封郵件給android-developers郵件列表,關於API doc上的一些錯誤(關於focusSearch()方法和一些關注內容)。

這裏是我解決這個問題:

建立一個動畫資源,以「成長」的形象:

<?xml version="1.0" encoding="utf-8"?> 
<scale xmlns:android="http://schemas.android.com/apk/res/android" 
     android:fromXScale="1.0" 
     android:toXScale="1.10" 
     android:fromYScale="1.0" 
     android:toYScale="1.10" 
     android:duration="300" 
     android:pivotX="50%" 
     android:pivotY="50%" 
     android:interpolator="@android:anim/accelerate_decelerate_interpolator" 
     android:fillAfter="false"/> 

如果你沒有得到什麼意思,那麼你應該繼續閱讀this

這將是我們'增長'的效果,您需要將它保存在:res/anim/grow.xml或任何適合您的名稱(但始終在res/anim目錄中)。

您可以按照here的資源指南創建一個Gallery視圖。每當Gallery對象調用getView()時,ImageAdapter就會生成一個ImageView。你可以實現一個解決方法是添加一行到getView()方法標識Viewposition,這種方式:

... 
i.setId(position); 
... 

隨着該行添加到ImageAdpater對象的getView()方法,你就可以明確識別例如:

g.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
    public void onItemSelected (AdapterView<?> parent, View v, int position, long id) { 
     Animation grow = AnimationUtils.loadAnimation(YourActivity.this, R.anim.grow); 

     View sideView = parent.findViewById(position - 1); 
     if (sideView != null) 
      ((ImageView)sideView).setLayoutParams(new Gallery.LayoutParams(150, 100)); 

     sideView = parent.findViewById(position + 1); 
     if (sideView != null) 
      ((ImageView)sideView).setLayoutParams(new Gallery.LayoutParams(150, 100)); 

     v.startAnimation(grow); 
     v.setLayoutParams(new Gallery.LayoutParams(170, 150)); 
    } 

    public void onNothingSelected (AdapterView<?> parent) { 
     System.out.println("NOTHING SELECTED"); 

    } 
    }); 

注意:您可能會注意到,來自動畫和佈局參數的所有值都由我選擇。這是因爲我不打算爲你清理代碼。而且,這只是一個解決方法,這個小部件或android視圖系統的BAD焦點問題。如果焦點沒問題,那麼你所需要做的就是設置一個焦點變化偵聽器,它在聚焦/未聚焦時會使gros /縮小。

我希望這可以幫助你找到解決你的問題的一種方式,

問候,

新編輯:這是我設置的聽衆,我還增加了行i.clearAnimation()getView()方法:

private class SelectListener implements AdapterView.OnItemSelectedListener { 
    private Animation grow; 
    private int last; 

    public SelectListener() { 
     grow = AnimationUtils.loadAnimation(RouteGallery.this, R.anim.grow); 
     last = 0; 
    } 

    public void onItemSelected (AdapterView<?> parent, View v, int position, long id) { 
     View sideView = parent.findViewById(last); 
     if (sideView != null && last != position) 
      sideView.clearAnimation(); 

     v.startAnimation(grow); 
     last = position; 
    } 

    public void onNothingSelected (AdapterView<?> parent) { 
    } 
} 
+0

編輯:投到'ImageView'是徒勞.. – Sebastian 2010-07-07 17:13:47

+0

真棒!謝謝! – davs 2010-11-17 18:03:28

+0

+1沒有看到這個。接受爲答案。謝謝你的時間傢伙!很有幫助。 – Legend 2013-10-11 01:14:13

4

您需要使用ImageSwitcher。 ImageSwitcher具有設置輸入和輸出動畫的方法(當圖像被選擇和取消選擇,或選擇和替換時)。

following link有一個很好的教程,關於如何將其與圖庫結合使用。

+0

哇...這是一個了不起的網站...!感謝一噸... – Legend 2009-10-14 15:32:26

+0

對不起,我沒有注意到它,但我仍然無法找到一種方法來放大和縮小imageswitcher本身的圖像...我的意思是可見的頂部...點擊時,它應該給我們一個正常的大小,其他尺寸縮小...我錯過了一些簡單的解決方案嗎? – Legend 2009-10-14 16:03:14

2

我實現了一個類似的動畫是這樣的:

final Animation shrink = AnimationUtils.loadAnimation(activity, R.anim.shrink); 
shrink.setFillAfter(true); 

gallery.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 

      // This iterates through the views which are currently displayed on screen. 
      for (int k=0; k<gallery.getChildCount(); k++){ 
       // Do whatever else you want, here. 
       // This is how you get a particular element of a view 
       ImageView background = (ImageView) gallery.getChildAt(k).findViewById(R.id.menu_item_background); 

       //clear animation 
       gallery.getChildAt(k).clearAnimation(); 

      } 

      // Scale the selected one 
      view.startAnimation(shrink); 

     } 

     @Override 
     public void onNothingSelected(AdapterView<?> adapterView) {} 

    });