动画:我应该如何在屏幕上将ImageView转换为可见性

时间:2010-09-27 19:27:43

标签: android animation

我正在使用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的区域,如果它被滑出,则动画开始({{1}被解雇了。)

我没有点击OnClickListener

问题: 那么,带有动画的组件实际上并没有移动? 我如何处理这个onClick事件,因为当按下用户看不到ImageView的屏幕时动画会发生意外?

2 个答案:

答案 0 :(得分:4)

你是对的,组件不会真正移动,只有它们渲染的位图缓冲区。动画完屏幕后,您可以使用View.setVisibility(View.GONE);使其真正消失。

如果您的目标是让视图的一小部分仍然可见,以允许用户将其滑回屏幕,则可以考虑使用SlidingDrawer

答案 1 :(得分:0)

您实际上可以创建自己的动画来实际移动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;
    }
}