我一直试图弄明白该怎么做,我有屏幕的大小和我使用的模拟器的大小,如何更改大小以适合所有设备(包括平板电脑和手机)并正确定位它们,因为平板电脑上的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 :(得分: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 因此,一旦获得一个屏幕尺寸的像素,您就可以乘以这些值,以获得另一个值的粗略估计值 享受。