Android TransitionDrawable没有褪色

时间:2015-08-08 19:35:04

标签: android android-transitions

我有Drawable bgs[] = new Drawable[2]; public void redraw(int[][] grid) { bgs[0] = bgs[1]; bgs[1] = new GameDrawable(grid, prefs.colors); if (bgs[0] == null) { gameField.setImageDrawable(bgs[1]); } else { TransitionDrawable crossfader = new TransitionDrawable(bgs); crossfader.setCrossFadeEnabled(true); gameField.setImageDrawable(crossfader); crossfader.startTransition(500); } } ,我正在尝试使用此代码从一张图片淡入下一张图片:

public class GameDrawable extends Drawable {

    private Paint paint = new Paint();
    private float blockWidth = 1;
    private int[][] myGrid;
    private int myColor;
    private List<Point> myPoints;

    public GameDrawable(int[][] grid) {
        super();
        this.myGrid = grid;
        this.myColor = colors[yourColor];
        paint.setStrokeWidth(1);
        paint.setStyle(Paint.Style.FILL);
        paint.setAlpha(0);
        this.myPoints = yourPoints;
    }

    @Override
    public void draw(Canvas canvas) {
        float height = getBounds().height();
        float width = getBounds().width();
        blockWidth = width / myGrid.length;
        if (height / myGrid.length < blockWidth) {
            blockWidth = height / myGrid.length;
        }

        for (int x = 0; x < myGrid.length; x++) {
            for (int y = 0; y < myGrid[x].length; y++) {
                paint.setColor(colors[myGrid[x][y]]);
                canvas.drawRect(x * blockWidth, y * blockWidth, (x+1)*blockWidth, (y+1)*blockWidth, paint);
            }
        }
    }

    @Override
    public void setAlpha(int alpha) {
        paint.setAlpha(alpha);
        invalidateSelf();
    }

    @Override
    public void setColorFilter(ColorFilter cf) {
        paint.setColorFilter(cf);
        invalidateSelf();
    }

    @Override
    public int getOpacity() {
        return PixelFormat.TRANSLUCENT;
    }
}

gameField被正确引用为ImageView。

gameDrawable只是扩展了Drawable并绘制了网格。

在每次移动和动作时,新的GameDrawable正在被正确渲染,但不会有任何褪色。即时显示新图像。我试过延长过渡时间并交换drawable的顺序没有效果。

感谢任何帮助。

更新:我现在已经将过渡设置为像500000这样可笑的东西。第一个可绘制的显示几秒钟,然后突然出现第二个可绘制的。所以仍然没有过渡。

更新2: 我认为我的Drawable可能被错误地实现了,所以我附上了代码。

p = pyaudio.PyAudio()

stream = p.open(format=pyaudio.paInt16,
            channels=18,
            rate=44100,
            input=True,
            frames_per_buffer=1024,
            output_device_index=1)

for i in range(0, 1000):
data = stream.read(CHUNK)
frames.append(data)

stream.stop_stream()
stream.close()
p.terminate()

target = open('target.txt', 'w')
target.write(repr(frames))
target.close()

1 个答案:

答案 0 :(得分:4)

查看您的代码,我发现该行存在问题

bgs[0] = bgs[1];

bgs [1]尚未在此行之前定义,因此第一次方法调用的bgs [0]为null。因此,(bgs [0] == null)为真,因此后来定义的bgs [1]直接设置为gameField ImageView。

使用下面的更正代码。

Drawable bgs[] = new Drawable[2];
Drawable firstDrawable = getResources().getDrawable(R.drawable.transparent);

public void redraw(int[][] grid) {
    bgs[0] = firstDrawable;
    bgs[1] = new GameDrawable(grid, prefs.colors);
    firstDrawable = bgs[1];
    TransitionDrawable crossfader = new TransitionDrawable(bgs);
    crossfader.setCrossFadeEnabled(true);
    gameField.setImageDrawable(crossfader);
    crossfader.startTransition(500);
}

请注意,当Drawable尺寸不同时,TransitionDrawable无法正常工作。所以你可能需要事先调整firstDrawable的大小。

EXTRA:我会避免使用setCrossFadeEnabled(true),因为整个TransitionDrawable在转换期间变得半透明,显示背景。有时,这会产生一种眨眼的声音。影响和破坏过渡的平稳性。

编辑:看看你的自定义Drawable实现,我认为问题在于

canvas.drawColor(Color.WHITE);
在draw()方法中

我查看了TransitionDrawable.java源代码,发现在drawables上调用了setAlpha以获得交叉淡入淡出效果。但是,您的画布具有纯白色,setAlpha()仅影响绘画。希望这是你的答案。

编辑2:迈克尔指出,实际问题是由于setAlpha()中的paint.setColor()而导致对Drawables的TransitionDrawable GameDrawable调用无效#39; s draw()方法覆盖了由TransitionDrawable设置的paint的alpha值。