2012-01-31 49 views

回答

15

编辑 - 下面的例子是指为Android预SDK11,但我只是发现了一个令人惊讶的大图书馆称为Nine Old Androids,它令人惊奇的是使的Android 3.0的所有动画功能对于所有的API版本!

以前的答案

希望能在一个复杂的布局设置动态阿尔法当我真正遇到这样的问题。 我创建了覆盖onSetAlpha(),并添加了另一个递归函数,该函数检查背景图像,绘图和文本颜色的每种视图。

@Override 
public boolean onSetAlpha(int alpha) 
{ 
    return onSetAlpha(alpha, theLayoutYouWantToSetAlphaTo); 
} 

public boolean onSetAlpha(int alpha, View view) 
{ 
    if (view instanceof ViewGroup) 
    { 
     for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) 
     { 
      onSetAlpha(alpha, ((ViewGroup) view).getChildAt(i)); 
      if (((ViewGroup) view).getBackground() != null) ((ViewGroup) view).getBackground().setAlpha(alpha); 
     } 
    } 
    else if (view instanceof ImageView) 
    { 
     if (((ImageView) view).getDrawable() != null) ((ImageView) view).getDrawable().setAlpha(alpha); 
     if (((ImageView) view).getBackground() != null) ((ImageView) view).getBackground().setAlpha(alpha); 
    } 
    else if (view instanceof TextView) 
    { 
     ((TextView) view).setTextColor(((TextView) view).getTextColors().withAlpha(alpha)); 
     if (((TextView) view).getBackground() != null) ((TextView) view).getBackground().setAlpha(alpha); 
    } 
    else if (view instanceof EditText) 
    { 
     ((EditText) view).setTextColor(((EditText) view).getTextColors().withAlpha(alpha)); 
     if (((EditText) view).getBackground() != null) ((EditText) view).getBackground().setAlpha(alpha); 
    } 
    return true; 
} 

您可以根据需要添加其他种类的视图。

+3

很遗憾你不能使用nineoldandroids方法。如果你做的东西像'ObjectAnimator.ofFloat(myview,“alpha”,0.1f,0.0f).setDuration(10).start();'它只是说“无法找到setter属性alpha myview的值类型为float “。 – Timmmm 2012-11-01 15:59:27

+1

你有没有试过看这个? http://jakewharton.com/advanced-pre-honeycomb-animation/ – 2013-02-12 10:36:31

+0

你的int alpha参数在[0,255]处关闭,但不是[0.0f,1.0f],对不对? – SilentKnight 2015-06-15 10:12:16

47

尝试使用AlphaAnimation:http://developer.android.com/reference/android/view/animation/AlphaAnimation.html


/*有为了得到卡褪色使用动画。 */

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); 
+0

+1为解决方案..但这不是一个最佳解决方案 – 2012-01-31 22:22:58

+0

@SherifelKhatib为什么这不是一个“最佳”的解决方案,此外,在这种情况下,你怎么定义“最优”,与OP ? – 2013-03-26 09:55:33

+0

哇这是旧的。我想我正在考虑更多涉及用alpha直接绘制的东西。在@纳文的答案附近的东西,我猜也值得+1。 – 2013-03-26 10:06:49

0

您可以将Alpha设置为视图的所有颜色(例如按钮的文本或视图组的子视图)。使它们成为XML的颜色并在所有视图中使用。

您可以递归地从视图中读取颜色并向它们添加alpha并将其设置回。

您可以创建视图作为新活动的主视图。然后做在How do I create a transparent Activity on Android?

9

您可以扩展视图draw()方法,并使用canvas.saveAlphaLayer()

public void draw(Canvas canvas) { 
    canvas.saveLayerAlpha(null, alphaValue, ALL_SAVE_FLAG); 
    super.draw(canvas); 
    canvas.restore(); 
} 
+1

这个解决方案实际上比我的更好,我用它来代替我上面提到的。 – Rotemmiz 2012-02-11 19:21:36

+0

对我来说,只有删除最后一行:'canvas.restore();'才有效。也许这是因为我正在从父视图进行一些子变换。 – 2012-08-22 13:51:13

+0

同上删除最后一行:canvas.restore();否则完美无缺。 – 2013-03-14 17:08:13

26

NineOldAndroids视图助手为我所用,这是一个静态辅助类和一个真正的宝石!这里很多人推荐NineOldAndroids,但我没有看到ViewHelper的提及。它非常易于使用。

import com.nineoldandroids.view.ViewHelper; 
... 

ViewHelper.setAlpha(myView, .2f); 

你也可以用它建立时的动画或建立你的UI设置其他属性,如X,Y等,非常方便。非常感谢杰克沃顿与社区分享他的工作!

+0

感谢提及nineoldandroids并提供代码使其工作。 – 2013-07-17 19:53:51

+0

这不适用于2.3.7设备上的ImageView。有什么建议么? – 2013-09-12 20:16:44

+1

我确认,这是在2.3设备上工作。 – jskierbi 2013-10-18 11:32:22