मेरे पास एक फ़्रेमलेआउट है जिसमें उप-वर्गीकृत भूतल दृश्य और एक छवि दृश्य है। मैं ImageView पर अनुवाद एनीमेशन करना चाहता हूं। एकमात्र तरीका यह है कि मैं इसे काम कर सकता हूं फ्रेम फ्रेम पर एक खाली दृश्य जोड़ना है। अन्यथा, एनीमेशन के दौरान 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
'setContentView' कॉल में अभिभावक को भरने के लिए लेआउट पैराम्स जोड़ना कुछ भी नहीं बदलेगा। – Bill
बीटीडब्लू, एक दृश्य में SurfaceView को बदलने से समस्या दूर हो जाती है। – Bill
आकार खींचने योग्य कैनवास या सतह दृश्य पर खींचा जा सकता है। अपने एप्लिकेशन में आप इसे खींचने के बजाय SurfaceView के शीर्ष पर एक दृश्य के रूप में जोड़ रहे हैं, इसलिए आप वास्तव में स्पर्श करने और एनीमेशन शुरू करने के लिए इसका उपयोग करके अपने SurfaceView का उपयोग नहीं कर रहे हैं। एंड्रॉइड डेवलपर पर जांचें कि वे आकार का उपयोग कैसे कर रहे हैं: http://developer.android.com/guide/topics/graphics/2d-graphics.html#shape-drawable – Lumis