Анимации: как мне перевести ImageView из / в видимость на экране - PullRequest
2 голосов
/ 27 сентября 2010

Я использую translate анимацию:

<?xml version="1.0" encoding="utf-8"?>
<set
  xmlns:android="http://schemas.android.com/apk/res/android">
  <translate
    android:fromXDelta="-75%p"
    android:toXDelta="0%p"
    android:duration="1000" />
</set>

на базовом ImageView.Эта анимация будет сдвигать изображение слева до тех пор, пока оно не достигнет правого края экрана.У меня есть OnClickListener, установленный на ImageView, который переключает его с выдвижения и работает - отлично работает.

Проблема: Кажется, что ImageView не на самом деле , перемещаякоординаты, но он просто выглядит как будто он движется.Когда ImageView виден только частично (в ожидании анимации на экране), если я нажимаю на область, где будет ImageView, если бы она была выдвинута, анимация запускается (OnClickListener отключается).

Я не нажимал на ImageView!

Вопрос: Итак, компоненты с такой анимацией на самом деле не двигаются?Как я могу обработать это событие onClick, так как это может быть неожиданным для анимации при нажатии на экран, где ImageView не виден пользователю?

Ответы [ 2 ]

4 голосов
/ 28 сентября 2010

Вы правы, компоненты на самом деле не перемещаются, только их визуализированный растровый буфер.После анимации за пределами экрана вы можете использовать View.setVisibility(View.GONE);, чтобы заставить его действительно исчезать.

Если ваша цель состоит в том, чтобы небольшая часть вида оставалась видимой, чтобы позволить пользователю сдвинуть ее обратно на экран, вы можете рассмотреть возможность использования SlidingDrawer .

0 голосов
/ 11 марта 2012

На самом деле вы можете создать свою собственную анимацию, которая фактически перемещает ImageView, таким образом, вы всегда сможете щелкнуть по ней.

Конечно, это будет зависеть от ваших обстоятельств, но, скажем, вы хотите переместить изображение на ось X, отрегулировав левое поле, у вас будет что-то вроде:

public class ViewLeftMarginAnimation extends Animation {
    int startMargin;
    int targetMargin;
    View view;

    public ViewGrowAnimation(View view, int start, int target) {
        this.view = view;
        this.start = height;
        this.targetHeight = toHeight;
        this.setInterpolator(new DecelerateInterpolator());
        this.setDuration(1000);
    }

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        int newMargin = (int) (startMargin + ((targetMargin - startMargin) * interpolatedTime));
        RelativeLayout.LayoutParams p = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        p.leftMargin = newMargin;
        view.setLayoutParams(p);
        view.requestLayout();
    }

    @Override
    public void initialize(int width, int height, int parentWidth, int parentHeight) {
        super.initialize(width, height, parentWidth, parentHeight);
    }

    @Override
    public boolean willChangeBounds() {
        return true;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...