我正在编写wpf音乐键盘应用程序,其中我有16个按钮(以下是真实音乐板https://www.youtube.com/watch?v=3vC5TsSyNjU的示例)。
每个按钮播放不同的音乐样本。这很好用。 但是当用户处于空闲状态时,我想创建下图所示的简单动画。
动画从按钮1开始(将其背景颜色设置为白色,然后返回原始颜色)。
以下是动画的步骤:
我创建了函数 AnimatePad ,它按下按钮并在指定时间后启动背景颜色动画。此功能按预期工作。
为了实现上述步骤,我为每个按钮调用了 AnimatePad 功能。这是我正在使用的代码,这是我想要改进的。我目前已对此步骤进行了硬编码。如果我的按钮计数变化,我必须返回并更改此代码,这是一个坏主意。
double beginMs = 0;
var spd = 300;
var interval = 40;
var toColor = Color.FromRgb(255, 255, 255);
AnimatePad(ref beginMs, spd, pads[0], toColor);
beginMs += interval;
AnimatePad(ref beginMs, spd, pads[1], toColor);
AnimatePad(ref beginMs, spd, pads[4], toColor);
beginMs += interval;
AnimatePad(ref beginMs, spd, pads[2], toColor);
AnimatePad(ref beginMs, spd, pads[5], toColor);
AnimatePad(ref beginMs, spd, pads[8], toColor);
beginMs += interval;
AnimatePad(ref beginMs, spd, pads[3], toColor);
AnimatePad(ref beginMs, spd, pads[6], toColor);
AnimatePad(ref beginMs, spd, pads[9], toColor);
AnimatePad(ref beginMs, spd, pads[12], toColor);
beginMs += interval;
AnimatePad(ref beginMs, spd, pads[7], toColor);
AnimatePad(ref beginMs, spd, pads[10], toColor);
AnimatePad(ref beginMs, spd, pads[13], toColor);
beginMs += interval;
AnimatePad(ref beginMs, spd, pads[11], toColor);
AnimatePad(ref beginMs, spd, pads[14], toColor);
beginMs += interval;
AnimatePad(ref beginMs, spd, pads[15], toColor);
所以我想要更通用的方法来选择动画按钮。
我敢肯定必须有一些算法。谢谢!
答案 0 :(得分:2)
想象一下带有索引和索引总和的2d数组。 如果添加每个按钮的索引,您将获得总和。 例如, 0,0 项的总和为0. 2,1 索引和为3,依此类推。
在步骤1中选择具有索引和0的按钮,在步骤2中选择具有索引和1的按钮等。
我不知道垫阵列的类型是什么。如果它们只是按钮数组,那么我建议创建复杂类型。例如:
public class PadItem
{
public Button Pad {get; set; }
public int IndexSum {get; set; }
}
以下是样本:
for (int i = 0; i < 7; i++)
{
var stepPads = pads.Where(p => p.IndexSum == i);
beginMs += interval;
foreach (var pad in stepPads)
{
AnimatePad(ref beginMs, spd, pad, toColor);
}
}
答案 1 :(得分:1)
试试这个:
var n = (int) Math.Sqrt(pads.Length);
int i = 0, j = 0, k = 0;
for(i = 0; i < n; i++){
k = i;
AnimatePad(ref beginMs, spd, pads[k], toColor);
for(j = 0; j < i; j++){
k += n-1;
AnimatePad(ref beginMs, spd, pads[k], toColor);
}
beginMs += interval;
}
for(i = n-2; i >= 0; i--){
k = (n-i)*n - 1;
AnimatePad(ref beginMs, spd, pads[k], toColor);
for(j = 0; j < i; j++){
k += n-1;
AnimatePad(ref beginMs, spd, pads[k], toColor);
}
beginMs += interval;
}