Android animate Перевести на Android 2.2 - PullRequest
2 голосов
/ 12 сентября 2011

У меня есть два изображения, которые переводятся по клику. анимация работает правильно для одного вида, но для второго - моя анимация не соответствует предоставленным координатам.

когда я щелкаю по верхнему виду изображения (img1), он правильно анимируется по направлению к нижнему виду изображения (img2). Но когда я щелкаю нижнее изображение, оно анимируется откуда-то вниз и перемещается только к исходному положению изображения 2. хотя ожидаемое поведение таково, оно должно анимироваться из своей позиции в начальную позицию просмотра изображения сверху (img1).

Мой xml

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

    <ImageView  
        android:layout_width="100dp" 
        android:layout_height="100dp" 
        android:src="@drawable/letter_f"
        android:layout_alignParentTop="true"
        android:id="@+id/imgview1"
        android:background="@drawable/chart"/>

    <ImageView android:layout_height="100dp" 
        android:layout_width="100dp"
        android:id="@+id/imgview2" 
        android:src="@drawable/letter_g" 
        android:background="@drawable/chart" 
        android:layout_alignParentRight="true"
        android:layout_alignParentBottom="true"/>

</RelativeLayout>

и мой файл класса java

    public class AnimationDemo extends Activity implements OnClickListener
{   
    private ImageView img1;
    private ImageView img2;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        img1 = (ImageView)findViewById(R.id.imgview1);
        img2 = (ImageView)findViewById(R.id.imgview2);        
        img1.setOnClickListener(this);
        img2.setOnClickListener(this);
     }

    @Override
    public void onClick(View arg0) 
    {
        int x1,y1; // Coordinates of first image view
        int x2,y2; //Coordinates of second image view

        ImageView img = (ImageView)arg0;
        x1 = img1.getLeft();
        y1 = img1.getTop();

        x2 = img2.getLeft();
        y2 = img2.getTop();

        TranslateAnimation slide;
        if(arg0 == img1)
        {
            //translate from img view 1 to img view 2
            slide = new TranslateAnimation(Animation.ABSOLUTE,x1,Animation.ABSOLUTE, x2,Animation.ABSOLUTE, y1,Animation.ABSOLUTE,y2 );
        }
        else
        {
            // translate from img view 2 to img view 1
            slide = new TranslateAnimation(Animation.ABSOLUTE,x2,Animation.ABSOLUTE, x1,Animation.ABSOLUTE, y2,Animation.ABSOLUTE,y1);
        }
        slide.setDuration(1000);   
        slide.setFillAfter(true); 
        img.startAnimation(slide);
    }
}

1 Ответ

4 голосов
/ 07 октября 2011

Ваши проблемы связаны с вашим местоположением . Я считаю, что когда анимация перемещается с абсолютными пикселями, это относительно себя. Итак, на второй анимации вы, по сути, переместили ее с x2 = 220 на x1 = 0, а y2 = 419 на y1 = 0. Таким образом, он двигался от (currentX + 220, currentY + 419) к (currentX +0, currentY +0), который = сам по себе

Чтобы решить , этот экземпляр просто отрицает и переключает значения второго объявления слайда следующим образом:

TranslateAnimation slide;
        if(arg0 == img1)
        {
            //translate from img view 1 to img view 2
            slide = new TranslateAnimation(Animation.ABSOLUTE,x1,Animation.ABSOLUTE, x2,Animation.ABSOLUTE, y1,Animation.ABSOLUTE,y2 );
        }
        else
        {
            // translate from img view 2 to img view 1
//            slide = new TranslateAnimation(Animation.ABSOLUTE,x2,Animation.ABSOLUTE, x1,Animation.ABSOLUTE,y2,Animation.ABSOLUTE,y1);
            slide = new TranslateAnimation(Animation.ABSOLUTE,0,Animation.ABSOLUTE, (-x2),Animation.ABSOLUTE,0,Animation.ABSOLUTE, (-y2));
        }

Это происходит только потому, что ваш верхний левый спрайт имеет значение 0,0, хотя . Вы должны серьезно задуматься над тем, как вы перемещаете свои спрайты. Помните, что TranslateAnimation перемещает их относительно их текущих позиций, в основном устанавливает исходное местоположение спрайтов в (0,0).

Может быть неправильно, но надеюсь, что это поможет. У меня это сработало ...

Извините, что так долго возвращался к вам, я потерял ваше сообщение и по какой-то причине не смог найти его снова. Рад, что вы прокомментировали ранее!

...