For the actual math of warping, this can get very complicated, why don't you start here?.
I'll now talk about how you can apply this, assuming you've already got the math for how you will do your deformations down.
1) Every frame, visit every vertex in the cylinder model and offset it in some way.
2) Offset the vertices in the vertex shader as you are rendering. OpenGL ES 2.0 supports vertex shaders. So you're in luck, in a way.
Do you want to only warp the object as it appears on the screen, or do you want to warp the object so every object in the game knows that it has been deformed?
If you warp the object in the vertex shader, then that happens only immediately prior to display/rasterization, so this means none of the game objects will know about the deformation. This is fine if you're simply making a screen saver, or if the deformations are so small that they have no impact on the collidable shape of the object.
When you warp the geometry in the vertex shader __the original vertices of the model actually don't move__, (they only appear to move).
Deformation in vertex shader
This is from chapter 6 of the cg tutorial, (program #14).
The shader code to produce this deformation is something like
// choose a displacement amount
float displacement = scaleFactor * 0.5 * sin(position.y * frequency * time) + 1 ;
// displace it in the direction of the normal
float4 displacementDirection = float4(normal.x, normal.y, normal.z, 0) ;
// move the vertex
float4 newPosition = position + displacement * displacementDirection ;
// transform (as normal)
oPosition = mul(modelViewProj, newPosition) ;
So you can see, this happens RIGHT BEFORE display (vertex shader happens on GPU) so CPU code has practically no way to access the transformed vertex position (there are ways to send data from the GPU to the CPU (primarily via textures) but we won't go there).