C# 选择方阵对角线上的单元格(按钮)
我正在编写wpf音乐垫应用程序,其中我有16个按钮(这里是一个真正的音乐垫示例) 每个按钮播放不同的音乐样本。这很有效。 但当用户处于空闲状态时,我想创建下图所示的简单动画 动画从按钮1开始(将其背景色设置为白色,然后返回到原始颜色) 以下是动画的步骤:C# 选择方阵对角线上的单元格(按钮),c#,algorithm,animation,C#,Algorithm,Animation,我正在编写wpf音乐垫应用程序,其中我有16个按钮(这里是一个真正的音乐垫示例) 每个按钮播放不同的音乐样本。这很有效。 但当用户处于空闲状态时,我想创建下图所示的简单动画 动画从按钮1开始(将其背景色设置为白色,然后返回到原始颜色) 以下是动画的步骤: 步骤1:为按钮设置动画:1 步骤2:为按钮设置动画:2,Q 步骤3:为按钮设置动画:3、W、A 步骤4:为按钮设置动画:4、E、S、Z 步骤5:为按钮设置动画:R、D、X 步骤6:为按钮设置动画:F、C 步骤7:为按钮设置动画:V 我创建
- 步骤1:为按钮设置动画:1
- 步骤2:为按钮设置动画:2,Q
- 步骤3:为按钮设置动画:3、W、A
- 步骤4:为按钮设置动画:4、E、S、Z
- 步骤5:为按钮设置动画:R、D、X
- 步骤6:为按钮设置动画:F、C
- 步骤7:为按钮设置动画:V
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);
所以我想要更通用的方式来选择动画按钮
我相信一定有某种算法。谢谢大家! 试试这个:
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;
}
var n=(int)Math.Sqrt(pads.Length);
int i=0,j=0,k=0;
对于(i=0;i=0;i--){
k=(n-i)*n-1;
AnimatePad(参考beginMs、spd、pads[k]和toColor);
对于(j=0;j
想象一个二维数组,其中包含索引及其索引之和。
如果您添加每个按钮的索引,您将得到总和。
例如,0,0项的总和为0。2,1索引和为3,依此类推
在步骤1中选择索引和为0的按钮,在步骤2中选择索引和为1的按钮,以此类推
我不知道pads阵列的类型是什么。如果它们只是按钮数组,那么我建议创建复杂类型。例如:
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);
}
}
for(int i=0;i<7;i++)
{
var steppad=pads.Where(p=>p.IndexSum==i);
beginMs+=间隔;
foreach(阶梯垫中的var垫)
{
AnimatePad(参考beginMs、spd、pad、toColor);
}
}
你的pad
应该是方形阵列,这样会更容易。否则,如果行数=列数,我们可以使用<代码>数学> Sqrt <代码>,但是使用方数组更好。请问你是如何确定矩形矩阵上给定的对角线元素的索引的?或者,如果你只想改善当前代码的考虑。不,我想用通用的方法来确定索引。Pad始终是方形阵列。@WaterDance,请检查您是否同意我对标题的编辑,请随时改进(或还原,我也不认为原始标题明确指定了您要查找的内容)。输入检查假定Pad。长度应该是某个数字的平方,例如4
,9
,16
,25
,…不。没用。我将n转换为int。但动画顺序不正确。@WaterDance算法对我来说似乎是正确的,它根本没有动画?或者以错误的顺序设置动画?@WaterDance您能检查一下它当前设置动画的确切顺序吗?它以错误的顺序设置动画。首先是1,然后是2,Q,R,这是不正确的。