Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么视图动画有时会被剪裁?_Android_Animation_Clipping - Fatal编程技术网

Android 为什么视图动画有时会被剪裁?

Android 为什么视图动画有时会被剪裁?,android,animation,clipping,Android,Animation,Clipping,我有一个FrameLayout,其中包含子类SurfaceView和ImageView。我想在ImageView上执行TranslateAnimation。我能让它工作的唯一方法是在FrameLayout中添加一个空视图。否则,在动画期间,ImageView将被剪裁(到动画开始时ImageView位置的边界) 我很好奇为什么空的同级视图允许ImageView正确地设置动画。使其工作的行在下面的代码中用注释标记 public class Test5 extends Activity { p

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

我很好奇为什么空的同级视图允许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

这很有趣。。。我猜当添加一个空视图时,FrameLayout的大小会改变。您的框架布局没有填充父级,我想知道如果您将布局参数更改为填充父级,会发生什么情况

我将您的代码简化为:

    FrameLayout frameLayout = new FrameLayout(this); 

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

FrameLayout大小本身似乎等于上次添加的子视图。如果在添加矩形之前设置addView(新视图(此)),则矩形将减少到50 x 50,动画将被剪裁。我假设addView(新视图(this));将FrameLayout扩展到全屏。

我不知道您是如何理解的,但它似乎也适用于我。我刚刚切换到使用SurfaceView,并注意到动画正在被剪辑。添加空视图停止了剪辑。

技巧是将setClipChildren设置为
包含视图的布局

setContentView
调用中添加LayoutParams以填充父对象不会改变任何东西。顺便说一句,将SurfaceView更改为视图会导致问题消失。可以在画布或曲面视图上绘制Shape drawable。在应用程序中,您将其添加为SurfaceView顶部的视图,而不是绘制它,因此您并没有真正利用SurfaceView,只是使用它来检测触摸并启动动画。查看android开发者如何使用shapeDrawable:我建议你阅读本教程,该教程有7个部分,SurfaceView通常用于从其他线程继续绘制屏幕,例如街机游戏等。本示例摘自一个我使用SurfaceView的应用程序(其他)单独线程中的动画。这篇文章描述了一个Android bug,它看起来和我看到的非常相似。