2012-04-13 77 views
2

可有人請給一個小白解釋動畫視圖所以它的觸摸區域和圖像實際上一起移動的正確方法?如何正確移動視圖?

我已經閱讀了大量的帖子和問題和教程,但沒有解釋什麼是移動的佈局和圖像,這樣我可以動畫視圖,然後讓它在新的位置移動。

這是一個例子方法我的工作,嘗試許多不同的組合來沒有成功。該視圖位於父親RelativeLayout中。這是一個可觸摸的圖標菜單,通過點擊一個xml資源進行動畫製作,從屏幕上滑出,只留下一個小小的選項卡,在需要停留的地方再次點擊。

public void RetractTools (View v){  
    final ImageView finalImage1 = (ImageView) findViewById(R.id.paintsView); 
    Animation slideout = AnimationUtils.loadAnimation(this, R.anim.slideout_tools); 
    slideout.setFillAfter(true); 
    slideout.setAnimationListener(new AnimationListener() { 
     @Override 
     public void onAnimationEnd(Animation animation) { 
      finalImage1.setEnabled(true); 
      optionMenu.showing = false; 
      optionMenu.inMotion = false; 
      finalImage1.layout(1258, 668, 1697, 752); 
      finalImage1.setRight(1280); 
      finalImage1.invalidate(); 
     } 

     @Override 
     public void onAnimationRepeat(Animation arg0) { 
     } 

     @Override 
     public void onAnimationStart(Animation arg0) { 
      finalImage1.setEnabled(false); 
     } 
    }); 

    optionMenu.inMotion = true; 
    v.startAnimation(slideout); 
}// End RetractMenu 

無論我嘗試什麼,我遇到問題。 setFillAfter在xml文件中設置時不執行任何操作。以編程方式設置,它將圖像保留在正確的位置,但觸摸控件仍保留在菜單所在的位置。我已經嘗試setLeft和setRight,它顯然只是移動圖像,而不是視圖位置,以及各種不同的佈局選項,填充和不填充和無效,但不能解決它。我清楚地不瞭解定位和渲染視圖所需的底層機制! :d

感謝。

編輯:解

對於遇到類似問題的人,這是怎麼了,我發現相對於佈局工作。您創建一個具有指定大小的LayoutParams對象,然後您可以爲其分配位置。例如。

final RelativeLayout.LayoutParams position = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);   
    position.leftMargin = 440; 

然後分配給您的視圖

myView.setLayoutParams(position); 

因此,在總結,你使用的LayoutParams對象爲您的視圖的位置的接口,而不是直接訪問視圖的座標,因爲我假設。

回答

2

你有什麼是基本正常,有兩個缺陷:

  1. 您正在使用setFillAfter(),這是不是特別有用

  2. 要調用layout()setRight()之類的東西,這是不特別有效

取而代之的是,在onAnimationEnd()中,您需要修改的以反映您希望小部件所處的新位置。小部件的大小和位置由與其容器協商的佈局規則決定。最初,這些是通過佈局XML資源設置的。通過在運行時修改LayoutParams,您正在改變這些規則。

那些LayoutParams是(LinearLayout.LayoutParams,RelativeLayout.LayoutParams等)和你應該指定什麼值,我們不能告訴你,因爲我們不知道你在做什麼。

+0

謝謝。我想.Layout()直接更改佈局參數?如果我使用setFillAfter和setRight線刪除相同的代碼,那麼它將工作,除了在動畫結束時出現一幀毛刺,其中沒有畫任何東西。 這些值適用於固定功能顯示。這是我自己在TF101上使用的私人應用程序,所以我不在乎使用硬編碼值。 ;) – 2012-04-13 13:09:15

+0

另外,如果我保留setFillAfter()並刪除.Layout(),那麼動畫就是我想要的,但視圖的觸摸佈局仍然存在。 – 2012-04-13 13:14:59

+0

@TickledPink:「我以爲.Layout()直接改變了佈局參數?」 - 它們將被佈局驅動規則取代。這就是爲什麼你需要調整'LayoutParams'。 – CommonsWare 2012-04-13 13:21:54