SurfaceView + Canvas,从一种颜色淡化到另一种颜色

时间:2012-08-31 22:17:35

标签: android surfaceview surfaceholder

我有

ArrayList<ColorDrawable> colors = new ArrayList<ColorDrawable>();
for(int i = 0; i = intList.size(); i++){ //some list of ints
    colors.add(new ColorDrawable(intList.get(i)));

我想使用SurfaceView + Canvas方法从列表中的一种颜色渐变到另一种颜色。这是我的尝试:

 public void run() {
    int maxIndex = colors.size() - 1;
        while (isItOK) {
            for (int i = 0; i <= maxIndex; i++) {
                int color = colors.get(i).getColor();
                int nextColor = (i == maxIndex) ? colors.get(0).getColor() : colors.get(i + 1).getColor();

                if(color < nextColor) {
                    for(; color <= nextColor; color++) {
                        Canvas c = holder.lockCanvas();
                        c.drawColor(color);
                        holder.unlockCanvasAndPost(c);
                    }
                }


                if(color > nextColor) {
                    for(; color >= nextColor; color--) {
                        Canvas c = holder.lockCanvas();
                        c.drawColor(color);
                        holder.unlockCanvasAndPost(c);
                    }
                }
            }

        }
    }

我觉得这应该按原样运行并从第一种颜色逐渐淡化到第二种颜色,依此类推......最后循环,但相反,它从第一种颜色开始,逐渐消失为一些不相关的颜色, 一遍又一遍。 (我也测试了不同的数据)。这是我第一次使用SurfaceView,所以我不确定我的canvas方法是否正确。 使用Log.d,我看到一旦它进入内部for循环之一(在它们之前带有“if”语句的那个​​),它就不会留下for循环 ....对我没有意义,但我认为它与画布和持有人有关。帮助

1 个答案:

答案 0 :(得分:2)

我不确定,如果我理解你,如果没有,请告诉我。

根据我的理解,您希望:循环颜色并每次将backgroundcolor设置为颜色列表的第i个元素

更新:请注意,我还没有测试过喷射!

int currentIndex = 0;
int nextIndex = 0;

while (isItOK) 
{
    nextIndex = (currentIndex + 1) % colors.size();

    int currentColor = colors.get(currentIndex).getColor();
    int nextColor = colors.get(nextIndex).getColor();
    while(currentColor != nextColor)
    {
        //extract red, green, blue, alpha from the current color

        int r = Color.red(currentColor); //android.graphics.Color
        int g = Color.green(currentColor);
        int b = Color.blue(currentColor);
        int a = Color.alpha(currentColor);

        //extract the same from nextColor
        int nr = Color.red(nextColor);
        int ng = Color.green(nextColor);
        int nb = Color.blue(nextColor);
        int na = Color.alpha(nextColor);

        //get currentColors values closer to nextColor 
        r = (r<nr) ? r+1 : ((r>nr) ? r-1 : r);
        g = (g<ng) ? g+1 : ((g>ng) ? g-1 : g);
        b = (b<nb) ? b+1 : ((b>nb) ? b-1 : b);
        a = (a<na) ? a+1 : ((a>ar) ? a-1 : a);

        // generate currentColor back to a single int
        currentColor = Color.argb(a,r,g,b);

        // paint it 
        Canvas canvas = holder.lockCanvas();
        canvas.drawColor(currentColor );
        holder.unlockCanvasAndPost(canvas);
    }
    currentIndex = (currentIndex + 1) % colors.size();
}