【问题标题】:Why are View animations sometimes clipped?为什么有时会剪辑 View 动画?
【发布时间】:2011-06-13 22:43:09
【问题描述】:

我有一个 FrameLayout,其中包含一个子类 SurfaceView 和一个 ImageView。我想在 ImageView 上做一个 TranslateAnimation。我可以使它工作的唯一方法是向 FrameLayout 添加一个空视图。否则,ImageView 在动画期间被剪裁(到动画开始时 ImageView 位置的边界)。

我很好奇为什么空的同级 View 允许 ImageView 正确设置动画。使其工作的行在下面的代码中标有注释。

public class Test5 extends Activity {
    private static final String TAG = "Test5";
    private MySurfaceView mMSV;
    private ImageView mRectView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mMSV = new MySurfaceView(this);

        mRectView = new ImageView(this);
        ShapeDrawable sd = new ShapeDrawable(new RectShape());
        sd.getPaint().setColor(Color.RED);
        sd.setIntrinsicWidth(300);
        sd.setIntrinsicHeight(100);
        mRectView.setImageDrawable(sd);

        FrameLayout frameLayout = new FrameLayout(this);
        frameLayout.addView(mMSV);
        frameLayout.addView(mRectView, new FrameLayout.LayoutParams(
                FrameLayout.LayoutParams.WRAP_CONTENT,
                FrameLayout.LayoutParams.WRAP_CONTENT));

        // I don't know why the following line prevents clipping during
        // animation. It simply adds a vacuous View.
        frameLayout.addView(new View(this));

        setContentView(frameLayout);
    }  // onCreate

    public class MySurfaceView extends SurfaceView implements
            SurfaceHolder.Callback {

        public MySurfaceView(Context context) {
            super(context);
            getHolder().addCallback(this);
        }

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            Canvas can = mMSV.getHolder().lockCanvas();
            can.drawColor(Color.GRAY);
            mMSV.getHolder().unlockCanvasAndPost(can);
        }

        @Override
        public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2,
                int arg3) {
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
        }

        @Override
        public boolean onTouchEvent(MotionEvent ev) {
            if (ev.getAction() == MotionEvent.ACTION_UP) {
                Log.v(TAG, String.format("ACTION_UP, w=%d, h=%d", mRectView
                        .getWidth(), mRectView.getHeight()));
                Animation an = new TranslateAnimation(0f, 200f, 0f, 200f);
                // Animation an = new RotateAnimation(0f, 90f);
                an.setStartOffset(200);
                an.setDuration(1000);
                mRectView.startAnimation(an);
            }
            return true;
        }
    } // MySurfaceView
}  // Test5

【问题讨论】:

    标签: android animation clipping


    【解决方案1】:

    这很有趣...我猜 FrameLayout 的大小在添加空视图时会发生变化。你的框架布局没有填充父级,不知道如果你将布局参数更改为填充父级,会发生什么?

    我将您的代码简化为:

        FrameLayout frameLayout = new FrameLayout(this); 
    
        frameLayout.addView(mMSV); 
        frameLayout.addView(mRectView, 50, 50); 
        frameLayout.addView(new View(this)); //expands frame layout
    

    似乎 FrameLayout 大小本身等于最后添加的子视图。如果在添加矩形之前设置 addView(new View(this)) 则它会减小到 50 x 50 并且动画会被剪裁。我假设 addView(new View(this));将 FrameLayout 展开到全屏。

    【讨论】:

    • setContentView 调用中添加 LayoutParams 以填充父级不会改变任何内容。
    • 顺便说一句,将 SurfaceView 更改为 View 会导致问题消失。
    • Shape drawable 可以在 Canvas 或 Surface View 上绘制。在您的应用程序中,您将其添加为 SurfaceView 之上的视图,而不是绘制它,因此您并没有真正使用 SurfaceView,只是使用它来检测触摸和启动动画。检查 android 开发人员如何使用 shapeDrawable:developer.android.com/guide/topics/graphics/…
    • 我建议你阅读这个有 7 个部分的教程 droidnova.com/playing-with-graphics-in-android-part-i,147.html SurfaceView 通常用于你需要从另一个线程连续绘制屏幕,​​用于街机游戏等。
    • 这个例子是从一个应用程序中提炼出来的,我确实使用 SurfaceView 在单独的线程中执行(其他)动画。帖子 blog.graphtech.co.il/rotation-and-gl-overlay-in-android 描述了一个与我所看到的非常相似的 Android 错误。
    【解决方案2】:

    我不知道你是怎么想到的,但它似乎也对我有用。我刚刚切换到使用 SurfaceView,并注意到动画被剪辑了。添加一个空视图会停止剪辑。

    【讨论】:

      【解决方案3】:

      诀窍是将 setClipChildren 设置为 包围视图的布局。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-04
        • 2015-12-25
        • 1970-01-01
        相关资源
        最近更新 更多