2015-01-07 55 views
0

我一直在想如何做到这一点,我有我使用的屏幕大小和模拟器的大小,如何更改大小以适合所有设备(包括平板电脑和手机)并将其正确放置,因为它们看起来像平板电脑上的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 请帮忙:(

+0

你使用图像视图吗?如果是这样,它简单的定义layout_width和layout_hight来使用dp值 –

+0

@Gabriel H我使用位图和画布,而不是图像视图。 – SpoocyCrep

+0

@SpoocyCrep我添加了一个答案检查它,希望它有帮助 –

回答

0

定位的像素将有所不同,因为有不同类型的设备w不同的DPI。

所以声明Imageview与widht,在dp的高度应该服务于你的问题。即将来临,它应该保持相对或通过重力。

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

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

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; 
     } 
    } 
+0

我不想使用imageview,只有位图并用画布绘制它 – SpoocyCrep

+0

@SpoocyCrep检查答案编辑 –

+0

我试过了,请检查编辑 – SpoocyCrep

0

为什么不能用百分比? 举例 - percent_x = device.widht/100; 并开始在这个位置绘制图像* percent_x? 在每个设备,如果应该看起来相似,但与streches。

+0

你能解释一下precent soultion吗 – SpoocyCrep

0

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

+0

我不明白如何处理precent,我不能在位图上使用DPI – SpoocyCrep

+0

当然你可以在位图上使用dp,float pixel = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp_zie,getResources()。getDisplayMetrics()); – Thinsky

+0

我试过了,请检查编辑 – SpoocyCrep

1

你不想做的是使用像素。除非您准备为不同的分辨率设备设置不同的值(通过在@dimen中指定值并将其覆盖为不同的大小),否则您最不可能做的就是使用dps来描述宽度/高度。

如果您大概知道屏幕宽度(或高度)有多大,您希望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屏幕宽度,您还可以使用重量。

其他解决方案(例如使用dp)已经被提及,但他们有点更多的参与,因为如上所述,您必须为不同的分辨率覆盖它们。

0

确定如果您使用xml布局,例如仅使用密度像素值“10dp”来定义layout_width和layout_hight。那些按照屏幕尺寸缩放,以便根据屏幕尺寸获得相同的结果。

,如果你使用的帆布那么当您设置了objecs的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()); 
} 

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

这里是最大尺寸的方法:

/** 
    * 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 您可以获得一个屏幕大小的像素,您可以乘以这些值以获得对其他 享受值的粗略估计。

+0

我试过了,请检查编辑 – SpoocyCrep