Ok, I finally did this by getting the denitiy device mapping as
getResources().getResources().getDisplayMetrics().densityDpi
and based on this, the multiplier is multiplied by a PTM coefficient of 0.75,1,1,5,2,0 for ldpi, mdpi, hdpi and xhdpi, respectively.
I also scale the sprites. And for positioning, I saved 320X480 as a base, and then multiplied it with the ratio of my current x and y in pixels with basic pixels.
EDIT: adding code for a better understanding:
public class MainLayer extends CCLayer() { CGsize size; //this is where we hold the size of current display float scaleX,scaleY;//these are the ratios that we need to compute public MainLayer() { size = CCDirector.sharedDirector().winSize(); scaleX = size.width/480f;//assuming that all my assets are available for a 320X480(landscape) resolution; scaleY = size.height/320f; CCSprite somesprite = CCSprite.sprite("some.png"); //if you want to set scale without maintaining the aspect ratio of Sprite somesprite.setScaleX(scaleX); somesprite.setScaleY(scaleY); //to set position that is same for every resolution somesprite.setPosition(80f*scaleX,250f*scaleY);//these positions are according to 320X480 resolution. //if you want to maintain the aspect ratio Sprite then instead up above scale like this somesprite.setScale(aspect_Scale(somesprite,scaleX,scaleY)); } public float aspect_Scale(CCSprite sprite, float scaleX , float scaleY) { float sourcewidth = sprite.getContentSize().width; float sourceheight = sprite.getContentSize().height; float targetwidth = sourcewidth*scaleX; float targetheight = sourceheight*scaleY; float scalex = (float)targetwidth/sourcewidth; float scaley = (float)targetheight/sourceheight; return Math.min(scalex,scaley); } }
source share