2011-01-23 59 views
5

我有一個FrameLayout包含一個子類的SurfaceView和一個ImageView。我想在ImageView上做一個TranslateAnimation。我能做到這一點的唯一方法就是向FrameLayout添加一個空洞的View。否則,在動畫過程中,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 

回答

4

這是有趣的...我想,當添加一個空洞的觀點是FrameLayout裏的大小而改變。你的框架佈局不會填充父項,我想知道如果你改變了佈局參數來填充父項,會發生什麼?

我簡化您的代碼如下:

FrameLayout frameLayout = new FrameLayout(this); 

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

看來這個尺寸的FrameLayout本身等於最後添加的子視圖。如果您在添加矩形之前設置了addView(新視圖(this)),那麼它會縮小爲50 x 50,並且剪切動畫。我假設addView(new View(this));將FrameLayout擴展到全屏。

+0

在'setContentView`調用中添加LayoutParams以填充父項不會改變任何內容。 – Bill 2011-01-23 16:34:22

2

我不知道你是怎麼想出來的,但它似乎也適用於我。我剛剛切換到使用SurfaceView,並注意到動畫被截斷。添加一個空視圖停止剪輯。

1

訣竅是將setClipChildren設置爲包含該視圖的 佈局。

相關問題