2011-01-23 12 views
5

मेरे पास एक फ़्रेमलेआउट है जिसमें उप-वर्गीकृत भूतल दृश्य और एक छवि दृश्य है। मैं 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 

उत्तर

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 (नया दृश्य (यह)) सेट करते हैं तो यह 50 x 50 तक कम हो जाता है और एनीमेशन क्लिप हो जाता है। मुझे लगता है कि addView (नया दृश्य (यह)); पूर्ण स्क्रीन पर फ्रेमलेआउट का विस्तार करता है।

+0

'setContentView' कॉल में अभिभावक को भरने के लिए लेआउट पैराम्स जोड़ना कुछ भी नहीं बदलेगा। – Bill

+0

बीटीडब्लू, एक दृश्य में SurfaceView को बदलने से समस्या दूर हो जाती है। – Bill

+0

आकार खींचने योग्य कैनवास या सतह दृश्य पर खींचा जा सकता है। अपने एप्लिकेशन में आप इसे खींचने के बजाय SurfaceView के शीर्ष पर एक दृश्य के रूप में जोड़ रहे हैं, इसलिए आप वास्तव में स्पर्श करने और एनीमेशन शुरू करने के लिए इसका उपयोग करके अपने SurfaceView का उपयोग नहीं कर रहे हैं। एंड्रॉइड डेवलपर पर जांचें कि वे आकार का उपयोग कैसे कर रहे हैं: http://developer.android.com/guide/topics/graphics/2d-graphics.html#shape-drawable – Lumis

2

मुझे नहीं पता कि आपने इसे कैसे समझ लिया, लेकिन यह मेरे लिए भी काम करना प्रतीत होता था। मैंने बस एक SurfaceView का उपयोग करने के लिए स्विच किया था, और देखा कि एनिमेशन clipped हो रहे थे। एक खाली दृश्य जोड़ना क्लिपिंग बंद कर दिया।

1

यह चाल सेटक्लिप चिल्ड्रेन को लेआउट पर सेट कर रही थी जिसमें दृश्य संलग्न था।

संबंधित मुद्दे