我有一个透明的黑色背景视图:#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);
那么,我做错了什么?或者有更好的方法来实现这个目标吗?
答案 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);
}
}