2012-04-23 35 views
43

Tôi có một ứng dụng ImageView trong ứng dụng có thể được đặt ở bất kỳ đâu trên màn hìnhCách tạo hoạt ảnh với Chế độ hoạt hình trong Android

Khi chạm vào Tôi muốn di chuyển chế độ xem này ở giữa màn hình. Tôi đã thử chức năng này với Dịch hoạt hình và chức năng RELATIVE_TO_PARENT của nó như sau

TranslateAnimation translateAnimation1 = new TranslateAnimation(
     TranslateAnimation.RELATIVE_TO_PARENT,0.0f, 
     TranslateAnimation.RELATIVE_TO_PARENT,0.5f, 
     TranslateAnimation.RELATIVE_TO_PARENT,0.0f, 
     TranslateAnimation.RELATIVE_TO_PARENT,0.5f); 

nhưng ImageView di chuyển 50% (màn hình) xuống từ vị trí hiện tại của nó.

Có cách nào để di chuyển chế độ xem này đến giữa màn hình bất kể vị trí hiện tại của nó không?

Trả lời

71

Để di chuyển Chế độ xem ở bất kỳ đâu trên màn hình, tôi khuyên bạn nên đặt nó ở bố cục toàn màn hình. Bằng cách đó, bạn sẽ không phải lo lắng về các mẩu hoặc tọa độ tương đối.

Bạn có thể thử mẫu này mã:

main.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" android:id="@+id/rootLayout"> 

    <Button 
     android:id="@+id/btn1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="MOVE" android:layout_centerHorizontal="true"/> 

    <ImageView 
     android:id="@+id/img1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/ic_launcher" android:layout_marginLeft="10dip"/> 
    <ImageView 
     android:id="@+id/img2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/ic_launcher" android:layout_centerVertical="true" android:layout_alignParentRight="true"/> 
    <ImageView 
     android:id="@+id/img3" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/ic_launcher" android:layout_marginLeft="60dip" android:layout_alignParentBottom="true" android:layout_marginBottom="100dip"/> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:orientation="vertical" android:clipChildren="false" android:clipToPadding="false"> 

     <ImageView 
      android:id="@+id/img4" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:src="@drawable/ic_launcher" android:layout_marginLeft="60dip" android:layout_marginTop="150dip"/> 
    </LinearLayout> 

</RelativeLayout> 

hoạt động của bạn

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    ((Button) findViewById(R.id.btn1)).setOnClickListener(new OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
      ImageView img = (ImageView) findViewById(R.id.img1);    
      moveViewToScreenCenter(img); 
      img = (ImageView) findViewById(R.id.img2); 
      moveViewToScreenCenter(img); 
      img = (ImageView) findViewById(R.id.img3);     
      moveViewToScreenCenter(img); 
      img = (ImageView) findViewById(R.id.img4); 
      moveViewToScreenCenter(img); 
     } 
    }); 
} 

private void moveViewToScreenCenter(View view) 
{ 
    RelativeLayout root = (RelativeLayout) findViewById(R.id.rootLayout); 
    DisplayMetrics dm = new DisplayMetrics(); 
    this.getWindowManager().getDefaultDisplay().getMetrics(dm); 
    int statusBarOffset = dm.heightPixels - root.getMeasuredHeight(); 

    int originalPos[] = new int[2]; 
    view.getLocationOnScreen(originalPos); 

    int xDest = dm.widthPixels/2; 
    xDest -= (view.getMeasuredWidth()/2); 
    int yDest = dm.heightPixels/2 - (view.getMeasuredHeight()/2) - statusBarOffset; 

    TranslateAnimation anim = new TranslateAnimation(0, xDest - originalPos[0] , 0, yDest - originalPos[1]); 
    anim.setDuration(1000); 
    anim.setFillAfter(true); 
    view.startAnimation(anim); 
} 

Phương pháp moveViewToScreenCenter được tọa độ tuyệt đối của Xem và tính toán bao nhiêu khoảng cách phải di chuyển từ vị trí hiện tại của nó để đến trung tâm của màn hình. Biến số statusBarOffset đo chiều cao thanh trạng thái.

Tôi hy vọng bạn có thể tiếp tục với ví dụ này. Hãy nhớ rằng sau khi hoạt ảnh, vị trí của chế độ xem của bạn vẫn là vị trí ban đầu. Nếu bạn chạm vào nút MOVE một lần nữa và một lần nữa chuyển động tương tự sẽ lặp lại. Nếu bạn muốn thay đổi vị trí của chế độ xem, hãy thực hiện sau khi hoạt ảnh kết thúc.

+0

Tôi đã sử dụng moveViewToScreenCenter này nhưng đã thay đổi nó để di chuyển chế độ xem lên trên cùng bên phải của màn hình. Nó hoạt động khi được khởi chạy từ một nút như trong ví dụ của bạn, nhưng khi khởi chạy moveViewToScreenCenter từ onCreate, khung nhìn sẽ đi theo một cách hoàn toàn khác. Có vẻ như originalPos luôn là [0,0] cho một View trong onCreate. Đưa cái gì? – Jonny

+5

Trong kích thước chế độ xem 'onCreate' là 0 vì hoạt động chưa hiển thị với người dùng. Thử đặt cuộc gọi trong phương thức 'onWindowFocusChanged'. –

+0

Nó không thức dậy cho tôi, quan điểm của tôi di chuyển xuống! –

Các vấn đề liên quan