density怎么解读

density如何解读?
用下面的代码,已经绘画出一幅图了,但有一点不是很明白:canvas.drawBitmap(bmpWelcomebackage, 0, 100, null)是如何保证图片刚好满屏幕宽度?

看了下,图片尺寸是:320 * 273

在ME525手机里测试是刚好居中。
hw.lcd.density=160时,模拟器也刚好居中。

但如果把图片尺寸变小,它并不能保证水平居中,右边会少很多。

查了下,ME525手机分辨率是:480*854!

density究竟是啥?

Java code
package cxl.cqy;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

/*
 * 函数介绍:欢迎界面
 *             取代默认的public void setContentView(int layoutResID)方法设置的界面
 *             用public void setContentView(View view)方法
 */

public class welcomeView extends SurfaceView implements SurfaceHolder.Callback {
    private static final String TAG = "welcomeView";
    private Bitmap bmpWelcomebackage;
    private threadWelcome thread;
    
    //构造
    public welcomeView(Context context) {
        super(context);

        SurfaceHolder holder = getHolder();
        holder.addCallback(this);
        thread = new threadWelcome(this, holder);
        loadPicture();
    }
    
    /*
     * 函数介绍:界面创建
     *             回调函数,来自SurfaceHolder.Callback
     *             不会凭空跑,需addCallback后才可
     * 输入参数:holder,表面主
     * 输出参数:无
     * 返回值  :无
     */
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        Log.v(TAG, "surfaceCreated enter");
        thread.start();
        Log.v(TAG, "surfaceCreated exit");
    }

    /*
     * 函数介绍:界面变更
     *             回调函数,来自SurfaceHolder.Callback
     *             不会凭空跑,需addCallback后才可
     * 输入参数:holder,表面主;format,像素格式;width,宽;height,高
     * 输出参数:无
     * 返回值  :无
     */
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
        Log.v(TAG, "surfaceChanged enter");
        Log.v(TAG, "surfaceChanged exit");
    }

    /*
     * 函数介绍:界面摧毁
     *             回调函数,来自SurfaceHolder.Callback
     *             不会凭空跑,需addCallback后才可
     * 输入参数:holder,表面主;format,像素格式;width,宽;height,高
     * 输出参数:无
     * 返回值  :无
     */
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        Log.v(TAG, "surfaceDestroyed enter");
        thread.stop();
        Log.v(TAG, "surfaceDestroyed exit");
    }
    
    /*
     * 函数介绍:屏幕监听
     *             重载函数,来自View
     *             可以凭空跑了,点击屏幕即可
     *             编译器现象:return true行跑完,下一行会落在return super.onTouchEvent(event)
     * 输入参数:event,事件类型
     * 输出参数:无
     * 返回值  :True,已受理;false,未受理
     */
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.v(TAG, "onTouchEvent enter");
        if (event.getAction() == MotionEvent.ACTION_DOWN)
        {
            Log.v(TAG, "onTouchEvent : action down enter");
            Log.v(TAG, "onTouchEvent : action down exit");
            return true;
        }

        Log.v(TAG, "onTouchEvent exit");
        return super.onTouchEvent(event);
    }
    
    /*
     * 线程类介绍:线程
     *             以刷帧之用
     */
    class threadWelcome extends Thread {
        private welcomeView wView;
        private SurfaceHolder sHolder;
        /*
         * 函数介绍:构造器
         *             需要提供包裹类的view和holder,以方便数据的访问和操作
         * 输入参数:v, 视; holder,拥有者
         * 输出参数:无
         * 返回值  :无
         */
        public threadWelcome(welcomeView v, SurfaceHolder holder) {
            Log.v(TAG, "threadWelcome enter");
            wView = v;
            sHolder = holder;
            Log.v(TAG, "threadWelcome exit");
        }
        
        /*
         * 函数介绍:线程运行
         *             重载函数,来自Thread
         *             不会凭空跑,需new此类实例,且start才可
         * 输入参数:无
         * 输出参数:无
         * 返回值  :无
         */
        @Override
        public void run() {
            Log.v(TAG, "run enter");
            Canvas c;
            c = sHolder.lockCanvas(null);
            wView.drawPicture(c);
            sHolder.unlockCanvasAndPost(c);
            Log.v(TAG, "run exit");
        }
    }
    
    /*
     * 函数介绍:从资源里加载图片
     *             源文件不能有大写字母
     * 输入参数:无
     * 输出参数:无
     * 返回值  :无
     */
    private void loadPicture() {
        Log.v(TAG, "loadMusic enter");
        Resources res = getResources();
        bmpWelcomebackage = BitmapFactory.decodeResource(res, R.drawable.welcomebackage);
        Log.v(TAG, "loadMusic exit");
    }
    
    /*
     * 函数介绍:绘画图片
     * 输入参数:canvas,绘画板
     * 输出参数:无
     * 返回值  :无
     */
    private void drawPicture(Canvas canvas) {
        Log.v(TAG, "drawPicture enter");
        canvas.drawColor(Color.BLACK);
        canvas.drawBitmap(bmpWelcomebackage, 0, 100, null);
        Log.v(TAG, "drawPicture exit");
    }
}