Tôi có FrameLayout chứa SurfaceView được phân lớp và một ImageView. Tôi muốn làm một TranslateAnimation trên ImageView. Cách duy nhất tôi có thể làm cho nó hoạt động là thêm một khung nhìn trống rỗng vào FrameLayout. Nếu không, ImageView sẽ bị cắt bớt (các giới hạn của vị trí của ImageView khi bắt đầu hoạt ảnh) trong khi hoạt ảnh.Tại sao các hoạt ảnh Xem đôi khi bị cắt bớt?
Tôi tò mò muốn biết tại sao Chế độ xem anh chị em trống cho phép ImageView hoạt ảnh chính xác. Dòng làm cho nó hoạt động được đánh dấu bằng một chú thích trong đoạn mã dưới đây.
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
Thêm bố cụcParams để điền phụ huynh trong lệnh gọi 'setContentView' không thay đổi bất kỳ điều gì. – Bill
BTW, việc thay đổi SurfaceView thành Chế độ xem khiến cho sự cố không còn nữa. – Bill
Có thể vẽ hình dạng có thể vẽ trên Canvas hoặc Chế độ xem bề mặt. Trong ứng dụng của bạn, bạn đang thêm nó như một cái nhìn trên đỉnh SurfaceView thay vì vẽ nó, vì vậy bạn không thực sự sử dụng SurfaceView của bạn, chỉ cần sử dụng nó để phát hiện cảm ứng và bắt đầu hoạt hình. Kiểm tra về nhà phát triển Android cách họ đang sử dụng shapeDrawable: http://developer.android.com/guide/topics/graphics/2d-graphics.html#shape-drawable – Lumis