有关android屏幕适配问题
中心思想
™这个的话,没有屏幕适配的就是所有的坐标都是固定的呗,那适配以后的就是所有坐标都按屏幕的大小乘一定比例以后得到的相对坐标。
就比如有以下几张图:
打算做成下面这种效果
流程如下:
- private Canvas canvas;
- private Bitmap backgroundBitmap;
- // 画布的宽和高
- private float canvasWidth;
- private float canvasHeight;
- //背景图片的宽和高
- private int backWidth;
- private int backHeight;
- //背景图片的矩形
- private Rect backRect;
- //画布的矩形
- private RectF canvasRect;
画布的宽和高是为了得到整个画布所在的矩形框,即屏幕的矩形框
后面所有图形化的位置都是根据相对于画布的相对位置得到的
™音乐和暂停图片和位置的声明:
接下来就是各个变量的初始化啦!
- //表示音乐状态的图片
- private Bitmap musicOnBitmap;
- //音乐图片的宽和高
- private int musicBitmapWidth;
- private int musicBitmapHeight;
- //音乐图片矩形
- private Rect musicRect;
- //音乐图片在画布上的位置
- private RectF musicOnCanvas;
- //暂停图片
- private Bitmap gamePauseBitmap;
- //重新开始图片
- private Bitmap gameRestartBitmap;
- //暂停图片的宽和高
- private int pauseImageWidth;
- private int pauseImageHeight;
- //暂停图片矩形
- private Rect pauseRect;
- //暂停图片在画布上的位置
- private RectF pauseOnCanvas;
™如果你用的是surfaceview呢,就在函数surfaceCreated里面初始化画布的宽和高:
- //获得画布宽和高
- canvasWidth = this.getWidth();
- canvasHeight = this.getHeight();
- //初始化画布矩形
- canvasRect = new RectF(0, 0, canvasWidth, canvasHeight);
- //初始化音乐图片在画布上的位置
- musicOnCanvas = new RectF(canvasWidth*395/480,canvasHeight*25/800,
- canvasWidth*450/480,canvasHeight*75/800);
- //初始化暂停图片在画布上的位置
- pauseOnCanvas = new RectF(canvasWidth*320/480,canvasHeight*100/800,
- canvasWidth*435/480,canvasHeight*150/800);
要知道准确画出图片,首先要计算图片在画布上的位置,
™比如音乐那个小喇叭吧,在屏幕的右上角处,如果屏幕的大小是480,800的。那么小喇叭的左上角坐标是(395,25)右下角(450,75),但是我们不能用固定屏幕的嘛,所以就根据画布的宽和高得到相对屏幕的坐标左上角(canvasWidth*395/480,canvasHeight*25/800),右下角(canvasWidth*450/480,canvasHeight*75/800)
™那么小图片在屏幕上的矩形位置就如上面所示啦(当然,那些比例是可以化简的)
™
™注意哦,因为surfaceCreat函数的执行顺序是比类的构造函数晚的,所以不可以在构造函数里初始化需要用画布宽和高来计算的变量。
™如果用的是view,
™在构造函数里用以下函数就可以得到屏幕宽和高
- //得到屏幕的高和宽
- WindowManager manage = getWindowManager();
- Display display = manage.getDefaultDisplay();
- int screenHeight = display.getHeight();
- int screenWidth = display.getWidth();
- //初始化背景图
- backgroundBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.background);
- //初始化背景的宽和高
- backWidth = backgroundBitmap.getWidth();
- backHeight = backgroundBitmap.getHeight();
- //初始化背景矩形
- backRect = new Rect(0, 0, backWidth, backHeight);
- //初始化音乐图片
- musicOnBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.music_on);
- musicOffBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.music_off);
- //初始化音乐图片宽和高
- musicBitmapWidth = musicOnBitmap.getWidth();
- musicBitmapHeight = musicOnBitmap.getHeight();
- //初始化音乐图片矩形
- musicRect = new Rect(0,0,musicBitmapWidth,musicBitmapHeight);
- //初始化暂停图片
- gamePauseBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.game_pause);
- //初始化暂停图片的宽和高
- pauseImageWidth = gamePauseBitmap.getWidth();
- pauseImageHeight = gamePauseBitmap.getHeight();
- //初始化暂停图片矩形
- pauseRect = new Rect(0,0,pauseImageWidth,pauseImageHeight);
特别注意像以上那样,我们需要图片的宽和高还有所在的矩形都要初始化,因为会在接下来的绘图函数中遇到,这么得到的变量都是适应任何屏幕的。
这些准备工作做好以后,接下来就可以直接绘图就好了。
™这是在画游戏背景:
- canvas.drawBitmap(backgroundBitmap, backRect, canvasRect, null);
第一个参数使我们初始化的位图资源
第二个参数是图片的矩形,即图片左上角和右下角相对于图片自身的坐标,由于是背景图,所以整个图片都画上去
第三个图就是图片在画布上的位置,这个是背景图么所以是填满画布的,直接用画布所在的矩形就好了
™下面是画音乐和暂停的小图片:
- canvas.drawBitmap(musicOnBitmap, musicRect, musicOnCanvas, null);
- canvas.drawBitmap(gamePauseBitmap, pauseRect, pauseOnCanvas, null);
音乐和暂停的矩形,里面的坐标,都在初始化函数中计算出来了,这里直接用就好了
这么画出来的图片就是适配屏幕的啦
- <img src="http://hi.csdn.net/attachment/201111/21/0_1321856379i941.gif" alt="" />