1

我有

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,所以我不确定我的画布方法是否正确。使用 Log.d,我看到一旦它进入一个内部 for 循环(前面带有“if”语句的循环),它就不会离开那个 for 循环......这对我来说没有意义但我认为这与画布和支架有关。帮助?

4

1 回答 1

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();
}
于 2012-08-31T23:02:44.113 回答