2016-02-10 5 views
2

Есть ли разница в добавлении одного изображения в 10 раз и 10 различных изображений (одинаковые размеры, одинаковое разрешение, одинаковый размер файла) один раз для анимации.?Анимация медленная в Android

Потому что я добавил 1 изображение 10 раз и предоставил несколько анимаций при прокручивании, это было гладко во время моего взаимодействия. но при добавлении разных изображений (одинаковых размеров, одинакового разрешения, одного и того же размера файла) для моего процесса наблюдается сильное отставание в анимации. Некоторые шаги я пытался улучшить производительность

1.Adding типа слоя и установки нулевым, а анимация закончилась (Это улучшает за один раз анимации, когда анимация непрерывно, это не помогает)

2.Tried Настройки hardwareaccelerated атрибут в манифесте

3.Tried заходящего большой атрибут кучи в очевидном

4.Added кэш анимации для элементов.

5. Прогулка с использованием высокопроизводительных устройств.

Есть ли у нас какие-либо возможности улучшить производительность анимации?

EDITED:

FrameLayout frame = new FrameLayout(this); 
     frame.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 700)); 
     ArrayList<Integer> arrayList = new ArrayList<Integer>(); 
     arrayList.add(R.drawable.image1); 
     arrayList.add(R.drawable.image2); 
     arrayList.add(R.drawable.image3); 
     arrayList.add(R.drawable.image4); 
     arrayList.add(R.drawable.image5); 
     arrayList.add(R.drawable.image6); 
     arrayList.add(R.drawable.image7); 
     arrayList.add(R.drawable.image8); 
     arrayList.add(R.drawable.image9); 
     arrayList.add(R.drawable.image10); 
     arrayList.add(R.drawable.image11); 
     for(int i=0;i<11;i++){ 
      ImageView imgvw = new ImageView(this); 
      imgvw.setImageResource(arrayList.get(i)); 
      imgvw.setLayoutParams(new ActionBar.LayoutParams(250, 400)); 
      imgvw.setScaleType(ImageView.ScaleType.FIT_XY); 
      imgvw.setX(this.getResources().getDisplayMetrics().widthPixels/2); 
      imgvw.setRotationY(-45); 
      imgvw.setScaleY(0.7f); 
      frame.addView(imgvw); 
       } 
       setContentView(frame); 

public boolean onTouchEvent(MotionEvent event) { 

     switch (event.getActionMasked()){ 
      case MotionEvent.ACTION_DOWN:{ 
       final AnimatorSet animationSet = new AnimatorSet(); 
       for(int i=0;i<frame.getChildCount();i++){ 
        final ImageView vw = (ImageView) frame.getChildAt(i); 
//     vw.setLayerType(View.LAYER_TYPE_HARDWARE, null); 

        animationSet.playTogether(
          ObjectAnimator.ofFloat(vw, "rotationY", 45), 
          ObjectAnimator.ofFloat(vw, "scaleY", 0.8f), 
          ObjectAnimator.ofFloat(vw, "x", 0) 
        ); 
        animationSet.setDuration(600); 
        animationSet.setInterpolator(new DecelerateInterpolator(1.5f)); 
        animationSet.start(); 

            animationSet.addListener(new Animator.AnimatorListener() { 
         @Override 
         public void onAnimationStart(Animator animation) { 

         } 

         @Override 
         public void onAnimationEnd(Animator animation) { 
//       vw.setLayerType(View.LAYER_TYPE_NONE,null); 
          animationSet.start(); 
         } 

         @Override 
         public void onAnimationCancel(Animator animation) { 

         } 

         @Override 
         public void onAnimationRepeat(Animator animation) { 
          vw.setX(getResources().getDisplayMetrics().widthPixels/2); 
          vw.setRotationY(-45); 
          vw.setScaleY(0.7f); 
         } 
        }); 

          } 
       } 
} 
+0

Вы можете добавить код, который вы пробовали? Были ли вы выбирать изображения из активов или SDCard или сетей ? –

+0

Его из Assests (из папки ресурсов) @AnkurAggarwal –

+0

Код сэра, код. Мы не можем отлаживать без кода –

ответ

0

При добавлении 10 различных изображений, попробуйте использовать список анимации с отдельными атрибутами для каждой анимации изображения.

1

Надеюсь, вы добавили бы соответствующие изображения с определенным разрешением для различных разрешений устройств.

При использовании одинакового изображения в разных разрешениях экрана эти устройства с меньшими разрешениями могут возникать такие задержки.

Для создания этих изображений, вы должны начать с сырьевым ресурсом в векторном формате и создавать изображения для каждой плотности, используя следующую шкалу размера:

  • xhdpi: 2,0
  • ИПЧР: 1,5
  • MDPI : 1,0 (базовый уровень)
  • ldpi: 0,75


более пройти ниже предложений от developer.a ndroid плотность экрана

  • ldpi Ресурсы для экранов низкой плотности (ldpi) (~ 120dpi).
  • mdpi Ресурсы для экранов средней плотности (mdpi) (~ 160 точек на дюйм). (Это базовая плотность.)
  • hdpi Ресурсы для экранов высокой плотности (hdpi) (~ 240 точек на дюйм).
  • xhdpi Ресурсы для экранов сверхвысокой плотности (xhdpi) (~ 320 точек на дюйм).
  • xxhdpi Ресурсы для экранов сверхвысокой плотности (xxhdpi) (~ 480 точек на дюйм).
  • xxxhdpi Ресурсы для сверх-сверхвысокой плотности (xxxhdpi) используются (~ 640 точек на дюйм). Используйте это только для значка запуска, см. Примечание выше.
  • nodpi Ресурсы для всех плотностей. Это не зависящие от плотности ресурсы. Система не масштабирует ресурсы, отмеченные этим квалификатором, независимо от плотности текущего экрана.
  • tvdpi Ресурсы для экранов где-то между mdpi и hdpi; приблизительно 213dpi. Это не считается «первичной» группой плотности. Это в основном предназначено для телевизоров, и большинство приложений им не нужны, поэтому для большинства приложений достаточно ресурсов mdpi и hdpi, и система будет масштабировать их по мере необходимости.
+0

Спасибо. Но я попытался использовать изображения с низким разрешением в устройствах с высоким разрешением (также с высоким уровнем помех). Даже это приводит к тому же отставанию от устройств с низким разрешением. это неправильно.? соотношение сторон также должно поддерживаться для устройств с высоким разрешением.? или любым другим способом.? –

0

Понимая ваш код в вопросе, я сделал небольшое чередование, так что происходит обратная анимация, и последовательность выполняется правильно. Надеюсь, что это помогает !!! ...

Код внутри OnCreate метод

frame = new FrameLayout(this); 
    frame.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 700)); 
    ArrayList<Integer> arrayList = new ArrayList<Integer>(); 
    arrayList.add(R.drawable.image1); 
    arrayList.add(R.drawable.image2); 
    arrayList.add(R.drawable.image3); 
    arrayList.add(R.drawable.image4); 
    arrayList.add(R.drawable.image5); 
    arrayList.add(R.drawable.image6); 
    arrayList.add(R.drawable.image7); 
    arrayList.add(R.drawable.image8); 
    arrayList.add(R.drawable.image9); 
    arrayList.add(R.drawable.image10); 
    //arrayList.add(R.drawable.image11); 
    for(int i=0;i<arrayList.size();i++){ 
     ImageView imgvw = new ImageView(this); 
     imgvw.setImageResource(arrayList.get(i)); 
     imgvw.setLayoutParams(new ActionBar.LayoutParams(250, 400)); 
     imgvw.setScaleType(ImageView.ScaleType.FIT_XY); 
     imgvw.setX(this.getResources().getDisplayMetrics().widthPixels/2); 
     imgvw.setRotationY(-45); 
     imgvw.setScaleY(0.7f); 
     frame.addView(imgvw); 
    } 
    setContentView(frame); 

Код для анимации:

private int count=0; 
private int repeatMode=2; 
private int repeatCount=1; 
private int duration=300; 

private void doAnimation(final FrameLayout frame){ 

    if (count>=frame.getChildCount()){ 
     count=0; 
     return; 
    } 

    ImageView targetView = (ImageView) frame.getChildAt(count++);//frame.getChildCount()-1-count++); 

     ObjectAnimator animator1 = ObjectAnimator.ofFloat(targetView, "rotationY", 45); 
     animator1.setRepeatCount(repeatCount); 
     animator1.setRepeatMode(repeatMode); 
     animator1.setDuration(duration); 

     ObjectAnimator animator2 = ObjectAnimator.ofFloat(targetView, "scaleY", 0.8f); 
     animator2.setRepeatCount(repeatCount); 
     animator2.setRepeatMode(repeatMode); 
     animator2.setDuration(duration); 

     ObjectAnimator animator3 = ObjectAnimator.ofFloat(targetView, "x", 0f); 
     animator3.setRepeatCount(repeatCount); 
     animator3.setRepeatMode(repeatMode); 
     animator3.setDuration(duration); 

// sequencial анимация AnimatorSet комплект = новый AnimatorSet(); set.playTogether (аниматор1, аниматор2, аниматор3); set.start(); set.addListener (новый Animator.AnimatorListener() { @Override общественная недействительный onAnimationStart (аниматор анимация) {

 } 

     @Override 
     public void onAnimationEnd(Animator animation) { 
      doAnimation(frame); 
     } 

     @Override 
     public void onAnimationCancel(Animator animation) { 

     } 

     @Override 
     public void onAnimationRepeat(Animator animation) { 

     } 
    }); 

} 

@Override 
public boolean onTouch(View v, MotionEvent event) { 

    return onTouchEvent(event); 
} 

public boolean onTouchEvent(MotionEvent event) { 

    switch (event.getActionMasked()) { 
     case MotionEvent.ACTION_DOWN: { 
      doAnimation(frame); 
      return true; 
     } 
    } 
    return false; 
} 
Смежные вопросы