android转换背景视图从一种颜色到另一种颜色

时间:2014-08-21 21:26:08

标签: android transition background-color

我有一个透明的黑色背景视图:#DD000000

我想要的是视图在某些情况下从#223333FF转换回第一种颜色。

//lastApp.setBackgroundColor(getResources().getColor(R.color.semitransparent));
ColorDrawable[] color = {new ColorDrawable(Color.BLUE), new ColorDrawable(Color.BLACK)};
TransitionDrawable trans = new TransitionDrawable(color);
int sdk = android.os.Build.VERSION.SDK_INT;
if(sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) {
    lastApp.setBackgroundDrawable(trans);
} else {
    lastApp.setBackground(trans);
}
trans.startTransition(300);

此代码有效,但颜色不是我想要的颜色。

如果我使用下一行,我相信它会创建两种黑色,因为我看不到任何蓝色,并且透明度会丢失。

ColorDrawable[] color = {new ColorDrawable(getResources().getColor(R.color.blue)), new ColorDrawable(getResources().getColor(R.color.black_overlay))};

我的下一次尝试是使用没有alpha的资源:#DD000000 - &gt; #000000; #223333FF - &gt; #3333FF 这里的过渡有效,但不是我想要的,因为没有透明度。

接下来的两个尝试只是尝试新的东西,因为我想使用色彩资源。

下一行我得到一个没有透明度的黑色。

ColorDrawable[] color = {new ColorDrawable(0x223333FF), new ColorDrawable(0xDD000000)};

这导致最终的蓝色,而不是透明的黑色

ColorDrawable[] color = {new ColorDrawable(0x223333FF), new ColorDrawable(0x33000000)};

我也试过了,没有效果:

color[1].setAlpha(50);

那么,我做错了什么?或者有更好的方法来实现这个目标吗?

2 个答案:

答案 0 :(得分:5)

您可以使用ArgbEvaluator

执行此操作
ObjectAnimator animator = ObjectAnimator.ofInt(yourView, "backgroundColor", Color.RED, Color.BLUE).setDuration(3000);
    animator.setEvaluator(new ArgbEvaluator());
    animator.start();

答案 1 :(得分:0)

ObjectAnimator适用于android 3.0(sdk 11)。对于之前的版本我接下来做了:

 private void init(int value){
      int alpha = value*0x1000000;

   ColorDrawable cl1= new           
  ColorDrawable(mContext.getResources().getColor(R.color.transtion_item1)  
     +alpha);
  ColorDrawable cl2= new   
   ColorDrawable(mContext.getResources().getColor(R.color.transtion_item2)   
     +alpha);
    TransitionDrawable transition = new TransitionDrawable( new Drawable[]{cl1,cl2});
    if(Build.VERSION.SDK_INT<16)
       v.setBackgroundDrawable(transition);
    else
        v.setBackground(transition);
    mTransitionCount=0;
    startCyclicTransition(transition);

}

private void startCyclicTransition(final TransitionDrawable trans){
    if (mTransitionCount >=0) {
        if(mTransitionCount%2==0) {
            trans.startTransition(2000);
        }else {
            trans.reverseTransition(2000);
        }
        mTransitionCount++;
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                startCyclicTransition(trans);
            }
        }, 2000);
    }
}