我有
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循环 ....对我没有意义,但我认为它与画布和持有人有关。帮助
答案 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();
}