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);
                    }
                }
            }

        }
    }

これはそのまま機能し、最初の色から 2 番目の色、2 番目の色、3 番目の色へとフェードしていくはずだと思います。以上。(私は別のデータもテストしました)。SurfaceView を使用するのはこれが初めてなので、キャンバス メソッドの実行方法が正しいかどうかはわかりません。Log.d を使用して、内側の for ループ (前に「if」ステートメントがあるループ) の 1 つに入ると、その 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 に答える