使位图大小和位置在每个设备上相同

时间:2015-01-07 08:45:35

标签: java android bitmap

我一直试图弄明白该怎么做,我有屏幕的大小和我使用的模拟器的大小,如何更改大小以适合所有设备(包括平板电脑和手机)并正确定位它们,因为平板电脑上的X和Y似乎与手机上的X和Y不同。

编辑:

我尝试将像素转换为DPI:

    public CreatorView(Context c) {
    super(c);
    this.c=c;


    WindowManager wm = (WindowManager) c.getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();
    this.screenw= display.getWidth();
    this.screenh=display.getHeight();


    this.PixelDetect   = BitmapFactory.decodeResource(   getResources(),   R.drawable.custom_pixel);
    this.smallpixel   = Bitmap.createScaledBitmap(PixelDetect, (int)getPixelsFromDip(3,c), (int)getPixelsFromDip(3,c), false);


    this.grass=BitmapFactory.decodeResource(getResources(), R.drawable.block_grass);
    this.grassSide=BitmapFactory.decodeResource(getResources(), R.drawable.block_grassside);
    this.grassTop=BitmapFactory.decodeResource(getResources(), R.drawable.block_grasstop);
    this.orange=BitmapFactory.decodeResource(getResources(), R.drawable.block_cube1);
    this.dirt=BitmapFactory.decodeResource(getResources(), R.drawable.block_dirt);
    this.dirt2=BitmapFactory.decodeResource(getResources(), R.drawable.block_dirt2);
    this.dirt3=BitmapFactory.decodeResource(getResources(), R.drawable.block_dirt3);
    this.arrowno=BitmapFactory.decodeResource(getResources(), R.drawable.arrow_noclick);
    this.arrown=BitmapFactory.decodeResource(getResources(), R.drawable.arrow_normal);
    this.arrowl=BitmapFactory.decodeResource(getResources(), R.drawable.arrow_left);
    this.arrowr=BitmapFactory.decodeResource(getResources(), R.drawable.arrow_right);
    this.arrowu=BitmapFactory.decodeResource(getResources(), R.drawable.arrow_up);
    this.arrowd=BitmapFactory.decodeResource(getResources(), R.drawable.arrow_down);
    this.arrowul=BitmapFactory.decodeResource(getResources(), R.drawable.arrow_upperleft);
    this.arrowur=BitmapFactory.decodeResource(getResources(), R.drawable.arrow_upperright);
    this.arrowdl=BitmapFactory.decodeResource(getResources(), R.drawable.arrow_downleft);
    this.arrowdr=BitmapFactory.decodeResource(getResources(), R.drawable.arrow_downright);
    this.arrowno=Bitmap.createScaledBitmap(arrowno, arrowno.getWidth()*3, arrowno.getHeight()*3, false);
    this.save=BitmapFactory.decodeResource(getResources(), R.drawable.button_save);
    this.bin_Empty=BitmapFactory.decodeResource(getResources(), R.drawable.bin_empty);
    this.bin_Full=BitmapFactory.decodeResource(getResources(), R.drawable.bin_full);
    this.bin_Empty=Bitmap.createScaledBitmap(bin_Empty, bin_Empty.getWidth()*3, bin_Empty.getHeight()*3, false);
    this.bin_Full=Bitmap.createScaledBitmap(bin_Full, bin_Full.getWidth()*3, bin_Full.getHeight()*3, false);
    this.arrown=Bitmap.createScaledBitmap(arrown, arrown.getWidth()*3, arrown.getHeight()*3, false);
    this.arrowl=Bitmap.createScaledBitmap(arrowl, arrowl.getWidth()*3, arrowl.getHeight()*3, false);
    this.arrowr=Bitmap.createScaledBitmap(arrowr, arrowr.getWidth()*3, arrowr.getHeight()*3, false);
    this.arrowu=Bitmap.createScaledBitmap(arrowu, arrowu.getWidth()*3, arrowu.getHeight()*3, false);
    this.arrowd=Bitmap.createScaledBitmap(arrowd, arrowd.getWidth()*3, arrowd.getHeight()*3, false);
    this.arrowul=Bitmap.createScaledBitmap(arrowul, arrowul.getWidth()*3, arrowul.getHeight()*3, false);
    this.arrowur=Bitmap.createScaledBitmap(arrowur, arrowur.getWidth()*3, arrowur.getHeight()*3, false);
    this.arrowdl=Bitmap.createScaledBitmap(arrowdl, arrowdl.getWidth()*3, arrowdl.getHeight()*3, false);
    this.arrowdr=Bitmap.createScaledBitmap(arrowdr, arrowdr.getWidth()*3, arrowdr.getHeight()*3, false);

    Menu_Add(arrowno,0,true,"arrows");
    Menu_Add(bin_Empty,1,false,"bin");
    Menu_Add(save,2,false,"save");
    Menu_Add(grassTop,1,true,"grasstop");
    Menu_Add(grassSide,2,true,"grassside");
    Menu_Add(grass,3,true,"grass");
    Menu_Add(dirt,4,true,"dirt");
    Menu_Add(orange,5,true,"orange");
    arrowsp=new Point();
    arrowsp.x=0;
    arrowsp.y=0;
}
private void Menu_Add(Bitmap b,int order,boolean vertical,String name)
{
    Point p=new Point();
    if(order==0){
        p.x=0;
        p.y=0;
        MenuButton m=new MenuButton(order,b , vertical, p,name);
        menuButtonList.add(m);
    }
    else{
        for (MenuButton m : menuButtonList) {
            if((m.isVertical()==vertical||order==1)&&m.getOrder()+1==order ){
                if(vertical){
                    p.x=0;
                    p.y=m.getP().y+m.getBit().getHeight()+(int)getPixelsFromDip(2,c);
                }
                else{
                    p.x=m.getP().x+m.getBit().getWidth()+(int)(getPixelsFromDip(2,c));
                    p.y=0;
                }
                MenuButton m2=new MenuButton(order,b , vertical, p,name);
                menuButtonList.add(m2);
                return;
            }
        }
    }
}
@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    Paint paintAlpha = new Paint();
    paintAlpha.setAlpha(200);
    canvas.drawARGB(255, 86, 194, 243);
    for(MenuButton m : menuButtonList){
        switch(m.getName()){
        case "bin":
            if(bin_isEmpty){
                canvas.drawBitmap(bin_Empty, getPixelsFromDip(m.getP().x,c), getPixelsFromDip(m.getP().y,c),paintAlpha);
                }
                else{
                    canvas.drawBitmap(bin_Full, getPixelsFromDip(m.getP().x,c), getPixelsFromDip(m.getP().y,c),paintAlpha);
                }
            break;
        case "arrows":
            canvas.drawBitmap(m.getBit(),getPixelsFromDip(m.getP().x,c),getPixelsFromDip(m.getP().y,c),paintAlpha);
            switch (arrowcheck) {
            case "normal":
                canvas.drawBitmap(arrown, getPixelsFromDip(arrowsp.x,c), getPixelsFromDip(arrowsp.y,c),paintAlpha);
                break;
            case "left":
                canvas.drawBitmap(arrowl, getPixelsFromDip(arrowsp.x,c), getPixelsFromDip(arrowsp.y,c),paintAlpha);
                break;
            case "right":
                canvas.drawBitmap(arrowr, getPixelsFromDip(arrowsp.x,c), getPixelsFromDip(arrowsp.y,c),paintAlpha);
                break;
            case "down":
                canvas.drawBitmap(arrowd, getPixelsFromDip(arrowsp.x,c), getPixelsFromDip(arrowsp.y,c),paintAlpha);
                break;
            case "up":
                canvas.drawBitmap(arrowu, getPixelsFromDip(arrowsp.x,c), getPixelsFromDip(arrowsp.y,c),paintAlpha);
                break;
            case "upleft":
                canvas.drawBitmap(arrowul, getPixelsFromDip(arrowsp.x,c), getPixelsFromDip(arrowsp.y,c),paintAlpha);
                break;
            case "upright":
                canvas.drawBitmap(arrowur, getPixelsFromDip(arrowsp.x,c), getPixelsFromDip(arrowsp.y,c),paintAlpha);
                break;
            case "downleft":
                canvas.drawBitmap(arrowdl, getPixelsFromDip(arrowsp.x,c), getPixelsFromDip(arrowsp.y,c),paintAlpha);
                break;
            case "downright":
                canvas.drawBitmap(arrowdr, getPixelsFromDip(arrowsp.x,c), getPixelsFromDip(arrowsp.y,c),paintAlpha);
                break;
            }
            break;
        default:
            canvas.drawBitmap(m.getBit(),getPixelsFromDip(m.getP().x,c),getPixelsFromDip(m.getP().y,c),paintAlpha);
            break;
        }
    }
}
public static float getPixelsFromDip(float dip,Context context)
{
    //TODO move this to aplication class?
    return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dip, context.getResources().getDisplayMetrics()); 
}

这是它在模拟器中显示的方式(正确): http://puu.sh/ehhHp/05c1530218.png 这是它在我的手机中显示的方式: http://puu.sh/ehhKX/b28ee357e3.png 请帮忙:(

5 个答案:

答案 0 :(得分:1)

您不想做的是使用像素。您最不希望做的是使用dps来设置宽度/高度,除非您准备为不同的分辨率设备设置不同的值(通过指定@dimen中的值并覆盖不同大小的值)。

如果您知道想要使用ImageView的屏幕宽度(或高度)大约有多少,那么您可以做的最简单的事情就是在LinearLayout内使用权重。

一个例子就是这个(手写并且缺少所有NS前缀)

<LinearLayout
 ...
 ...
 orientation=vertical>

    <some empty filler here with weight=1 and width="match_parent"/>
    <ImageView 
     ...
     ...
     width="match_parent"
     scaleType=fitCenter (or whatever works for your images)
     weight=1 />

    <some empty filler here with weight=1 width="match_parent"/>
</LinearLayout>

这样做可以确保您的ImageView占据屏幕宽度的1/3(由权重确定)。然后,您可以通过设置正确的scaleType来控制图像缩放。这将适用于所有手机尺寸和平板电脑,无论设备的分辨率或方向如何,都可以占据屏幕宽度的1/3(可能是您想要的也可能不是这样)。

如果你想要更多/少于图像屏幕宽度的1/3,你也可以使用权重。

已经提到了其他解决方案(例如使用dp)但是它们涉及的更多,你必须覆盖它们以获得不同的分辨率,如上所述。

答案 1 :(得分:0)

以像素为单位的定位肯定会有所不同,因为不同类型的设备具有不同的DPI。

所以用widht声明Imageview,dp中的高度应该可以解决你的问题。即将定位,应该相对地或通过重力来维持。

我们需要您的代码来了解问题究竟是什么以及您需要什么。

修改 将Dip转换为像素并将其应用于您的位图大小。 它将保持物理尺寸并根据设备获得分辨率。

public static int convertDipToPixels(float dips)
{
    return (int) (dips * appContext.getResources().getDisplayMetrics().density + 0.5f);
}

编辑2:

只需使用此代码段更改循环,然后检查它是否在所有设备上复制

for (MenuButton m : menuButtonList) {
        if((m.isVertical()==vertical||order==1)&&m.getOrder()+1==order ){
            if(vertical){
                p.x=0;
                p.y=(int)getPixelsFromDip(100,c);
            }
            else{
                p.x=m(int)(getPixelsFromDip(100,c));
                p.y=0;
            }
            MenuButton m2=new MenuButton(order,b , vertical, p,name);
            menuButtonList.add(m2);
            return;
        }
    }

答案 2 :(得分:0)

为什么不使用百分数? 例如 - 百分数x = device.width / 100; 并开始在这个位置绘制图像*百分比? 在每个设备中,如果看起来应该相似,但有拉链。

答案 3 :(得分:0)

使用dp定义图像的宽度和高度。或者我们可以计算屏幕图像大小的百分比。

答案 4 :(得分:0)

好吧,如果你使用xml布局,只需使用密度像素值&#34; 10dp&#34;来限制layout_width和layout_hight例如。这些按屏幕尺寸缩放,以便根据屏幕尺寸得到相同的结果。

如果您使用画布,那么当您设置对象的高度和宽度时,请使用以下方法:

/**
 * get width or hight as density independent pixels and return the real 
 * amount of pixels requiered for the current screen
 * used to programaticlly set width and hight using dip
 * @param dip - the amount of dip
 * @param context - the activity used in
 * @return - return the real amount of pixels required for the current screen
 */
public static float getPixelsFromDip(float dip,Context context)
{
    //TODO move this to aplication class?
    return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dip, context.getResources().getDisplayMetrics()); 
}

另一种选择是计算最大屏幕尺寸,以及你需要它的前提

这是max size的方法:

/**
     * get maximum width and hight as dp avaliable in the screen
     * @param context
     * @return
     */
    public static float[] getMaxPixels(Context context)
    {
        //TODO move this to application class
        float result[]=new float[2];
        DisplayMetrics displayMetrics=context.getResources().getDisplayMetrics();
        float screenWidthInDp=displayMetrics.widthPixels/displayMetrics.density;
        float screenHeightInDp=displayMetrics.heightPixels/displayMetrics.density;
        result[0]=screenWidthInDp;
        result[1]=screenHeightInDp;
        return result;
    }

最后但并非最不重要的经验法则是:mdpi = 1,hdpi = 1.5且ldpi为0.75 因此,一旦获得一个屏幕尺寸的像素,您就可以乘以这些值,以获得另一个值的粗略估计值 享受。