Of course you can. It's normal to snap, as you do this:
target.x = position.x - target.width/2;
target.y = position.y - target.height/2;
The thing to do here is to save the location at which the object was touched. This way you can calculate the difference between it's origin point and the actual point that you've touched it. Let's say you have a square of 100x100, your origin point is at 0x0, and you touch it at 50x50.
If you move your finger exactly one pixel (just for explanation), the object should actually move ONE pixel. Logic is this:
- save touch point only once (50x50)
- every time there is a movement, check location
- make calculation: current location (51x51) - initial point (50x50) = difference (1x1)
- move the object with the difference: 0x0 + 1x1 = 1x1, which means the object will move one pixel