Andorid 颜色渐变的实现

2014-11-24(一) by chenjia.me

颜色渐变

今天看到一个软件清理~动态效果很不错,从黄色到绿色表示的是电脑垃圾减少的过程~

然后就想实现一个~


颜色渐变是有算法的,最开始想从16进制的000000加到ffffff发现是不对的。

//这是无意义的一行,防止subString出错========

简单得渐变应该是将色值拆开,成为这样:

int Red from 00 to (255)ff
int Blue from 00 to (255)ff
int Green from 00 to (255)ff

因此我们可以得到一个简单算法。

  1. 起始颜色比如#000000拆分为00 00 00,终点颜色为#FFFFFF拆开为FF FF FF
  2. 确定渐变的步数,为x
  3. 起始值减去终点值除以步数x就是每步我们要改变的数值

Android核心代码

开线程,修改bg的颜色色值

主要涉及:

  1. android的颜色转换new Color().parseColor(color_str)
  2. android的多线程
  3. Java 10进制到16进制转换Integer.toHexString()
  4. 进制转换的溢出和补0的操作
    String return2(String str){
        if(str.length()==1)
            return "0"+str;
        if(str.length()==0)
            return "00"+str;
        if(str.length()>2)
            return str.substring(str.length()-2,str.length());
        return str;
    }
    

实现的核心代码

    ImageView imageView;
    Handler handler;
    TextView textView;
    int color=16777215;
    private void initgreen() {
        // TODO Auto-generated method stub
        imageView=(ImageView)findViewById(R.id.imageView1);
        imageView.setOnClickListener(MainActivity.this);
        imageView.setBackgroundColor(new Color().BLACK);
        textView=(TextView)findViewById(R.id.textView1);
        handler=new Handler();

    }

    double r=255;
    double g=0;
    double b=255;
    Runnable runnable = new Runnable() {  
        @Override  
        public void run() {  
            r=r-1;
            g=g+0.5;
            b=b-0.25;
            String color_str;
            color_str="#"+return2(Integer.toHexString((int)r))+return2(Integer.toHexString((int)g))+return2(Integer.toHexString((int)b));
             Log.i("color", color_str);
            imageView.setBackgroundColor(new Color().parseColor(color_str));
            textView.setText(color_str);
            if(r>=1)
            handler.postDelayed(this, 19);

        }  
    };

    String return2(String str){
        if(str.length()==1)
            return "0"+str;
        if(str.length()==0)
            return "00"+str;
        if(str.length()>2)
            return str.substring(str.length()-2,str.length());
        return str;
    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        if(v.getId()==R.id.imageView1){
            r=255;
            g=127;
            b=64;
            handler.postDelayed(runnable, 100);
        }
    }

Comments