Last I looked, the 8dir behavior collisions work like this:
Move the object with it's speed
if the object overlaps a solid then move it back to it's last non overlapping position and set the speed to 0
It's a valid way to do it, but it can cause it to stop short of the solid, then speed up again to close the smaller and smaller gap. Aka the effect you are observing.
So a more desirable behavior would be for the overlapping object to move flush against the solid before stopping.
Maybe by not using the solid behavior, and using the push out action of the customMovement behavior when overlapping the wall sprite or just doing your own push out with events. I think there have been some other topics with examples of a push out with events.
Another idea is to keep track if the object is moving or not over multiple frames and only change the animation if it has stayed the same over multiple frames. That should eliminate most of the flickering with the only drawback of causing a slight frame delay for animation changes. So for example if you keep track of 4 frames it could look like this:
global number f1=0
global number f2=0
global number f3=0
global number f4=0
every tick
--- set f4 to f3
--- set f3 to f2
--- set f2 to f1
sprite is moving
--- set f1 to 1
else
--- set f1 to 0
compare f1+f2+f3+f4 = 4
--- set animation to walking
compare f1+f2+f3+f4 = 0
--- set animation to stopped