使用ploygons定义点时,如何支持多个android屏幕大小

时间:2015-10-09 23:35:55

标签: android interface screen-resolution screen-size

我正在开发一种圆形的乐器,里面有音符。单击一个音符时会听到声音。但是我在为不同大小的Android设备缩放此问题时遇到了问题。

我正在使用的代码实际上不是可扩展的...如何更改此代码以使用引用多边形形状的坐标缩放代码到不同大小的设备.....

我有九种不同的乐器,每种都有很多音符,所以将每个音符映射到不同的屏幕分辨率是一场噩梦......

//测试点击点是否在定义的和弦

 `private boolean testIfFSharp6(int x, int y){
    boolean _retVal = false;
    if(resolutionType == "480X800"){
        int[] xPts = new int[] { 182,223,221,180,182};
        int[] yPts = new int[] { 172,172,215,214,172};
        _retVal = in_or_out_of_polygon(xPts, yPts, x, y); 

    }else if(resolutionType == "320X480"){
        int[] xPts = new int[] { 120,146,145,120,120};
        int[] yPts = new int[] { 116,116,146,142,116};
        _retVal = in_or_out_of_polygon(xPts, yPts, x, y); 
    }else if(resolutionType == "240X400"){
        int[] xPts = new int[] { 89,110,109,90,89 };
        int[] yPts = new int[] { 87,86,108,111,87};
        _retVal = in_or_out_of_polygon(xPts, yPts, x, y); 

    }else{
        int[] xPts = new int[] { 231,281,277,231,231 };
        int[] yPts = new int[] { 222,223,277,272,222};
        _retVal = in_or_out_of_polygon(xPts, yPts, x, y); 

    }
    return _retVal;
}`

Screenshot of instrument

Second screenshot of instrument

1 个答案:

答案 0 :(得分:0)

当您想要为所有类型的屏幕缩放时,这看起来像纯数学。我认为你应该使用设备上可用的总宽度和高度来代替硬编码。由于您的仪器是圆形的,您可以计算出仪器可用的半径/直径。

现在,由于仪器中有三个按钮(三个同心圆),您需要确定要分配给不同层的直径百分比。您可以在应用程序中进行硬编码。然后使用这些百分比进行所有其他计算,例如您首先需要弄清楚触摸点所在的同心圆的每次点击,然后在其中您将需要确定单击了哪个音符。

另外,当您创建音符时,您可以保存音符的中心和半径,这样一旦用户点击任何位置,您就可以确定触摸所在的圆圈,以便您可以播放相应的音符。 希望你明白这一点。

获取屏幕大小:Get screen dimensions in pixels

对于每个仪器,您必须首先确定几何图形并确定可用于实际构建这些仪器的参数(如上例的百分比)。

你可以做的是你可以有一个基础abstract class Instrument,然后你可以为每个乐器扩展基类,这些类将负责从可用的屏幕尺寸创建几何图形和注释参数你决定使用那种乐器。这样您就可以轻松添加新乐器并调整任何乐器所需的任何内容。

每个类都可以有一个处理点击的功能,可以找出根据几何图形点击的注释。

一些代码:

BaseInstrument上课:

public abstract class BaseInstrument {
Point size;
int noNotes;
Context context;

public BaseInstrument(Context context, Point size, int notes) {
    this.context = context;
    this.size = size;
    this.noNotes = notes;
}

public abstract void playNote(int clickX, int clickY);

public int getNotesSize() {
    return noNotes;
}

// you can add more methods which are common for all instruments
}

Instrument1上课:

public class Instrument1 extends BaseInstrument {

private static final int outerCirclePercentage = 40;
private static final int middleCirclePercentage = 30;
private static final int innerCirclePercentage = 30;
private static final int notes = 15; // some number

public Instrument1(Context context, Point p) {
    super(context, p, notes);

    // based on the geometry compute the positions and geometry of the notes for this intrument

}

@Override
public void playNote(int clickX, int clickY) {
    // do you calculation based on the geometry of the instrument
}

}