6

मैं GridView में एनीमेशन का उपयोग करके प्रदर्शित करना चाहता हूं। मैं उन्हें प्रदर्शित कर सकता हूं और एनीमेशन को सही तरीके से लागू कर सकता हूं।छवियों को प्रदर्शित करें एनीमेशन समस्या

लेकिन समस्या यह है कि, यदि मैं ImageView1 पर एनीमेशन लागू करता हूं और फिर ImageView2 (ImageView1 पर एनीमेशन समाप्त होने से पहले) तो ImageView1 पर एनीमेशन बाधित हो जाता है और ImageView1 सीधे अंतिम स्थिति पर सेट हो जाता है।

ध्यान दें कि मैं ThreadPoolExecutor का उपयोग करके 2 थ्रेड के साथ छवि डाउनलोड करता हूं। जब भी कोई छवि डाउनलोड हो जाती है, तो मैं addImage(image)ImageAdapter से नीचे की विधि को कॉल करता हूं जो बदले में GridView और GridView में छवि को नवीनतम छवियों को प्रदर्शित करने के लिए ताज़ा किया जाता है। और यहां, प्रतिपादन करते समय, नई छवि एनीमेशन के साथ प्रदर्शित होती है और यह एनीमेशन (मुझे लगता है) वर्तमान में एनिमेटिंग छवियों की एनीमेशन को बाधित करता है।

ImageAdapter:

public class ImageAdapter extends BaseAdapter { 
    private Context mContext; 
    private List<Bitmap> images; 
    private ArrayList<Integer> colors; 
    private boolean[] alreadyLoadedIndexes; 
    Animation animation; 
    AnimatorSet animator; 

    public void addImage(Bitmap img) { 
     images.add(img); 
     notifyDataSetChanged(); 
    } 

    public void setAnimation(Animation animation) { 
     this.animator = null; 
     this.animation = animation; 
    } 

    public void setAnimator(AnimatorSet animation) { 
     this.animation = null; 
     this.animator = animation; 
    } 

    public void resetImages() { 
     images.clear(); 
     notifyDataSetChanged(); 
     alreadyLoadedIndexes = null; 
     alreadyLoadedIndexes = new boolean[20]; 
    } 

    // Constructor 
    public ImageAdapter(Context c) { 
     mContext = c; 
     images = new ArrayList<Bitmap>(); 
     colors = new ArrayList<Integer>(); 
     colors.add(Color.CYAN); 
     colors.add(Color.BLUE); 
     colors.add(Color.GRAY); 
     colors.add(Color.YELLOW); 
     colors.add(Color.MAGENTA); 
     alreadyLoadedIndexes = new boolean[20]; 
    } 

    @Override 
    public int getCount() { 
     return 20; 
    } 

    @Override 
    public Object getItem(int position) { 
     return 20; 
    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ImageView imageView = new ImageView(mContext); 

     imageView 
       .setBackgroundColor(colors.get((int) ((Math.sqrt(position) + 2 * position) % 5))); 

     // If image at index 'position' is available 
     if (images.size() > position) { 

      // If loading this image first time then only apply animation 
      if (!alreadyLoadedIndexes[position]) { 

       // If animation is specified 
       if (this.animation != null) { 
        imageView.setImageBitmap(images.get(position)); 
        imageView.startAnimation(animation); 

       } 
       // If animator set is specified 
       else if (this.animator != null) { 
        imageView.setImageBitmap(null); 
        imageView.setBackgroundColor(colors.get((int) ((Math 
          .sqrt(position) + 2 * position) % 5))); 
        animator.setTarget(imageView); 
        animator.start(); 
        Log.e("", "setting image after " + animator.getDuration() 
          /2); 
        new Handler().postDelayed(
          new runnable(imageView, images.get(position)), 500); 

       } else { 
        // Use default animation if nothing is specified. 
        imageView.setImageBitmap(images.get(position)); 
        animation = AnimationUtils.loadAnimation(mContext, 
          R.anim.fade_in); 
        imageView.startAnimation(animation); 
       } 

      } else { 
       imageView.setImageBitmap(images.get(position)); 
      } 

      alreadyLoadedIndexes[position] = true; 

     } 

     imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
     imageView.setLayoutParams(new GridView.LayoutParams(150, 150)); 
     return imageView; 
    } 

    class runnable implements Runnable { 

     ImageView image; 
     Bitmap bitmap; 

     public runnable(ImageView img, Bitmap bitmap) { 
      this.image = img; 
      this.bitmap = bitmap; 
     } 

     @Override 
     public void run() { 
      Log.e("", "setting image."); 
      image.setImageBitmap(bitmap); 
     } 

    } 

} 

उत्तर

-1

आप समस्या notifyDataSetChanged(); यह एनीमेशन बीच में है। एनीमेशन समाप्त होने पर इसे कॉल करने का प्रयास करें।

+0

लेकिन जब मेरे पास, उदाहरण के लिए, 50 छवियों को प्रदर्शित करने के लिए और यदि मैं 'छवि को सूचित करेंडेटाट चेंज()' कॉल करने से पहले पूरा करने के लिए प्रत्येक छवि की एनीमेशन की प्रतीक्षा करूंगा तो सभी छवियों को लोड करने में लगभग 15-20 सेकंड लगेंगे। – Geek

+0

@Akash तो कृपया बताएं कि आप इसे कैसे व्यवहार करना चाहते हैं? –

+0

मैं सभी छवियों को एनीमेशन पूर्ण करना चाहता हूं लेकिन छवि लोडिंग समय को यथासंभव कम रखना चाहता हूं। समवर्ती छवि एनिमेशन वह है जो मैं एक-एक करके खोजता हूं। – Geek

1

ग्रिड व्यू के लिए लेआउट एनीमेशन नियंत्रक आज़माएं, यह समय अवधि के संबंध में आइटम द्वारा विचार आइटम को एनिमेट करेगा। जाँच इस link,

+0

कृपया छोटा उदाहरण कोड दें। इसके अलावा मैंने 'ग्रिड व्यू' का उपयोग 'ग्रिडलाउट' नहीं किया है। 'GridLayoutAnimationController' 'GridLayout' के लिए है। – Geek

+0

लेआउट एनीमेशन नियंत्रक किसी भी लेआउट समूह को लागू कर रहा है, ग्रिड व्यू एक लेआउट समूह बन गया है, कृपया इस नमूना की जांच करें इससे आपकी मदद मिलेगी। http://www.edumobile.org/android/android-development/wave-layout-animationexample/ –

+0

अपने एडाप्टर में सभी एनीमेशन कार्यक्षमता और गतिविधि में जगह को हटा दें, और एनीमेशनसेट का उपयोग एनीमेटरसेट नहीं करें, लेआउट एनीमेशन नियंत्रक केवल एनिमेशन ऑब्जेक्ट्स लेता है । –

0

आप की तरह एनीमेशन बाहर एडाप्टर getView विधि लागू करने के लिए प्रयास किया है:

mGridView.getChildAt(childIndexNeededToAnimate).startAnimation(animation); 

ये बाल विचारों स्वतंत्र और के बाद से वे पहले से ही तैयार कर रहे हैं अब और पुनर्नवीनीकरण नहीं किया जा रहा है।

0

आपके पास कुछ विकल्प है।

यदि आप अपना कोड बदलना नहीं चाहते हैं तो पहले आप Animation in your adapter कक्षा का उपयोग कर सकते हैं। उस check this के लिए।

अंदर अपने एडाप्टर कक्षा में getView आप इस तरह एनीमेशन कॉल करनी होगी,

Animation animation = null; 
animation = AnimationUtils.loadAnimation(context, R.anim.push_left_in); 
animation.setDuration(500); 
convertView.startAnimation(animation); 
return convertView; 

दूसरा आप GridLayoutAnimationController का उपयोग करना चाहिए, जिसमें एक लेआउट एनीमेशन नियंत्रक एक ग्रिड लेआउट के बच्चों एनिमेटेड किया जाता है।

0

बस एक अनुमान। मुझे यकीन नहीं है कि यह मदद करेगा और न ही अगर मैं आपका कोड सही पढ़ूं। मुझे लगता है कि समस्या मुझे लगता है की तुलना में कठिन है। हालांकि, आप प्रत्येक आइटम के लिए एक ही एनीमेशन ऑब्जेक्ट का उपयोग कर रहे हैं। शायद आपको प्रत्येक आइटम के लिए एक नई एनीमेशन बनाना चाहिए। यह एक कारण हो सकता है कि जब आप एक नया लॉन्च करते हैं तो आपकी एनीमेशन रुक जाती है क्योंकि नया कॉल बस पुन: उपयोग करता है और इसे पुनरारंभ करता है।

शुभकामनाएं।

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