我有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()
答案 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值。