首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

density怎么解读

2012-06-13 
density如何解读?用下面的代码,已经绘画出一幅图了,但有一点不是很明白:canvas.drawBitmap(bmpWelcomeback

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");    }} 



[解决办法]
density是屏幕的密度,320*480的手机屏幕是标准的,
drawBitmap是在画布上根据像素来画的,而且初始位置是x,y坐标来定,如果你的屏幕稍大, 右边就会留出空隙,所以很多布局都是用dp来控件控件的大小,dp是像素无关的,

热点排行