Sub InterpolateColor(StartClr As Int, EndClr As Int, Fraction As Float) As Int
Dim clr As Int
For i = 0 To 3
Dim shift As Int = 8 * i
Dim src As Int = Bit.UnsignedShiftRight(Bit.And(StartClr, Bit.ShiftLeft(0xff, shift)), shift)
Dim target As Int = Bit.UnsignedShiftRight(Bit.And(EndClr, Bit.ShiftLeft(0xff, shift)), shift)
clr = clr + Bit.ShiftLeft(Max(0, Min(255, src + (target - src) * Fraction)), shift)
Next
Return clr
End Sub
Usage example:
B4X:
Dim x As B4XView = MainForm.RootPane
For i = 0 To 100
x.Color = InterpolateColor(xui.Color_Green, xui.Color_Magenta, i / 100)
Sleep(30)
Next
Dim v As B4XView =Pane2
For i=0 To 350 Step 20
For j=0 To 500 Step 20
v.Color = InterpolateColor(xui.Color_red, xui.Color_blue, Rnd(0,100)/ 100)
cvs1.DrawCircle(i,j,5,v.Color,True,1)
Next
Next
But the pane2 color also changes and I expect only the circle color should change!
The code I posted does a linear interpolation between two colors. I'm not sure what you mean with more colors. You can split the distance into several sections and add more colors (red to green and then green to blue for example).