2013-05-26 9 views
18

Ich arbeite an einer App, die auf Froyo sowie JellyBean laufen kann. Ich habe eine Klasse, die PageTransformer erstreckt sich wie folgt:Alternative zu setAlpha in API-Ebene 8

import android.support.v4.view.ViewPager.PageTransformer; 
import android.view.View; 

public class ZoomOutPageTransformer implements PageTransformer { 
    private static float MIN_SCALE = 0.85f; 
    private static float MIN_ALPHA = 0.5f; 

    public void transformPage(View view, float position) { 
     int pageWidth = view.getWidth(); 
     int pageHeight = view.getHeight(); 

     if (position < -1) { 
      view.setAlpha(0); 

     } else if (position <= 1) { 
      float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position)); 
      float vertMargin = pageHeight * (1 - scaleFactor)/2; 
      float horzMargin = pageWidth * (1 - scaleFactor)/2; 
      if (position < 0) { 
       view.setTranslationX(horzMargin - vertMargin/2); 
      } else { 
       view.setTranslationX(-horzMargin + vertMargin/2); 
      } 


      view.setScaleX(scaleFactor); 
      view.setScaleY(scaleFactor); 


      view.setAlpha(MIN_ALPHA + 
        (scaleFactor - MIN_SCALE)/
        (1 - MIN_SCALE) * (1 - MIN_ALPHA)); 

     } else { 
      view.setAlpha(0); 
     } 
    } 
} 

Das Problem ist, die in dieser Klasse geschrieben Methoden wurden in API level 11 hinzugefügt und ich habe mindestens sdk Version von API level 8. Im folgenden sind die Methoden, die in API-Ebene hinzugefügt wurden 11:

  1. setAlpha()
  2. setTranslationX()
  3. setScaleX()
  4. setScaleY()

Was die Lösung für dieses Problem sein kann?

Antwort

16

Die einfachste Lösung ist die NineOldAndroids-Bibliothek, die die Animationen auf alle Android-Versionen zurückportiert. Die Usage section enthält Beispiele für die Verwendung der Bibliothek.

+0

Ja. Als ich nach der Lösung suchte, fand ich, dass die meisten von ihnen für diese NineOldAndroids empfohlen wurden. Aber ich verstehe nicht, wie ich das umsetzen soll. Können Sie mir beibringen, wie ich für die oben genannte Klasse, die ich geschrieben habe, umsetzen kann? –

+7

@ shree202 - werfen Sie einen Blick auf den [ViewHelper] (https://github.com/JakeWharton/NineOldAndroids/blob/master/library/src/com/nineoldandroids/view/ViewHelper.Java) Klasse - verwenden Sie einfach ViewHelper.setAlpha (view, alpha) statt view.setAlpha (alpha) usw. – ianhanniballake

+0

Ok. Ich hab es geschafft. Vielen Dank, dass du mich geführt hast, großer Bruder. Danke vielmals. –

51

so einige Auflösungen hier:


setAlphaAnimation ... API LEVEL 1

AlphaAnimation alpha = new AlphaAnimation(0.7F, 0.7F); 
alpha.setDuration(0); // Make animation instant 
alpha.setFillAfter(true); // Tell it to persist after the animation ends 
view.startAnimation(alpha); 

setAlpha INT -> Von API LEVEL 1 -> veraltet in 16

Drawable background = localLinLayout.getBackground(); 
background.setAlpha(180); //255 is max (visible) 

setAlpha FLOAT -> API-Level 11+ ->


setImageAlpha -> API LEVEL 16+ (Verwendung nur für ImageViews)

+0

Was ist mit anderen wie setScaleX() setScaleY()? –

+0

ich denke, du sprichst über etwas anderes ... – cV2

+0

als definieren in Frage –

2

Auch, wenn Sie verwenden möchten PageTransformer sogar in 2.2. Sie müssen einige Validierungen ändern, die in der Klasse ViewPager vorgenommen wurden. Sehen Sie sich diese example

+0

+1 Schönes Beispiel. –

2

sowohl vorwärts als auch rückwärts kompatibel sein Ich verwende folgende Implementierung für meine Ansichten:

private void fadeOut(final View view) { 
    int sdk = android.os.Build.VERSION.SDK_INT; 
    if(sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) { 
     AlphaAnimation alpha = new AlphaAnimation(1f, 0f); 
     alpha.setDuration(mAnimationDuration); 
     alpha.setFillAfter(true); 
     view.startAnimation(alpha); 
    } else { 
     view.animate() 
     .alpha(0f) 
     .setDuration(mAnimationDuration) 
     .setListener(new AnimatorListenerAdapter() { 
      @Override 
      public void onAnimationEnd(Animator animation) { 
       view.setVisibility(View.GONE); 
      } 
     }); 
    } 
} 

private void fadeIn(View view) { 
    int sdk = android.os.Build.VERSION.SDK_INT; 
    if(sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) { 
     view.setVisibility(View.VISIBLE); 
     AlphaAnimation alpha = new AlphaAnimation(0f, 1f); 
     alpha.setDuration(mAnimationDuration); 
     alpha.setFillAfter(true); 
     view.startAnimation(alpha); 
    } else { 
     view.setAlpha(0f); 
     view.setVisibility(View.VISIBLE); 

     view.animate() 
     .alpha(1f) 
     .setDuration(mAnimationDuration) 
     .setListener(null); 
    } 
} 
+0

+1 Gute Eins. Danke für deine Antwort. –

3

Falls jemand ist Husten faul und will die ZoomOutPageTransformer kompatibel zurück zur API 8. nineoldandroids Verwendet und die ViewHelper-Klasse.

package com.weddingwire.vendorsearch.Animation; 

import android.support.v4.view.ViewPager; 
import android.view.View; 

import com.nineoldandroids.view.ViewHelper; 

public class ZoomOutPageTransformer implements ViewPager.PageTransformer { 
    private static float MIN_SCALE = 0.85f; 
    private static float MIN_ALPHA = 0.5f; 

    public void transformPage(View view, float position) { 
     int pageWidth = view.getWidth(); 
     int pageHeight = view.getHeight(); 

     if (position < -1) { // [-Infinity,-1) 
      // This page is way off-screen to the left. 
      ViewHelper.setAlpha(view, 0); 

     } else if (position <= 1) { // [-1,1] 
      // Modify the default slide transition to shrink the page as well 
      float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position)); 
      float vertMargin = pageHeight * (1 - scaleFactor)/2; 
      float horzMargin = pageWidth * (1 - scaleFactor)/2; 
      if (position < 0) { 
       ViewHelper.setTranslationX(view, (horzMargin - vertMargin/2)); 
      } else { 
       ViewHelper.setTranslationX(view, -horzMargin + vertMargin/2); 
      } 

      // Scale the page down (between MIN_SCALE and 1) 
      ViewHelper.setScaleX(view, scaleFactor); 
      ViewHelper.setScaleY(view, scaleFactor); 

      // Fade the page relative to its size. 
      ViewHelper.setAlpha(view, MIN_ALPHA + 
        (scaleFactor - MIN_SCALE)/
          (1 - MIN_SCALE) * (1 - MIN_ALPHA)); 

     } else { // (1,+Infinity] 
      // This page is way off-screen to the right. 
      ViewHelper.setAlpha(view, 0); 
     } 
    } 
} 
+0

+1 Jetzt würde diese eine nette Hilfe für jemanden bieten. –