Personally I use an old version of Memory Map (with a variety of maps I have 'acquired').
It has all those features. Though it is a rather weird interface, and can be a bit fiddly for manipulating tracks. I prefer Garmin BaseCamp for that.
For Android, there are a couple of unofficial apps (MM-Tracker and AlpineQuest) which can use maps from Memory Map. Though I think the newer versions of the maps are a different format, with copy protection etc, so won't work in these apps.
There is also an official Memory Map app, though I don't know if its any good.
You could also look at Mapyx Quo. I think its a bit cheaper than Memory Map / Anquet etc for 1:50K maps. Plus it has some of the OS OpenData and OpenStreetMap maps available for free. Though I don't think there's any Android app.