【问题标题】:Alternative to setAlpha in api level 8在 api 级别 8 中替代 setAlpha
【发布时间】:2013-05-21 06:28:38
【问题描述】:

我正在开发一个可以在FroyoJellyBean 上运行的应用程序。我有一个扩展 PageTransformer 的类,如下所示:

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);
        }
    }
}

问题是,在这个类中编写的方法是在API level 11 中添加的,并且我有API level 8 的最低sdk 版本。以下是 API 级别 11 中添加的方法:

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

有什么办法可以解决这个问题?

【问题讨论】:

    标签: android android-4.2-jelly-bean android-2.2-froyo


    【解决方案1】:

    所以,这里有一些解决方案:


    setAlphaAnimation ... API 级别 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 -> 从 API LEVEL 1 -> 在 16 中弃用

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

    setAlpha FLOAT -> API 级别 11+ ->


    setImageAlpha -> API LEVEL 16+(仅用于 ImageViews)

    【讨论】:

    • 其他的像 setScaleX() setScaleY() 怎么样?
    • 所定义的问题
    【解决方案2】:

    最简单的解决方案是使用 NineOldAndroids 库,它将动画反向移植到所有版本的 Android。 Usage section 提供了如何使用该库的示例。

    【讨论】:

    • 是的。当搜索解决方案时,我发现,其中大多数都被推荐用于这个 NineOldAndroids。但我不明白如何实现这一点。你能指导我如何实现我写的上述类吗?
    • @shree202 - 看看ViewHelper 类 - 只需使用 ViewHelper.setAlpha(view, alpha) 而不是 view.setAlpha(alpha) 等。
    • 好的。我得到了它。非常感谢你指导我,大哥。非常感谢。
    • @ianhanniballake 谢谢你让我开心,再次感谢我解决了我的问题。
    【解决方案3】:

    如果有人咳嗽懒惰并希望 ZoomOutPageTransformer 兼容回 API 8。使用 Nineoldandroids 和 ViewHelper 类。

    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);
            }
        }
    }
    

    【讨论】:

    • +1 现在这个可以为某人提供很好的帮助。
    【解决方案4】:

    另外,如果你想在 2.2 中使用PageTransformer。您必须更改在 ViewPager 类中进行的一些验证。看看这个example

    【讨论】:

      【解决方案5】:

      为了向前和向后兼容,我对视图使用以下实现:

      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);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2019-12-18
        • 1970-01-01
        • 2013-01-01
        • 2023-03-04
        • 2019-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多